-intel x86cpu寻址方式2007年08月03日 星期五 12:231.cpu的位数,如16位或32位,是指处理器中“算术逻辑单元(alu)”的宽度。通常,系统总线中的数据部分(数据总线),与alu具有相同的宽度(但也有例外)。
2.intel采用分段方法进行寻址,且对于段寄存器的访问指令不属于特权级,因此,称其为“实地址模式”。
3.80386的段式内存管理机制
  cpu中增设两个寄存器:全局段描述表寄存器gdtr(global descriptor table register)和局部段描述表寄器ldtr(local descriptor table register)。访问这两个寄存器的指令被设计成为特权指令。
段寄存器的高13位被用作访问段描述表的偏移量,与gdtr或ldtr相加得到描述表项的起始地址。
4.80386页式内存管理机制
  段式内存管理存在灵活性和效率性的缺陷,而页式内存管理可以解决弥补。本来页式管理与段式管理没有从属关系,但是由于intel x86 cpu需要在段式管理中保存访问权限的信息,故只能在段式管理基础上加上页式管理。
  页式管理的一个线性地址由目录(b31-b22),页表(b21-b12),偏移量(b11-b0)组成。其中目录中的值加上页面目录基址寄存器cr3寻址目录中的页面描述符,从目录描述符中再读取页表的基址加上线性地址中的偏移量形成最终的地址,到实际内存页面中去寻找地址。
  另外,由于页面大小为4kbyte,所以目录和页表中的地址低12位都为0。这12位可用于进行控制相关。
 
linux内核源代码情景分析读书笔记(2)-linux内核中的c语言2007年08月04日 星期六 16:20  对于linux中的c,采用gcc编译器进行编译,其内核源代码的编译也依赖相应的gcc版本。

  由于内核中需要大量的使用双链表,因此将双链表数据结构抽象出来,成为list_head结构体。对于这样的问题,内核源代码采用的方法如下:
  利用宏container_of(ptr,type,member) ({
  const typeof( ((type *)0)->member) * __mptr = (ptr);
        (type *)( (char *)__mptr - offsetof(type,member));})

  其中ptr表示list成员指针,type表示宿主结构体类型,member表示宿主中list成员变量名。

 
linux内核源代码情景分析读书笔记(3)-linux内核中的汇编语言2007年08月04日 星期六 22:211. 在linux的内核底层中的代码,多数是以汇编语言完成的。 
  汇编代码以两种形式存在,一种是纯汇编代码,后缀名为.s的文件。当然这样的汇编代码其中也加入了预编译选项,而不是单纯的汇编。另一种是在c语言中嵌入汇编语言。虽然在ansi的c语言标准中并没有关于汇编片段的规定,但事实上各种实际使用的c编译中都作了这方面的扩充。gnu的c编译器gcc也在这方面作了很强的扩充。
  gnu的c编译器gcc在内核“纯”汇编代码中采用了不同于常用386汇编语言的句法;而在嵌入c程序的汇编片段中,也增加了一些指导汇编工具如何分配使用寄存器、以及如何与c程序中定义的变量相结合的语言成分。这些成分使得这种汇编语言实际上变成了一种介乎386汇编和c之间的一种中间语言。

2.嵌入c代码中的汇编语言
插入c代码中的汇编语言片段可以分为四个部分,以“:”号进行分隔,其一般形式为
指令部:输出部:输入部:损坏部
其中指令部是必需的,格式大体与标准汇编相同。
输出输入指示汇编代码段与c代码变量之间的关联。其相关格式如下:
"m" "v" "o" ----内存单元
"r"              ----任意寄存器
"q"             ----寄存器eax,ebx,ecx,edx之一
"i" "h"         ----直接操作数
"e" "f"       ----浮点数
"g"             ----任意
"a" "b" "c" "d"-分别表示使用eax,ebx,ecx,edx
"s" "d"       ----分别表示使用esi,edi
"i"               ----常数(0-31)

 
linux内核源代码情景分析读书笔记(4)-进程四要素2007年08月05日 星期日 10:55linux进程所需具备的四要素:
1.程序代码。代码不一定是进程专有,可以与其它进程共用。
2.系统堆栈空间,这是进程专用的。
3.在内核中维护相应的进程控制块。只有这样,该进程才能成为内核调度的基本单位,接受调度。并且,该结构也记录了进程所占用的各项资源。
4.有独立的存储空间,表明进程拥有专有的用户空间。

以上四条,缺一不可。
如果缺少第四条,那么就称其为“线程”。如果完全没有用户空间,称其为“内核线程”;如果是共享用户空间,则称其为“用户线程”。