免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4958 | 回复: 12

[内存管理] linux内核是怎么检查0地址并报段错误的(原理) [复制链接]

论坛徽章:
1
巨蟹座
日期:2014-04-23 23:20:17
发表于 2014-04-15 11:08 |显示全部楼层
个人感觉,进程有自己的页表,如果用户访问0地址,内核会检查相应页表项,如果未建立映射,直接映射一份物理地址就行了。为什么会报段错误的?这样是不是用户永远访问不了知己虚存空间内地址0?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
发表于 2014-04-15 11:54 |显示全部楼层
回复 1# registcn

addr 0未对应有效的 VMA,所以不会为你映射 page!

再说你要是能访问,那引用空指针的BUG不郁闷死一堆程序猿?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
发表于 2014-04-15 12:26 |显示全部楼层
缺页异常中有判断,空指针。       
if (address < PAGE_SIZE)
    printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
发表于 2014-04-15 12:38 |显示全部楼层
本帖最后由 asuka2001 于 2014-04-15 15:11 编辑

回复 3# humjb_1983

这是内核空间中出现段错误,导致段错误的指令不是 exception table中指定的指令,才会跳转到这地方。

用户空间的进程 page fault流程到不了这里!必然是有内核 BUG,才会跳到这地方!

论坛徽章:
0
发表于 2014-04-15 14:01 |显示全部楼层
不是每個address都可以建立其page
在do_page_fault時,會去檢查其address在vma是否合法(find_vma())
就是從這邊檔掉

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
发表于 2014-04-15 14:11 |显示全部楼层
asuka2001 发表于 2014-04-15 12:38
回复 3# humjb_1983

这是内核空间中执行了 exception table中未指定的指令,才会跳转到这地方。

呵呵,是的,感谢asuka2001兄弟的提醒,用户态的非法地址,会直接触发段错误,内核会向用户进程发送相应的信号。
内核态的空指针才会走到我刚说的流程。
总的来说,都是在缺页异常中处理的~~

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2014-04-15 19:14 |显示全部楼层
本帖最后由 arm-linux-gcc 于 2014-04-15 22:03 编辑

0地址就是保留用来捕捉空指针错误的,如果你将0地址映射成合法的,那么空指针错误就无法发现了
在arm里面是0~0xfff这个page会保留不用

00000000        00000fff        CPU vector page / null pointer trap
                                CPUs which do not support vector remapping
                                place their vector page here.  NULL pointer
                                dereferences by both the kernel and user
                                space are also caught via this mapping.



在一些很老的不能支持high vectors的ARM中,在kennel里面是可以访问0地址的(注意只是kernel可以、app是不行的)
#define vectors_base()        (vectors_high() ? 0xffff0000 : 0)
armv3不能支持high vector,只能将向量放在0地址,这种情况下是可以访问0地址的,极小地址的这种错误也将无法被捕捉
但是只能读0地址,如果直接将0地址作为函数指针来调用仍然会crash——因为放在0地址处的向量的内容是swi SYS_ERROR0





论坛徽章:
1
巨蟹座
日期:2014-04-23 23:20:17
发表于 2014-04-15 19:54 |显示全部楼层
那所谓用户态可访问3g的空间岂不是有一部分访问不了了?至少地址0是访问不了的?回复 6# humjb_1983


   

论坛徽章:
1
巨蟹座
日期:2014-04-23 23:20:17
发表于 2014-04-15 19:54 |显示全部楼层
那所谓用户态可访问3g的空间岂不是有一部分访问不了了?至少地址0是访问不了的?回复 7# arm-linux-gcc


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
发表于 2014-04-15 22:00 |显示全部楼层
registcn 发表于 2014-04-15 19:54
那所谓用户态可访问3g的空间岂不是有一部分访问不了了?至少地址0是访问不了的?回复 6# humjb_1983

是的~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP