2009年3月3日星期二

Linux0.01分析笔记(3)

第七章
在Linux0.01内核中的include/linux/sched.h文件中,定义了进程的不同状态,
#define TASK_RUNNING 0 表示进程在"Ready List"中,这个进程除了CPU以外
,获得了所有的其他资源
#define TASK_INTERRUPTIBLE 1 进程在睡眠中,正在等待一个信号或者一个资源
#define TASK_UNINTERRUPTIBLE 2 进程等待一个资源,当前进程在“Wait Queue“
#define TASK_ZOMBIE 3 僵尸进程(没有父进程的子进程)
#define TASK_STOPPED 4 标识进程在被调试
进程控制表中的每一项都是一个task_struct结构,而task_struct结构中存储各种低级和高级的信息,包括从一些硬件设备的寄存器复制到进程的工作目录的链接点。
进程控制表既是一个数组,又是一个双向链表,同时又是一个树。其实现是一个包括多个指针的静态数组。此数组的长度NR_TASKS
#define NR_TASKS 64
#define HZ 100
数组中的结构则保存在系统预留的内存页中,定义如下:
#define FIRST_TASK task[0]
#define LAST_TASK task[NR_TASKS-1]
系统启动后,内核通常作为某一个进程的代表。一个指向task_struct的全局指针变量current用来记录正在运行的进程。变量current只能由kernel/sched.c中的进程调度改变。
内核线程在Linux2.0.0的核心中就可以被看到,例如在linux-2.0.1\linux\arch\alpha\kernel\entry.S中的代码。Linux系统使用系统调用fork()来创建一个进程,用exit()来结束一个进程。fork()和exit()的源程序保存在kernel/fork.c和kernel/exit.c中。fork()主要任务是初始化要创建进程的数据结构,其主要的步骤有:
(1)申请一个空闲的页面来保存task_struct。
(2)查找一个空的进程槽(find_empty_process())。
(3)为kernel_stack_page申请另一个空闲的内存页作为堆栈。
(4)将父进程的LDT表复制给子进程。
(5)复制父进程的内存映射信息。
(6)管理文件描述符和链接点。使用fork()创建一个进程后,程序的俩个复制都在运行。通常一个复制使用exec()调用系统的应用程序。
进程的调度(schedule()函数)
用户级线程(User-level threads) 是由与应用程序链接的线程库实现。核心不知道线程的
存在,也就不能独立调度这些线程了。
多任务系统可以划分为单处理器多任务系统和多处理器任务系统。
Linux0.01的核心进程源代码主要包括sched.c,fork.c,kill.c等。
sched.c是Linux的主要核心文件,它实现了Linux的进程调度功能,包括实现进程的各种状
态:睡眠(sleep_on),唤醒(wakeup),调度(schedule)等。
fork.c包含了实现系统调用fork()的辅助功能函数。
kill.c主要实现了系统调用kill(),kill()的作用主要是杀死一个进程。
system_call.s包含了系统的低级处理函数,主要都是一些汇编处理程序。

第八章
设备管理系统通常是设备驱动程序和操作系统的其余部分和应用程序的唯一接口。
设备管理系统需要实现如下的功能:
(1)隔离设备驱动程序和操作系统核心。
(2)隔离硬件和用户程序。
一般操作系统的设备管理程序具有如下特性:
(1)异步I/O(Asynchronous I/O)
(2)即插即用(Plug and Play)
在Unix下可以使用read()和write()来读和写设备,用ioctl()来对设备进行设置;而在Windows使用ReadFile()和WrintFile()来读和写设备,用DeviceIoControl()来对设备进行设置。
在Linux系统中俩种典型的情况:读RAMDISK和读IDE设备。
对于read请求,如果read一个RAMDISK,典型的过程如下:
(1)从RAMDISK内存空间复制内存到用户空间(user space)。
(2)结束调用,返回用户空间。
一个IDE驱动程序,典型的read处理过程如下:
(1)接受一个read请求,然后把这个请求放到I/O队列中。
(2)如果I/O队列为空,将这个读写磁盘扇区的请求发送到磁盘驱动器。
(3)将调用read系统调用的进程切换为SLEEP状态。
(4)当磁盘驱动器完成磁盘扇区读操作后,会发出一个中断。IDE驱动程序接收到这个中断后,把读出的数据从磁盘控制器传送到核心的buffer中,然后把数据复制到用户空间,接下来唤醒调用进程。
(5)当调用浚进程被唤醒时,系统的控制权回到用户空间的用户进程。
CPU的内部中断又可以叫异常,异常的主要作用是报告一些程序运行中的错误和处理缺页中断(page_fault)。这些异常都是通过set_trap_gate宏来设置的。set_trap_gate宏是定义在include/asm/system.h文件中的一个宏,被用来设置CPU的trap,起定义如下:
#define set_trap_gate(n,addr) \
_set_gate(&idt[n],15,0,addr)
在Linux0.01中,中断处理主要做了俩个部分的工作:
(1)trap.s将各个CPU的trap信息填入到idt中;
(2)asm.s处理当出现trap的时候后续的一系列处理。
在Linux0.01中处理的外部中断有时钟中断(0x20),串行通信口中断(0x23和0x24),硬盘中断(0x2e),键盘中断(0x21),这些中断具体的处理函数在文件rs_io.s,hd.c和keyboard.s中。
如果多个设备共享一个中断,那么每当一个设备产生一个中断时,CPU会执行所有的isr中断服务程序。具体的一个完整的中断产生和处理流程是:
(1)产生中断
(2)CPU应答
(3)查找idt中的对应向量
(4)在gdt中查找idt项的代码段
(5)对比当前的cpl和描述符的dpl看是否产生越级保护
(6)检查是否发生特权级的变化,如果是就保存ss和esp,否则不保存
(7)保存eflags,cs,eip和错误码
(8)将idt对应描述地址装入cs和eip中以便执行
(9)执行irp_interup
(10)执行do_irp
(11)循环执行isr
(12)中断返回。
trap.c处理了硬件中断和运行中可能产生的错误。
asm.s包含了处理低级硬件错误的代码,asm.s也使用TS位来处理协处理器错误。
ISR(Interrupt Service Routine,ISR),中断处理程序。
x86体系结构是一个中断驱动的系统,外部发生的事件总是通过中断服务程序来进行处理。
在x86体系结构中,中断处理程序的入口地址是保留在系统的IDT(Interrupt Descriptor Table,中断描述表)中的。
中断处理程序和普通程序的区别是:中断处理程序必须非常简单,而且需要处理CPU的状态
。ISR在结束时,都必须调用"Interrupt Return(IRET)",而普通应用程序在结束时调用的是"Return (RET)"或者"Far Return(RETF)"。
BIOS数据区提供了大量的硬件设备信息,通过读取BIOS的数据,可以方便地了解计算机的硬件设备情况。
在IMB AT和IBMPS/2键盘系统中,CPU并不直接和键盘进行通信,而是通过一个8042芯片或者其他与之兼容的芯片。键盘本身也有自己的芯片(Intel8084及其兼容芯片)。
console.c主要实现了控制台功能,包含con_init()和con_write()函数。
serial.c实现了rs232串口通信功能,主要函数是:rs_write(),rs_init()以及相关的中断功能。

第九章
Linux系统继承了Unix中"everything is a file"的思想,使用文件系统接口,从而可以控
制Linux系统中的所有设备。通过引入VFS(Virtual File System)的概念,可以使Linux文件系统的主要部分和具体的物理文件系统类型无关。
对硬盘进行访问的基础是对硬盘的磁盘扇区进行寻址。通常,对于硬盘的寻址使用CHS(Cylinder/Head/Sector)参数。CHS就是使用柱面数(Cylinders),磁头数(Heads),和扇区数(Sectors per track)来定位硬盘驱动器任何一个扇区的方法。
Cylinders表示硬盘每一面盘片上有几条磁道,最大为1024(用10个二进制位存储).
Heads表示硬盘总共有几个磁头,也就是有几面磁片,最大为256(用8个二进制位存储)。
Sectors per track表示每一条磁道上有几个扇区,最大为63(用6个二进制位存储)。
每一个扇区一般是512B所以磁盘最大容量为
256*1024*63*512/1048576=8064GB (1M=1048576B)
BIOS INT 13h调用是BIOS提供的磁盘基本输入输出中断调用,它可以完成磁盘(包括硬盘和软盘)的复位,读写,校验,定位,诊断,格式化等功能。它使用的就是CHS寻址方式,因此最大能访问8GB左右的硬盘。
典型的扇区存放形式:
扇区在磁道上连续存放;带磁盘内部Cache的现代磁盘。
Unix文件系统结构
Boot block |Super block |Inode table...........|Data block zone
引导块(Boot block)通常位于文件卷最开始的第一扇区,这512B是文件系统的引导代码,为根文件系统所特有,其他文件系统中这512B为空。
超级块(Sper block)紧跟引导块之后,用于描述文件系统的结构,如i节点长度,文件系统大小等信息。
i节点表(Inode table)存放在超级块之后,其长度由超级块中i节点长度字段决定,起作用是用来描述文件的属性,长度,属主,属组,数据块表等信息。
数据区(Data block zone)跟在i节点表后面,用于存放文件的数据。
在Unix系统中,一个普通的文件通常由俩部分组成:i节点+数据块
用fsck可以修正文件系统的不一致。
fsck - check and repair a Linux file system
日志文件系统(Log-Structured File System)的设计思想是跟踪文件系统的变化而不是文件系统的内容,所有对文件系统的更新都被记录在日志中。
Linux文件系统其实可以分为三个部分,第一部分叫VFS。这是Linux文件系统对外的接口,
任何要使用文件系统的程序都必须经由这层接口来使用它。另外俩部分属于文件系统的内部,其中一个是Cache,另一个就是真正最底层的文件系统,像Ext2,FAT之类的。
在文件系统里的每一个文件,系统都给它一个inode,只要inode不一样,就表示这俩个文件不相同,inode是由VFS定义的。
一个硬盘最多可以有8个分区(partition),其中4个是主分区(Primary partition),另4个则是扩展分区(extended partition)。除了分区,硬盘第一个扇区称为MBR(Master Boot Record,主启动录)。
文件系统的一些过程:
创建一个文件,其步骤如下:
(1)分配和初始化inode
(2)将inode和文件名的对应关系写入到文件目录表项中(通常在当前的工作目录)
(3)将上述数据写入磁盘。
修改一个磁盘文件,起步骤如下:
(1)将此文件的inode装载到内存中
(2)分配空闲的磁盘块(将这些磁盘块在freelist中标记为已经分配)
(3)修改这个文件的inode,指向这个新分配的磁盘块
(4)将用户的数据写入这个磁盘块
(5)将这个文件所有的修改都写入磁盘。
删除一个磁盘文件,其步骤如下:
(1)将此文件的inode装载到内存中。
(2)依据inode数据查找到将要删除的数据所在的磁盘块
(3)标记这个磁盘块为空闲
(4)将这个文件所有的修改都写入磁盘。
在系统启动时,只执行一次的函数sys_setup读取所有的IDE硬盘上的分区表。在kernel/hd.c源程序中包含对各种IDE接口的驱动代码。此外rw_hd()函数完成了从各种IDE设备上读取
和写入数据块的功能。
在Linux0.01的文件系统中hd.c()代码演示了从IDE设备上读取和写入数据块,而fs/block_dev.c中包含了对块设备文件系统的具体支持。
kernel/hd.c处理IDE中断和数据块写入,读出队列
fs/block_dev.c使用hd.c中提供的功能,例如:block_write()来向硬件驱动器中写入或者读出数据
fs/read_write.c中包含了sys_read(),sys_write(),and sys_lseek()的代码。
super.c文件中包含了Linux0.01的文件系统处理超级块表(super-block tables)的功能。
read_write.c文件包含了Linux0.01文件系统中对字符设备和块设备的读操作和写操作的实现过程。
open.c包含了Linux0.01中打开文件的操作过程。
inode.c包含了Linux0.01中对文件系统inode表的维护过程。
buffer.c实现了文件系统中的缓冲功能。
bitmap.c包含了处理文件系统中inode和文件系统中位图的功能。

Linux0.01分析笔记(2)

第四章
在过去写过了,所以就不在重复了!请看

第五章
格式化的作用是在磁盘上划分不同的区域来存储不同的数据。
磁盘经过格式化后主要包括的区域有:主引导记录区(只有硬盘有),引导记录区,文件分配表(FAT),目录区和数据区。
1988年,国际标准化组织(International Standards Organization,ISO)公布了CD-ROM文
件结构标准,这个标准被称之为ISO 9660。
CD-ROM盘上可以存放信息的区域称为卷空间(volume space).卷空间分成俩个区:从LSN0~LSN16称为系统区,它的具体内容没有规定;从LSN16开始到最后一个逻辑扇区称为数据区,它用来记录卷描述符(volume descriptors),文件目录,路径表,文件数据等内容。
可启动CD-ROM的工作原理:BIOS首先检查光盘的第17个扇区(sector 17),查找其中的代码,若发现其中的启动记录卷描述表(Boot Record Volume Descripter),就根据表中的地址继续查找启动目录(Booting Catalog),找到启动目录后,再根据其中描述的启动入口(Boot Entry)找到相应的启动磁盘镜像(Bootable Disk Image)或启动引导文件,找到启动磁盘镜像后,读取其中的数据,并执行相应的开机动作。相对于单重启动CD-ROM而言,多数启动CD-ROM的启动目录中包含多个启动入口,指向多个启动磁盘镜像。《Bootable CD-ROM Format Specification》
下面是在LA32架构的系统引导过程。
1.硬盘启动步骤
PC机启动过程是遵循一定顺序的,过程如下:
(1)机器加电
(2)BIOS加电自检(Power On Self Test - POST)。BIOS在内存中的起始地址为0FFFF:0000,
BIOS的加电自检就是从地址0FFFF:0000开始执行。BIOS加电自检的主要工作包括:CPU,内存及硬盘等关键设备的检测,即插即用设备的检测。完成这些检查后,将依据结果更新ESCD(Extended System Configuration Data,扩展系统配置数据).
(3)计算机将硬盘0柱面0磁头1扇区(主引导区MBR)中的512B读入内存0000:7C00处并跳到0000:7C00处执行;在读取过程中,计算机并不检查该扇区的内容是什么。
(4)检查(WORD)0000:7DEE是否等于0xAA55,若不等于则转去其他启动介质,如果没有其他启动介质则显示“No ROM BASIC“,然后死机。
(5)跳转到0000:7C00处执行MBR中的程序。
(6)MBR首先将自己复制到0000:0600处,然后继续执行。
(7)MBR在主分区表中搜索标志活动的分区,如果发现没有活动分区或有不止一个活动分区,则停止。
(8)将活动分区的第一个扇区读入内存地址0000:7C00处。
(9)检查(WORD)0000:7DFE是否等于0xAA55,若不等于则显示"Missing Operationing System"然后停止,或者尝试软盘启动。
(10)跳转到0000:7C00处继续执行特定系统的启动程序。
(11)启动系统。
而软盘启动而(1)(2)(3)(4)(5)同上(6)是启动系统。
硬盘主引导扇区基本结构
主引导扇区是硬盘的第一个扇区,它由主引导记录(MBR,Master Boot Record),硬盘分区表
(DPT,Disk Partiton Table)和引导扇区标识(Boot Record ID)三部分组成。
硬盘的一个扇区是512B。主引导记录占用主引导扇区的前446B(字节编号是0~0x1BD)存放系统主引导程序(它负责从活动分区中转载并运行操作系统引导程序)。
硬盘分区表占64B(字节编号0x1BE~0x1FD),记录了磁盘的基本分区信息。硬盘分区表分为4个分区项,每一项16B,分别记录了每个主分区的信息(一个硬盘因此最多可以有4个主分区)。
引导扇区标识占用俩个字节(字节序号是从0x1FE~0x1FF)。对于合法引导区,这个标识为0xAA55。这通常计算机判断引导扇区是否合法的标志。
主引导记录中包含了硬盘的一系列参数和一段引导程序。引导程序主要是用来在系统硬件自
检完后引导具有激活标志分区上的操作系统,它最后执行的指令是一条JMP指令,这条指令使计算机可以跳转执行操作系统本身的引导程序。
DOS命令fdisk /mbr可以修复这段程序。
在Linux系统中可以执行如下的命令来恢复MBR:
dd if=/dev/hda of=/boot/boot.NNNN bs=446 count=1 #备份MBR
dd if=/boot/boot.NNNN of=/dev/hda bs=446 count=1 #恢复MBR
硬盘主引导扇区的应用
1.清除硬盘引导功能
2.加密整个磁盘
3.加密单个硬盘分区
4.加入硬盘启动口令识别
5.先于DOS驻留内存程序
6.实现同一硬盘多个操作系统的选择启动
7.实现硬盘主引导扇区或DOS引导扇区的自我修复
Linux0.01的引导部分主要包括俩个源文件:boot.s和head.s。boot.s是计算机上电启动时,由BIOS执行的系统引导代码。head.s是Linux的32位引导代码,在其中将调用main(),最后完成操作系统的引导。
1.boot.s:BIOS引导代码
在计算机加电时,boot.s被BIOS的引导程序加载到地址0x7C00处,然后boot.s将自己移动>到地址0x90000处,然后跳转到地址0x90000处开始执行。然后,boot.s使用BIOS中断功能,加载系统核心到地址0x10000处。接下来,boot.s禁止所有中断,移动系统核心到地址0x0000处,切换处理器到保护模式,然后调用系统的开始程序。系统核心开始运行后,将重新设置保护模式,然后打开需要的中断。
2.head.s:Linux的32位引导代码
这段代码被加载到地址0x00000000处开始运行。地址0x00000000也是系统页表的地址,当系统完成引导后,这段地址将被系统页表重新覆盖使用。
gcc -c my_kernel.c
"-c"开关告诉GCC只是编译成为一个目标文件而不是链接。然后,可以使用如下的命令链接核心,并且设定核心转载的地址为0x100000:
ld my_kernel.o -o kernel.bin -oformat binary -Ttext 0x100000
用“-oformat binary"开关来运行ld告诉链接器输出文件是plain的,没有重定向,没有头信息,只是一个glat的二进制镜像。
“-Ttext 0x100000"告诉链接器用户想要的"text"(代码段)地址在0x100000的内存标记处。
引导代码必须遵循如下的规则:
(1)BIOS会把引导程序装载到固定地址07C00h。因此,引导程序的段地址和飘移地址是固定的。
(2)引导代码必须编译成为plain binary file类型。
(3)plain binary file的尺寸必须是512B(512B是一个扇区的大小)
(4)文件必须以0xAA55h标志结果。
"times 510-($-$$)db 0"代码是一句只有nasm能够理解的代码。
“二次转载”是指:由BIOS从磁盘上装入引导扇区(0头0磁道1扇区)到内存地址07C0:0000,>并跳转到该地址执行;再由从07C0:0000地址开始的引导代码把存放在其他扇区中的程序转
入内存,并跳转到该程序中执行。

第六章
连续分配存储管理方式分为:单一连续分配,固定分区分配和动态分区分配。
虚存提供的功能:扩大地址空间,内存保护,内存映射,公平分配内存,虚存共享。
Inter-Process Communication,IPC 进程间的通信机制
虚拟存储器基本特征是:虚拟扩充,部分装入,离散分配,多次对换。
虚存中的置换算法:先进先出算法(FIFO),最佳置换算法(OPT),最近最少使用置换算法(LRU),最近未使用置换算法(NUR)。
非连续存储管理机制中主要包括:页式管理,段式管理和段页式管理。
任何一个物理地址都可以映射为:段地址+段内偏移。
操作系统必须知道系统物理内存的容量,才能够有效地使用和管理这些物理内存。在CPU处于实模式时,CPU可以访问的物理内存最大只能达到1MB+64KB(在A20 Gate被打开的情况下,否则最大只能访问1MB)。因此,在实模式下通常无法直接通过内存访问来获取内存容量。
可以通过BIOS的15h中断从计算机的CMOS中读取计算机的物理内存的大小,并把这个数据保留在操作系统核心中。BIOS INT15h中断提供了三个子中断来获得系统的物理内存大小,分别是88和E801h和E820h。
malloc()函数作用是从一大块内存中分配出所需要的空间。在分配时需要注意,要留出一部分malloc()不能分配的内核空间(为了便于存储保护,内核地址空间和用户地址空间是相互隔开的)以备内核使用。
内核malloc()函数已经具备了存储分配功能,但是还不具备虚拟存储功能,通过缺页处理来实现虚拟存储管理。
可执行文件的头信息格式有许多标准,例如:coff,elf和pe格式等。
在malloc()函数实现中使用了首次适配方法来进行存储分配。当使用free()函数释放内存时,会对相邻的存储空间进行合并。
page.s是一段汇编语言程序,提供了Linux0.01中缺页异常处理功能。page.s仅仅提供了和
硬件存储管理器的接口功能,大部分功能代码在memory.c文件中。

Linux0.01分析笔记(1)

我是对我读的那本书作的笔记,以后会添加自己的分析。
第一章
我过去也看过这本书,但是很多没有理解,有很多忘记了,故今天又重新看,而且把笔记写下!
GUN的主要精神是软件源代码应该自由流通!
GUN是GUN‘s Not Unix的缩写,是由自由软件基金会(Free Software Foundation,FSF)的董事长Richard M.Stallman(RMS)于1984年发起的。GUN制定了GPL(The General Public License,GUN通用公共准许证)
自由软件的自由包括:使用的自由(可以不受任何限制来使用软件),研究的自由(可以研究软件运作方式并使其合适个人需要),散布的自由(可以自由地复制此软件散布给他人),改良的自由(可以自行改良软件并散布改良后的版本以使全体用户受益)。
1991年8月,一位来自芬兰赫尔辛基大学的年轻人Linus Benedict Torvalds,对外发布了一套全新的操作系统Linux
黑客是指计算机技术上的行家或热衷于解决问题,克服限制的人。黑客乐意解决和发现新问题,并乐意相互帮助。他们相信计算机中充满各种各样有趣的问题,并且这些问题一旦被自己解决,他们愿意让解决方法被所有人共享。他们感觉发现问题,解决问题,共享答案的过程是有趣的,并着迷地去做。他们将解决问题视为乐趣,相信技术应该是自由的,应该被所有人共享。黑客是对拥有高科技和崇高理念的孜孜不倦的计算机爱好者,工作者的尊称。

第二章
现代操作系统都具有:并发,共享,虚拟,异步的特性,同时还具有:存储器管理,处理器管理,设备管理,文件管理,用户接口。
Run_Time Library,RTL,运行时函数库。
Bochs是一个x86 PC的模拟器。
Wine/DOSEmu是先把把原有系统的应用软件通过他们把原操作系统API,那些软件,再经过模拟操作系统的API,成为模拟操作系统应用软件。
软件的美在于它的功能,在于它的内部结构。对用户来说,通过直观,简单的界面呈现出具有恰当特性的程序就是美。对于软件设计者来说,被简单,直观地分割,并具有最小内部耦合的软件结构就是美!

第三章
DJGPP是DOS下的自由源代码的保护模式C语言编译器。
还有RHIDE是DJGPP的图形界面。

学make和ld还有nasm

Dos下一个汇编程序
;---------------------------------------------------------------------
.model small
.stack 100h
.data
Welcome db 13,10,'Hell,world!',13,10,'$'

.code
start:
mov ax,@data
mov ds,ax
lea dx,welcome
mov ah,9
int 21h

; end the program
mov ah,4ch
int 21h
end start
;--------------------------------------------------------------------
用masm hello.asm
link hello.obj就可以了。
Linux下和它下面一样功能的程序
section .text
global main
main:
mov eax,4 ;4号调用
mov ebx,1 ;ebx送1表示stdout
mov ecx,msg ;字符串的首地址送入ecx
mov edx,14 ;字符串的长度送入edx
int 80h ;输出字串
mov eax,1 ;1号调用
int 80h ;结束
msg:
db"Hello World!",0ah,0dh
用下面的命令就可以了!
[gaowei@localhost nasm]$ nasm -f elf hello.asm
[gaowei@localhost nasm]$ ls
hello.asm hello.o
[gaowei@localhost nasm]$ gcc -o hello hello.o
[gaowei@localhost nasm]$ ls
hello hello.asm hello.o
[gaowei@localhost nasm]$ ./hello
Hello World!
为了辨别CPU的类型,需要使用CPUID汇编指令(CPUID是一个特殊的汇编指令,其机器0FHA2H。如果编译器不支持CPUID指令,可以直接输入CPUID的机器码)。该指令可以被以下CPU识别:Intel 486以上的CPU。Cyrix M1以上的CPU。AMD Am468以上的CPU。
1.判断CPU的厂商
通过CPUID汇编指令,返回CPU OEM字符串,从而判断CPU厂商,规则如下:
先让EAX=0,再调用CPUID。
Inel的CPU将返回:
EBX:756E6547H 'Genu'
EDX:49656E69H 'ineI'
ECX:6C65746EH 'ntel'
EBX,EDX,ECX连接起来是"GenuineIntel",含义为真正的Intel。
Cyrix的CPU将返回:
ENX:43797269H
EDX:78496E73H
ECX:74656164H
"CyrixInstead","Cyrix来代替"
AMD的CPU将返回:
EBX:41757468H
EDX:656E7469H
ECX:63414D44H
"AuthenticAMD",可信的AMD。
2.判断CPU类型
先让EAX=1,再调用CPUID,EAX的8~11位就表明CPU类型。例如:
3-368
4-468
5-Pentium
6-Pentium Pro Pentium II
2-Dual Processors
EDX的第0位:代表有无FPU。
EDX的第23位:CPU是否支持IA MMX,这点很重要,如果想用57条新增的指令,要先检查这一
位,否则Windows就会出现“该程序执行了非法指令,将被关闭”。
3.专门检测是否P6架构
先让EAX=1,再调用CPUID,如果AL=1,就是Pentium Pro或Pentium II。
4.专门检测AMD的CPU信息
先让EAX=80000001H,在调用CPUID,如果EAX=51H,就是AMD K5;如果EAX=66H,则是K6。
EDX第0位:是否有FPU。
EDX第23位:CPU是否支持MMX。
在PC中,彩色显示器的字符屏幕显存起始地址在0xB8000000处,单色显示器的视频缓冲区起
始地址在0xB8000000处。

2009年2月28日星期六

今年&GSOC

今年,似乎要比较忙,而且四级也要好好的学(主要是要学好英语,我还想学好口语但是目前还不知道要报那个班呢?)四级考了俩次没有过也够丢人的了!——一定要学好英语!
还有想和王老师学那个关于代码分享的事情,应该是有点难度的,可以提高自己的C语言水平吧!还是比较喜欢C语言的。我还想和我们小组的一个高手(莫楠)学关于web服务器方面的知识,那就更加的要努力了!
还有,(还有啊!那是!)把我过去和我们小组一起干的没有干好的我想再干,我不是一个半途而废的人,作就要把它作好,我慢但是我会坚持的!那些不能让他们成为垃圾啊!至少要他们成为可以用的软件为大家提供便利吧!
还有呢?就是GSOC了,昨天还和我去年的那个导师聊天,他问我参加今年的吗?我当然是肯定的答复了。既然想参加就要好好的准备了,不能向去年一样,没有很好的了解还有就是没有比别人更加的勤奋了,没有别人想的多没有和更多的交流。把去年的不足今年就要补上而且比去年更加的好!不断的提高自己。相信自己!
现在,不奋斗什么时候奋斗呢?

虚拟机


(1)我最早用的是vmware - Intel(TM) x86(TM)-compatible virtual machine
The vmware command starts an Intel or AMD X86-compatible or
x86-64-compatible virtual machine. Depending upon your hardware con-
figuration, you can run a number of virtual machines simultaneously.
具体可以看http://www.vmware.com/support
一个可以用的序列号N1HPX-6U248-D206Y-4Y8Z6

(2)由于我要学windows下的汇编语言,但是我没有装windows所以我要在Linux中完成这个
学习就用了dosbox - an x86/DOS emulator with sound/graphics
This manual page briefly documents dosbox, an x86/DOS emulator.
The optional file argument should be a DOS executable or a direc-
tory. If it is a dos executable (.com .exe .bat) the program will run automatically. If it is a directory, a DOS session will run with the directory mounted as C:\. For an introduction type INTRO inside dosbox.
要挂载用Usage MOUNT Drive-Letter Local-Directory比如说用mount c /home/gaowei意思
是把/home/gaowei 挂载到C盘了,你可以用dos的命令来看你挂载的目录了


(3)可以模拟windows下的软件的Linux下的软件是wine
Wine is a program which allows running Microsoft Windows programs
(including DOS, Windows 3.x and Win32 executables) on Unix. It
consists of a program loader which loads and executes a Microsoft Windows binary, and a library (called Winelib) that implements Window API calls using their Unix or X11 equivalents. The library may also be used for porting Win32 code into native Unix executables.
Wine is free software, released under the GNU LGPL; see the file LICENSE for the details.
http://www.winehq.org/

(4)有一段时间我用Sun xVM VirtualBox Graphical User Interface 2.0.6
2009年 02月 07日 星期六 21:18:17 CST
(C) 2005-2008 Sun Microsystems, Inc.
All rights reserved.
Usage:
-startvm start a VM by specifying its UUID or name
-rmode sdl|image select different render mode (default is sdl) http://www.virtualbox.org

(5)最近,看了一本书,书中要用到bochs - Portable x86 Emulator.
Bochs is a portable Intel Architecture 32 (x86) emulator that runs
on most popular operating systems. Inside the emulator, it can run many operating systems including Linux and Microsoft(R) Win-dows(R).
http://bochs.sourceforge.net

我读Linux0.01

这是我过去写的,而且我还写了很多,以后将会把其他的发表!
今天,再次看Linux 0.0.1内核分析与操作系统设计——创造你自己的操作系统
感觉很不错的一本书,但是就是里面很多是在windows下完成的,但是我想那样也不会影响我对Linux的喜爱和坚持使用Linux而学习它,主要是学习她里面的思想。
把操作系统的原理学习清楚,把自己的想法添加进去,学习就要学会她!
她 主要写了关于GUN/Linux的历史,还有Bochs这个工具,当然你也可以学到GUN的很多的工具,如:GCC,MAKE,GDB,等!操作系统的设 计基础;Linux0.0.1内核简介;操作系统的引导;存储管理分析;进程管理和调度;磁盘文件系统;shell编程技术和实例;系统调用和C语言库的 实现;Linux网络实现分析。
一定要好好的学习!我相信我自己!

Linux0.0.1支持的硬件平台:
Intel 386以上CPU VGA/EGA显示器 标准IDE接口硬盘 支持芬兰键盘布局
如果希望修改为其他键盘布局,可以对kernel/keyboard.s文件进行修改。

Linux 充分地发挥了Intel80386芯片的功能。系统中的函数调用不使用消息传送机制而是直接函数调用;多线程的文件系统(虽然实现比较复杂但是性能更 好);精简的任务切换;中断是不隐藏的(中断处理的代码主要是汇编代码,设备驱动程序主要是中断例程,可参见kernel/hd.c);核心处理、文件系 统、存储管理没有严格地分离。
原则是:运行得更快
核心设计特点:所有的任务只有一个数据结构。在Linux 0.0.1的实现中,任务信息存放在不同的地方;既支持分页机制也支持分段机制的一个非常简单的存储管理机制;在Linux 0.0.1中的mm目录中memory.c和page.s

在Linux0.0.1 中,存储管理(memory management)是最简单的模块之一。在存储管理的模块中包含了一些函数的入口,这些函数是在kernel模块中实现的。系统的其他部分对存储管理 机制是透明的。一种避免多线程竞争资源的方法是一个进程运行时将所需要的资源全部获得,但是这样系统的资源利用效率较低,也可能带来一些不必要的等待。为 了提高文件系统的性能,Linux实现文件系统的访问时不锁定任何的数据结构(除非实际的读或者写物理设备)采用双检查分配(fs/buffer.c和 fs/inode.c都进行资源分配检查)来避免任何时候可能出现的条件竞争。一个进程陷入核心态时是不会被核心切换的。所有的核心功能,文件系统,存储 管理操作都是原子性的(atomic)。
硬件依赖性代码大多定义在文件"include/linux/config.h"中。
Linux0.0.1的核心源文件分布在几个子目录中,总共包含5900行左右的ANSI C源代码、2500行左右的C头文件代码和约1450行左右的Intel 80386汇编语言代码。
--------------------------------------------------------------------------------
boot 核心引导代码(kernel bootstrap code)
fs 文件系统(file system)
include 头文件(header files)
init Init进程,Linux系统中执行的第一个进程(init procss-the first process exec _uted by a UNIX system)
kernel 系统调用(system calls)
lib 库代码(library code)
mm 内存管理(memory management)
tools 内核引导文件的制作工具(program that splices three images together into a kernel image that can be booted from PC BIOS starup)

太极拳

有好东西就和大家分享! 啊哈!!!

关于太极拳,我这个寒假每天早上都和老头们学太极拳,可是我们学的太极拳和平时咱们见到的是不太一样的。几乎是没有固定的招式,但是它里面的每一招都蕴含了太极拳的精髓,而且是很实用的那种,是强身健体的那种而且有很多是可以防卫等等!感觉很不错!用我舍友的话说是挺神奇的!
我现在每天晚上也在“玩” 这个,你也许会看到我,每天晚上的十点左右在操场上,“发疯”的那个人便是我了,想相互切磋的,想学的,我很欢迎,一起练习吧!现在感觉那个真的很好“玩”
我就把一些心得和大家分享吧!
防守,攻打,拳种。打不过的时候记得要躲开才是,利用别人的缺点打击他,要灵活,要快,要准,打手要三个部位,(肘,肩,腕)。变化,来源于平时的练习,基本功一定要扎实。学任何东西也是一样的,没有扎实的基本功是很难成就一番事业的。
一动全身动,起与脚,动于腰,发于手。
放松,一定要学会放松,以静制动,内力(爆发力),使得自己的思维发散。
学习学无形有时会胜于有形的,没有固定招数,但是理念是很关键的,每一种学习,最重要的是学习他的华和他的理念,他的思维方式。
干一件事情就要把他干好,这才是很重要的。
中国文化博大精深是世界公认的,而不是所谓的现代科学所能解释清的,希望大家好好感悟!
禪密心咒
啊 鲁 披 折 那 抡

阿 嘛 昵 叭 弥 吽
下面的是我的一个师傅让我抄的,当然网上可以搜索到很多的相关的知识!

太极拳论 王宗岳
太极者,无极而生,阴阳之母也。动之则分,静之则合。无过不及,随曲就>伸 。人刚我柔谓之走,我顺人背谓之粘。动急则急应,动缓则缓随。虽变化万端, 而理>为一贯。由招熟而渐悟懂劲,由懂劲而阶及神明。然非用力日久,不能豁 然贯通焉。虚灵顶劲,气沉丹田。不偏不倚,忽隐忽现。左重则左虚,右重则 右杳。仰之则弥高,府之则弥深,进之则愈长,退之则愈促。一羽不能加,蝇 虫不能落,人不知我,我独知人。英雄所向无敌,盖皆由此而及也。斯技旁门 甚多,虽势有区别,概不外,壮欺弱,慢让快耳。有力打无力,手慢让手快, 是皆先天自然之能,非关学力而有为也。察四两拨千斤之句,显非力胜;观耄 耋御众之形,快何能为。立如秤准,活如车轮,偏沉则随,双重则滞。每见数 年纯功,不能运化者,率皆自为人制,双重之病未悟而。欲避此病,须知阴阳; 粘>即是走,走即是粘,阳不离阴,阴不离阳;阴阳相济,方为懂劲。懂劲后, 愈练愈精,默识揣摩,渐至从心所欲。本是舍己从人,多误舍近求远。所谓差 之毫厘,谬之千里。学者
不可不详辨焉。是为论。

十三势歌
清乾隆年间山右王宗岳

一名长拳,一名十三势。长拳者,如长江大海,滔滔不绝也。十三势者,掤、 捋、挤、按、采、挒、肘、靠。进、退、顾、盼、定也。掤、捋、挤、按、即 坎、离 震、兑,四正方也。采、挒、肘、靠,即乾、坤、良、巽,四斜角也。 此八卦也。进步、退步 左顾、右盼、中定,即金、木、水、火、土也。此五 行也。合而言之,曰十三势。

十三总势莫轻视。命意源头在腰际。
变转虚实须留意。气遍身躯不少滞。
静中触动动犹静。因敌变化示神奇。
势势存心揆用意。得来不觉费功夫。
刻刻留意在腰间。腹内松静气腾然。
尾闾中正神贯顶。满身轻利顶头悬。
仔细留心向推求。屈伸开合听自由。
入门引路须口授。功夫无息法自修。
若言体用何为准。意气君来骨肉臣。
想推用意终何在。益寿延年不老春。
歌兮歌兮百四十。字字真切意无遗。

太极拳总论 陈鑫
纯阴无阳是软手,纯阳无阴是硬手。
一阴九阳根头棍,二阴八阳是散手,
三阴七阳犹觉硬,四阴六阳显好手,
惟有五阴并五阳,阴阳无偏称妙手。
妙手一看一太极,空空迎化归乌有。

身法八要

身 法八要相传为武派太极拳创始人武禹襄所建立,即含胸、拔背、裹裆、护肫、提顶、>吊裆、松肩、沉肘,后人又在这八条基础上加入腾挪、闪战。武禹襄之 甥李经纶亦从其修>习太极拳,李将舅舅所传编成一首七言歌诀,同样名为《身法八要》,云:提顶吊裆心中>悬,松肩沈肘气丹田;裹裆护肫须下 势,含胸拔背落自然。

time