*(int *)0 = 0; 是什么意思?

langwangrenzhengfei 2009-09-03 06:30:51
老大们,问个问题:
我在内核代码中有时会看到:*(int *)0 = 0;语句。比如__bug函数中就有这个语句


我的问题有两个:

1,*(int *)0 = 0,语句的字面意思是不是:0处置0?

2,为什么么我在内核代码中的任意一个函数中插入“*(int *)0 = 0;” 语句,就会导致内核启动的停止呢?



多谢
...全文
864 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yrj 2009-09-14
  • 打赏
  • 举报
回复
就是为了让内核panic而做的。
majingshan710 2009-09-08
  • 打赏
  • 举报
回复
应该是使用了内核的系统空间
*(int*)0 = 0;
有如下理解:
首先*(int *)是一个强制转换,把0转换为一个整型指针指向的数据类型,也就是楼上说是所谓的
0000:0000内存逻辑地址,再往该地址处写入数据;
但是,该地址为页面表的存放地址,是有写保护的。
所以就会死机……


仅供参考……
银河里游方舟 2009-09-08
  • 打赏
  • 举报
回复
学习~~
normalpeople 2009-09-07
  • 打赏
  • 举报
回复
学习
Olyra 2009-09-07
  • 打赏
  • 举报
回复
也不知道你是哪些逻辑里加入此表达式,但在内核引导过过程中,
从物理地址0x0000到0x1000为4kb的页目录项,紧接着为处理内核使用内存的页表项,每个页表项为4个字节长度。
*(int *) 0 = 0;的意思就是把页表项全部置为0,这样的话,内核在进行内存操作时,一定会出现错误。导致内核引导失败。
在一般程序中也会使用类似的表达式去处理特别的问题。如c函数中的一个宏
offsetof(s,m)也是这么用的。
#define offsetof (size_t)&(((s *)0)->m)
csdeny 2009-09-07
  • 打赏
  • 举报
回复
就是为了报错
DarkChampion 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 showman 的回复:]
0 就是NULL,你对空指针操作,不异常退出才怪呢?
[/Quote]
(int *)0把0强制转换为指针,但是是空指针
  • 打赏
  • 举报
回复
为什么地址0置0,不允许呢?会导致什么异常?

我的理解是:内核没有对虚拟地址0和物理内存进行映射,也就是说虚拟地址0没有相应的物理内存,所以往里写数据写不进去,MMU会向处理器报错,处理器又会向内核报错。
csan 2009-09-04
  • 打赏
  • 举报
回复 1
把0作为一个地址,这个地址的内容置0

起始地址被清零了当然会有影响
rzsheng 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 niulin 的回复:]
*(int *)0 = 0;
就是使内存单元地址为0000:0000的内存单元的内容清0

不过,这个单元是不许改写的,会报错。

至于在Linux内核中这样写,我也不知为什么
[/Quote]

这个说的在理,
Behard 2009-09-03
  • 打赏
  • 举报
回复
是不是系统出错了,然后停止系统
niulin 2009-09-03
  • 打赏
  • 举报
回复
*(int *)0 = 0;
就是使内存单元地址为0000:0000的内存单元的内容清0

不过,这个单元是不许改写的,会报错。

至于在Linux内核中这样写,我也不知为什么
jufeng2309 2009-09-03
  • 打赏
  • 举报
回复
其实就是一个置空操作。
bourbaki 2009-09-03
  • 打赏
  • 举报
回复
mark
ShowMan 2009-09-03
  • 打赏
  • 举报
回复 1
0 就是NULL,你对空指针操作,不异常退出才怪呢?
yangzhifu 2009-09-03
  • 打赏
  • 举报
回复
mark
Welson80 2009-09-03
  • 打赏
  • 举报
回复
MARK

4,468

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧