当前位置: 技术问答>linux和unix
*(int *)0 = 0; 是什么意思?
来源: 互联网 发布时间:2016-07-01
本文导语: 老大们,问个问题: 我在内核代码中有时会看到:*(int *)0 = 0;语句。比如__bug函数中就有这个语句 我的问题有两个: 1,*(int *)0 = 0,语句的字面意思是不是:0处置0? 2,为什么么我在内核代码中的任意一个函数...
老大们,问个问题:
我在内核代码中有时会看到:*(int *)0 = 0;语句。比如__bug函数中就有这个语句
我的问题有两个:
1,*(int *)0 = 0,语句的字面意思是不是:0处置0?
2,为什么么我在内核代码中的任意一个函数中插入“*(int *)0 = 0;” 语句,就会导致内核启动的停止呢?
多谢
我在内核代码中有时会看到:*(int *)0 = 0;语句。比如__bug函数中就有这个语句
我的问题有两个:
1,*(int *)0 = 0,语句的字面意思是不是:0处置0?
2,为什么么我在内核代码中的任意一个函数中插入“*(int *)0 = 0;” 语句,就会导致内核启动的停止呢?
多谢
|
MARK
|
mark
|
0 就是NULL,你对空指针操作,不异常退出才怪呢?
|
mark
|
把0作为一个地址,这个地址的内容置0
起始地址被清零了当然会有影响
起始地址被清零了当然会有影响
|
也不知道你是哪些逻辑里加入此表达式,但在内核引导过过程中,
从物理地址0x0000到0x1000为4kb的页目录项,紧接着为处理内核使用内存的页表项,每个页表项为4个字节长度。
*(int *) 0 = 0;的意思就是把页表项全部置为0,这样的话,内核在进行内存操作时,一定会出现错误。导致内核引导失败。
在一般程序中也会使用类似的表达式去处理特别的问题。如c函数中的一个宏
offsetof(s,m)也是这么用的。
#define offsetof (size_t)&(((s *)0)->m)
从物理地址0x0000到0x1000为4kb的页目录项,紧接着为处理内核使用内存的页表项,每个页表项为4个字节长度。
*(int *) 0 = 0;的意思就是把页表项全部置为0,这样的话,内核在进行内存操作时,一定会出现错误。导致内核引导失败。
在一般程序中也会使用类似的表达式去处理特别的问题。如c函数中的一个宏
offsetof(s,m)也是这么用的。
#define offsetof (size_t)&(((s *)0)->m)