注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FY

Johnson 's Blog

 
 
 

日志

 
 

[原创]LINUX0.12笔记  

2016-10-05 12:59:39|  分类: Linux内核 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

Linux0.12中,所有进程还有内核都只使用同一个页目录表,即CR3只指向这一个页目录表。

 

线性地址

物理地址

LINUX内核

0 ~ 16MB

 0~ 16MB

用户程序

Nr*64MB ~ (Nr+1)*64MB

 1~16MB(主内存区)

LINUX内核实际模块占用只有最前面几百KB空间,所以我们任务0,任务1的代码段限长640KB就够了。LINUX内核最多能管理的内存物理空间是16MB

对于内核代码来讲,它可以访问0~16MB中任一处地址,它的线性地址和物理地址一一映射。对于用户进程来讲,它的线性地址等于进程号乘以64MB,它中间的一小部分(实际使用到的数据段/代码段大小)被映射到主内存区中。

如果将来Linux中每个进程使用不同的CR3,那还要保护每个进程的页表映射中,都正常映射了内核数据、代码。因为进程它自己运行时需要LDT表,进程它发生中断想调用sys call时它要能正解找到IDT表,并且根据表内容能正确找到内核中的中断处理函数。在CPU任务切换时,CR3会由CPU自动载入。

 

任务1被任务0 fork了,在执行copy_page_tables时,给任务1分配一页新的物理页(4KB),用于当作任务1的页表。前640KB全是只读。

并且将页表从from_page_table(x01000)拷贝到to_page_table(主内存是新申请的一页)时,判断由于fork的源任务是任务0,处于内核模块区(即小于LOW_MWM(1MB)),所以任务0它所在的页表是在内核模块中,不在主内存中的,

无需对它的引用次数加1

也即,以下代码不会执行。

if (this_page > LOW_MEM) {

                            *from_page_table = this_page;

                            this_page -= LOW_MEM;

                            this_page >>= 12;

                            mem_map[this_page]++;

}

然后,任务1进行了写操作,造成CPU产生页保护异常

INIT 14中断-> do_wp_page –> un_wp_page

un_wp_page中会判断当前这个产生页保护的物理页,如果在主内存中,

则需要对它的引用次数减1

if (old_page >= LOW_MEM)

              mem_map[MAP_NR(old_page)]--;

这上面fork时,copy_page_tables中的作法正好相反,如果是主内存中的物理页要被共享,则对它的引用次数加1.

 

un_wp_page中,大体按3步走

1.      在主内存区中重新申请一页新的物理页(mm内存管理get_free_page统一得到)

2.      将原先映射到的一页物理页(4KB)内容拷贝到1)中新申请到的新物理页中

3.      改变页表中的那一项的标志,改为可读可写

 

任务1从任务0处复制得到。

此时任务1

start_code0x4000000 (64MB)

end_code: 0

start_code ~ start_code + end_code的空间被当作代码段

start_code + end_code之后当作数据段

end_code0意味着任务的“代码段长度为0”,它的线性地址0x4000000开始的640KB空间都可以当作数据段

  评论这张
 
阅读(10)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017