免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3080 | 回复: 2
打印 上一主题 下一主题

[内核入门] text段和rodata段的只读属性是在那里设置的? [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-02 21:22 |只看该作者 |倒序浏览
本帖最后由 arm-linux-gcc 于 2013-09-02 21:23 编辑

arm的代码
paging_init时,map_lowmem函数将所有低端内存的页表项设置为MT_MEMORY,这其中包括了text所在的那些区域,
那么内核又是在那里将text段所在的这些section和page设置为只读的呢?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
2 [报告]
发表于 2013-09-04 18:46 |只看该作者
本帖最后由 arm-linux-gcc 于 2013-09-18 16:37 编辑

查了一些资料,发现kernel并没有将text rodata段设置为只读,有两个原因:

1,rodata段的结尾不一定是处于一个section的最后一个page,所以对这最后一个section就需要使用二级页表,在分配出来的二级页表中将rodata部分设置为只读,将data部分设置可写,并且vmlinux.lds中rodata和data之间是做了4k对齐的,所以这点是可以实现的。
不过这样就势必带来更多的页表项,于是TLB miss的几率就稍微增大了一点了,性能就稍微有一点点降低,在arch/parisc/Kconfig.debug中可以看到有类似的描述(DEBUG_RODATA)。
对于text也同理,因为text段的开头是在PAPE_OFFSET+TEXT_OFFSET的地方,TEXT_OFFSET是0x8000,也没有按照1M对齐。
所以内核默认不对text rodata段设置只读属性。
x86和parisc中有配置选项CONFIG_DEBUG_RODATA,打开之后就会编译make_rodata_ro函数,这个函数做的事情就是将_text ~ _etext这个区域设置为只读。
但是arm中并没有实现这个函数,我在android kernel 3.4中找到了make_rodata_ro对arm的实现,是在arch/arm/mm/rodata.c,相关Kconfig中也说到了这东西会对TLB带来更大的压力,性能会稍微降低。

2,因为gdb需要动态的修改text段以实现断点功能,所以如果开启了CONFIG_DEBUG_RODATA就会造成无法设置断点
kernel/debug/kdb.c中有如下一段代码
#ifdef CONFIG_DEBUG_RODATA
                if (!bp->bp_type) {
                        kdb_printf("Software breakpoints are unavailable.\n"
                                   "  Change the kernel CONFIG_DEBUG_RODATA=n\n"
                                   "  OR use hw breaks: help bph\n");

                }
#endif
还有kprobe也需要去修改text段,以便动态增加探测点



论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
3 [报告]
发表于 2013-09-04 18:53 |只看该作者
对x86不太了解,只看过一些简单的东西,记忆中x86无论如何都会用到二级页表吧,所以开不开CONFIG_DEBUG_RODATA都不会对TLB造成更大的压力,所以x86的arch/x86/Kconfig.debug中CONFIG_DEBUG_RODATA这个选项的help中是建议选上

而parisc,arch/parisc/Kconfig.debug中则是建议不选
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP