关于在内核态写内核只读区域的问题。
时间:2010-09-10
来源:互联网
本帖最后由 peng850okay 于 2010-09-11 22:42 编辑
大家好,请教如下一个问题。 谢谢。
内核版本 2.6.28
如果内核(2.6.28的内核)态的一段代码写内核的一个只读区域,应该会发生page_fault是吧??
某一个内核测试函数。有如下几句代码
void * test =(void *)__get_free_pages (GFP_KERNEL,10); / /获得4M的空间。
struct task_struct * task = get_current_task();
struct mm_struct * prevt;
if(task->active_mm)
prev=task->active_mm;
else
prev=&init_mm;
//把这4M的空间的页表项置为只读。。 内核里面 页表项是pgd_t了,一次转换4m的线性地址。。
pgd_t *pgd=pgd_offset(prev,(unsigned long)test);
pte_t *pte=(pte_t *) pgd;
*pte=pte_wrprotect(*pte);
flush_tlb();
//然后写这个空间。
int *p =(int *)test;
*p=123; // 照例说是不是这里会产生一个异常????
现在的情况是,系统卡住了死机了。。。。。。请教一下,我的理解是 *p=123会产生 page_fault异常,进入对应函数去做异常处理。。。
向各位请教了,谢谢。。。。
大家好,请教如下一个问题。 谢谢。
内核版本 2.6.28
如果内核(2.6.28的内核)态的一段代码写内核的一个只读区域,应该会发生page_fault是吧??
某一个内核测试函数。有如下几句代码
void * test =(void *)__get_free_pages (GFP_KERNEL,10); / /获得4M的空间。
struct task_struct * task = get_current_task();
struct mm_struct * prevt;
if(task->active_mm)
prev=task->active_mm;
else
prev=&init_mm;
//把这4M的空间的页表项置为只读。。 内核里面 页表项是pgd_t了,一次转换4m的线性地址。。
pgd_t *pgd=pgd_offset(prev,(unsigned long)test);
pte_t *pte=(pte_t *) pgd;
*pte=pte_wrprotect(*pte);
flush_tlb();
//然后写这个空间。
int *p =(int *)test;
*p=123; // 照例说是不是这里会产生一个异常????
现在的情况是,系统卡住了死机了。。。。。。请教一下,我的理解是 *p=123会产生 page_fault异常,进入对应函数去做异常处理。。。
向各位请教了,谢谢。。。。
作者: peng850okay 发布时间: 2010-09-10
回复 peng850okay
没人回答啊。。。。。。。。哎。。。!
没人回答啊。。。。。。。。哎。。。!
作者: peng850okay 发布时间: 2010-09-12
回复 peng850okay
卡住死机可能是正常的.
卡住死机可能是正常的.
作者: epegasus 发布时间: 2010-09-12
按我的理解,*p=123会产生 page_fault异常,也会进入对应函数去做异常处理……但是能够怎么处理呢?不可能把不可写的改为可写吧。除了oops,我想不到内核还可以怎样处理。
作者: kouu 发布时间: 2010-09-12
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28