社区
Linux_Kernel
帖子详情
*(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
打赏
收藏
*(int *)0 = 0; 是什么意思?
老大们,问个问题: 我在内核代码中有时会看到:*(int *)0 = 0;语句。比如__bug函数中就有这个语句 我的问题有两个: 1,*(int *)0 = 0,语句的字面意思是不是:0处置0? 2,为什么么我在内核代码中的任意一个函数中插入“*(int *)0 = 0;” 语句,就会导致内核启动的停止呢? 多谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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强制转换为指针,但是是空指针
langwangrenzhengfei
2009-09-04
打赏
举报
回复
为什么地址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
关于
int
* p,
int
*p,
int
* p = &a, *p = a的区别
一.
int
* p和
int
*p 首先这几种写法都是正确的,首先是
int
* p,
int
*p,这两个语法困扰了好久,我一直以为是C和C++指针定义上的不同,直到看到了https://www.stroustrup.com/bs_faq2.html#whitespace,这是C++本人的说明,大概信息是两者只是书写形式上的不同,表达了两种语言的强调点的不同,并没有对错之分。 C语言写者更倾向于:
int
*p,更强调语法,说明*p指向一个
int
类型 C++语言写者:
int
* p,更强调类型:p是一个指向i
小白 C语言之 指针
int
*p=0;和
int
*p;*p=0;和”&“有什么关系和区别
初学者在学习C语言的时候,最头疼的可能就是指针,话不多说。让我们直接进入正题 直接上代码
int
main(void) {
int
*p = 0; pr
int
f("%d", *p); system("pause"); return 0; } 直接运行,好了,程序是不是报错了?那就对了。*因为此时的
int
*p=0实际等于
int
p; p=0; 让我们来验证一下对不对
int
main(v...
关于
int
*p=&a与
int
*p;p=&a的解惑
在学习c语言解惑中遇到这个问题,其中对
int
*p=&a的写法百思不得其解,查了网上资料得出 这样的理解是错误的 正确理解是 一般来说*p=&a的表示方法是错的,*p=a和p=&a是正确的。2.*p=a的意思:将a的值赋给p指针指向的地址的值;3.p=&a的意思是:将a的地址赋给指针p;4.区别:*p是一个值;p是一个地址;两者完全不相同。5.*代表...
C++ 复杂的数组声明:
int
(*Parray)[10] = &arr,
int
(&arrRef)[10] = arr,
int
*(&arry)[10] = ptrs;
int
*ptrs[10]; //ptrs 是含有10个指针的数组
int
&refs[10]; //不合法,没有引用数组
int
(*Parray)[10] = &arr; // Parray 指向一个含有 10 个整数的数组 // (*Parray)[0] = arr[0]。Parray指向的是数组arr的首地址 (!首地址不是第一个元素)。 // 值得注...
c语言指针是0,C语言中指针
int
*p=0;和
int
*p;*p=0;和”&“的关系和区别详解
初学者在学习C语言的时候,最头疼的可能就是指针,话不多说。让我们直接进入正题直接上代码
int
main(void){
int
*p = 0;pr
int
f("%d", *p);system("pause");return 0;}直接运行,好了,程序是不是报错了?那就对了。因为此时的
int
*p=0实际等于
int
*p; p=0;让我们来验证一下对不对
int
main(void){
int
*p = 0;...
Linux_Kernel
4,468
社区成员
17,459
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章