Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1136443
  • 博文数量: 646
  • 博客积分: 288
  • 博客等级: 二等列兵
  • 技术积分: 5375
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-08 14:33
个人简介

为了技术,我不会停下学习的脚步,我相信我还能走二十年。

文章分类

全部博文(646)

文章存档

2014年(8)

2013年(134)

2012年(504)

分类:

2012-06-30 22:29:13

原文地址:linux内核分页地址保护 作者:FBI888XH

linux内核是通过什么机制来判断用户访问的内存是非法的,从而实现地址保护?

姑且认为32位机器在上,进程能看到的虚拟地址空间是4G。这4G是一个潜力值,并非所有虚拟内存下都有物理内存做backup。只有某些虚拟内存段是有效的,操作系统记录着这些地址段,通过一个链表。每一元素有一个区间,表示该区间内地址有效(通过
)。感兴趣的话可以看看内核中的do_page_fault函数,即从哪里开始,有多大。操作系统保证这些地址下最终是有物理内存对应。

这些有效内存段的来源:


1.初始化时从执行文件获知,text section, data section等等

2.操作系统为进程创造的栈
3.通过系统调用显式创造,即所谓“在堆在申请内存”

在用分页做内存管理时,所谓保证“一段虚拟地址段下有物理内存”,就是说相应虚拟地址段对应的页表项是有效的。访问所谓的“无效地址”时,由于页表项没有 信息,CPU无法转换地址,出现page fault,转入操作系统处理异常的代码,处理异常代码里就把当前进程core dump了。


实际情况还要复杂一点,有可能逻辑上说,某个虚拟地址有效的,但因为某种原因,操作系统不想给它物理内存,其对应的页表信息也是无效的,比如demand page或者页被换出去之类的情况。访问这种地址时也会发生page fault,但这时不会core dump。这时需要在do_page_fault缺页中断处理函数中进行判断,由于操作系统记录了进程所有的有效地址段,它可以判断fault address是不是在某个有效地址段里。如果是,再根据情况,看看要怎么给它找一块内存,然后设置一下页表,然后正常返回到用户态,用户态程序就可以若无其事地继续执行了。
阅读(636) | 评论(0) | 转发(0) |
0

上一篇:linux 进程与线程

下一篇:linux信号机制

给主人留下些什么吧!~~