免费注册 查看新帖 |

Chinaunix

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

[内存管理] 如何将linux kernel指定的一段内存设置为只读 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-09 17:56 |只看该作者 |正序浏览
有谁指定如何将arm linux内核中的一段内存设置为只读?
多谢!!!

论坛徽章:
0
14 [报告]
发表于 2014-12-17 09:54 |只看该作者
回复 13# Tinnal


    非常感谢回复!!!

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
13 [报告]
发表于 2014-12-15 21:42 |只看该作者
看了一下,一下午了,论坛都没有人发贴了。很安静,安静得令人恐怖。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
12 [报告]
发表于 2014-12-15 21:39 |只看该作者
回复 10# gong_yue

内核没有直接把内核所在内存更改为只读的函数,但可以同通过set_pte来更改对应的页表项来实现。前提必须找到对应的页表项,可以通过pxx_offeset来实现,如果你是X86的,那就方便一点,有人给你写好了--lookup_address。

整个过程,其实和kmemcheck相做的类似。可以参考一下它的实现:
  1. void kmemcheck_hide_pages(struct page *p, unsigned int n)
  2. {
  3.         unsigned int i;

  4.         for (i = 0; i < n; ++i) {
  5.                 unsigned long address;
  6.                 pte_t *pte;
  7.                 unsigned int level;

  8.                 address = (unsigned long) page_address(&p[i]);
  9.                 pte = lookup_address(address, &level);
  10.                 BUG_ON(!pte);
  11.                 BUG_ON(level != PG_LEVEL_4K);

  12.                 set_pte(pte, __pte(pte_val(*pte) & ~_PAGE_PRESENT));
  13.                 set_pte(pte, __pte(pte_val(*pte) | _PAGE_HIDDEN));
  14.                 __flush_tlb_one(address);
  15.         }
  16. }
复制代码
对你这个需求,你要去掉的是_PAGE_RW,而不是_PAGE_PRESENT。
还是比较简单的。

但的两点要注意。
1. 你的数组必须页对齐
2. 要搞清楚你的内核是采用大页还是小页。





   

论坛徽章:
2
酉鸡
日期:2013-09-26 11:11:15摩羯座
日期:2014-01-08 13:45:19
11 [报告]
发表于 2014-12-15 11:39 |只看该作者
不知道用内联汇编定义rodata section能否满足你的需求

论坛徽章:
0
10 [报告]
发表于 2014-12-15 10:47 |只看该作者
内核只读。

论坛徽章:
2
酉鸡
日期:2013-09-26 11:11:15摩羯座
日期:2014-01-08 13:45:19
9 [报告]
发表于 2014-12-11 21:50 |只看该作者
是让内核只读,还是让用户空间只读?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
8 [报告]
发表于 2014-12-11 14:42 |只看该作者
回复 7# gong_yue


    呃,这种保留的buffer不能用mmap的方法来设置只读,mmap只适合知道物理地址的情况,并且是设置为app访问这片物理内存时是只读的
你这种直接在内核中定义全局数组的方式,那么就属于内核空间了,我再看一下代码给你回答

论坛徽章:
0
7 [报告]
发表于 2014-12-11 09:41 |只看该作者
我的需求是在内核中定义了一个全局的缓冲区如:
char buf[4096];
将这段缓冲区设置为只读的,安照你的方法使用mmap是直接调用remap_pfn_range函数吗?
多谢!!!

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
6 [报告]
发表于 2014-12-10 23:31 |只看该作者
本帖最后由 arm-linux-gcc 于 2014-12-11 14:37 编辑

回复 5# gong_yue


    静态保留的又分为两种,事先知道虚拟地址的和事先不知道虚拟地址的


前者可以在paging_init阶段就建立为只读的,具体参考android的kernel,搜索CONFIG_DEBUG_RODATA





对于事先不知道虚拟地址的,一般都是通过mmap来使用
那么在mmap时,参数prot不要设置PROT_WRITE就能够设置为只读的(只设置PROT_READ)




  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP