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是不是在某个有效地址段里。如果是,再根据情况,看看要怎么给它找一块内存,然后设置一下页表,然后正常返回到用户态,用户态程序就可以若无其事地继续执行了。
阅读(642) | 评论(0) | 转发(0) |