本问分析基于Linux 0.11内核,转载请标明出处http://blog.csdn.net/yming0221/archive/2011/06/06/6528490.aspx
copy_mem(int nr, struct task_struct *p)函数是为进程设置段基址,限长,并复制页表。下面是其代码
其中get_limit()函数是利用内嵌汇编取特定段描述符中段限长,其中用到指令lsll
将指定描述符段的段限长返回,其中由于段限长是从0开始,所以在lsll之后需要增一。
至于ldt数据段描述符为什么是0x17,而ldt中代码段描述符是0x0f原因是段选择子的格式,一共16位,高13位表示描述符在描述符表的索引
[2]位表示这项是GDT还是LDT,0表示LDT;[1][0]表示RPL权限位。所以,0x17=0B0000 0000 0001 0111,其中10表示第二
项,0x0f=0B0000 0000 0000 1111,表示位于描述符表中的第一项。基地址在LDTR寄存器中。
get_base(addr)取描述符的中指向段的及地址,其宏定义如下:
下图表示描述符格式:
copy_page_tables()函数复制页表,据说是内存管理中最复杂函数之一,以后研究,待续........