linux内核分页地址保护

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

姑且认为32位机器在上,进程能看到的虚拟地址空间是4G。这4G是一个潜力值,并非所有虚拟内存下都有物理内存做backup。只有某些虚拟内存段是有效的,操作系统记录着这些地址段,通过一个链表。每一元素有一个区间,表示该区间内地址有效(通过vm_area_struct 结构体
)。感兴趣的话可以看看内核中的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是不是在某个有效地址段里。如果是,再根据情况,看看要怎么给它找一块内存,然后设置一下页表,然后正常返回到用户态,用户态程序就可以若无其事地继续执行了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值