利用异常表处理内核态缺页异常呢
给人家开一条正道 内核缺页异常处理 运行在核心态的进程经常需要访问用户地址空间的内容,但是谁都无法保证内核所得到的这些从用户空间传入的地址信息是\"合法\"的。为了保护内核不受错误信息的攻击,需要验证这些从用户空间传入的地址信息的正确性。 在老版本的Linux中,这个工作是通过函数verify_area来完成的: extern inline int verify_area(int type, const void * addr, unsigned long size)
该函数验证了是否可以以type中说明的访问类型(read or write)访问从地址addr开始、大小为size的一块虚拟存储区域。为了做到这一点,verify_read首先需要找到包含地址addr的虚拟存储区域(vma)。一般的情况下(正确运行的程序)这个测试都会成功返回,在少数情况下才会出现失败的情况。也就是说,大部分的情况下内核在一些无用的验证操作上花费了不算短的时间,这从操作系统运行效率的角度来说是不可接受的。 为了解决这个问题,现在的Linux设计中将验证的工作交给虚存中的硬件设备来完成。当系统启动分页机制以后,如果一条指令的虚拟地址所对应的页框(page frame)不在内存中或者访问的类型有错误,就会发生缺页异常。处理器把引起缺页异常的虚拟地址装到寄存器CR2中,并提供一个出错码,指示引起缺页异常的存储器访问的类型,随后调用Linux的缺页异常处理函数进行处理。 Linux中进行缺页异常处理的函数如下: asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code) { …………………… __asm__(\"movl %%cr2,%0\":\"=r\" (address)); …………………… vma = find_vma(mm, address); if (!vma) goto bad_area; if (vma-vm_start = address) goto good_area; if (!(vma-vm_flags VM_GROWSDOWN)) goto bad_area; if (error_code 4) { if (address + 32 regs-esp) goto bad_area; …………………… bad_area: …………………… no_context: /* Are we prepared to handle this kernel fault? */ if ((fixup = search_exception_table(regs-eip)) != 0) { regs-eip = fixup; return; } ……………………… }
合肥有没有白癜风医院成都有没有男科医院
钦州治疗白癜风哪家医院好
- 下一页:利用异常表处理内核态缺页异常牛
- 上一页:利用异常表处理内核态缺页异常的
- 06月21日体育土狗醒来发觉家中没有人它悄悄跑到苞米去旅位置
- 06月21日体育圣伯纳犬的种类位置
- 06月21日体育圣伯纳犬犬瘟初期能够治好吗位置
- 06月21日体育红尾蝶怎么养蝶鱼对水质要求较高位置
- 06月21日体育圣伯纳犬总吃陌生人的东西怎么办位置
- 06月21日体育红嘴蓝鹊会说话吗是一种体态优美的鸟位置
- 06月20日体育猫咪丢了怎么找回来位置
- 06月20日体育猫之贵族俄罗斯蓝猫特点和图片品种介绍位置
- 06月20日体育猫为什么爱玩毛线球猫爱玩毛线球的原因有哪位置
- 06月20日体育猫为什么会有抓老鼠的天性位置
- 06月20日体育狼青犬身上的臭味要怎么清除位置
- 06月19日体育别再做这件事狗狗会感觉委屈认为你不喜欢位置