免费注册 查看新帖 |

Chinaunix

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

【求助】启动时错误 protecting kernel read-only data [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-10 21:14 |只看该作者 |倒序浏览
我在 linux/init/main.c
这个文件中 定义了一个全局变量 my_flags
然后在start_kernel函数开始的时候给my_flags赋值为0,
在init_post函数开始的时候又改变my_flags的值为1,
编译内核成功。
启动的时候,内核不能够成功启动,会显示:
protecting kernel read-only data
如果我取消init_post函数中的赋值,而在start_kernel函数结束之前改变它的值为1,则可以正常启动内核。

请问这是为何呢?

论坛徽章:
0
2 [报告]
发表于 2011-12-11 20:37 |只看该作者
回复 1# anitawang1989


   你的问题我不知道。。。不过我有个问题,你修改代码后,是用什么命令(或选项)重新编译内核的,就像第一次编译内核样make么,这样的话好像还是重新编译,要很长时间。其实我就是想知道怎样只编译修改过的文件。

论坛徽章:
0
3 [报告]
发表于 2011-12-11 21:35 |只看该作者
回复 2# rocklinux


    他只会重新编译修改过文件,以及依赖该文件的其他文件,没有修改的文件不会编译。
可能你修改的文件比较多,或者依赖你修改的文件的文件很多,所以编译时间比较长。(说的好绕啊 = =)

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
4 [报告]
发表于 2011-12-11 21:46 |只看该作者
帮mm顶一下!

论坛徽章:
0
5 [报告]
发表于 2011-12-11 22:06 |只看该作者
回复  rocklinux


    他只会重新编译修改过文件,以及依赖该文件的其他文件,没有修改的文件不会编译 ...
anitawang1989 发表于 2011-12-11 21:35



    我知道你的意思,也就是它是按照makefile的规则编译,但我也只是改动了一点点啊,看输出好像就是从头编译。。。

    你能给出你用的make命令的选项么

论坛徽章:
0
6 [报告]
发表于 2011-12-11 22:25 |只看该作者
回复 5# rocklinux


    我没什么特殊的,就是 make -j32, make modules_install, make install
    你是不是改了头文件之类的?

论坛徽章:
0
7 [报告]
发表于 2011-12-11 23:58 |只看该作者
回复  rocklinux


    我没什么特殊的,就是 make -j32, make modules_install, make install
    你 ...
anitawang1989 发表于 2011-12-11 22:25



    是么,那我再试试,Thanks anyway

论坛徽章:
0
8 [报告]
发表于 2011-12-13 14:42 |只看该作者
问题已解决……可以忽略了……

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
9 [报告]
发表于 2011-12-13 15:08 |只看该作者
问题已解决……可以忽略了……
anitawang1989 发表于 2011-12-13 14:42


这里的人对问题是如何解决的很感兴趣,因为知识的积累就是解决问题的积累,能否让我们知道问题是如何解决的吗?

论坛徽章:
0
10 [报告]
发表于 2011-12-13 15:48 |只看该作者
回复 9# linuxfellow


    方法很挫,有点不好意思说……
先说原因:因为变量的定义在内核初始化开始的时候,当内核初始化好,那段空间就被保护起来了,因此想要再写它的值是不可能的。
因此采用了别的方法,通过per cpu data来解决这个问题。
DEFINE_PER_CPU(int, my_flags);
开始my_flags是在.data.percpu段,
在start_kernel函数中,setup_per_cpu_areas()函数,为每个cpu的per-cpu变量副本分配空间,以后可以找到这些变量的副本,这些副本是可以写的,就如此解决了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP