`
soboer
  • 浏览: 1309887 次
文章分类
社区版块
存档分类
最新评论

Linux 内核--fork()函数创建进程 (续)之copy_mem(int nr, struct task_struct *p)

 
阅读更多

本问分析基于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()函数复制页表,据说是内存管理中最复杂函数之一,以后研究,待续........

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics