------------------------------------------
本文为本人原创,欢迎转载!
雪夜流星
------------------------------------------
段错误是我们在运行程序是遇到的最频繁的错误,本人也经常遇到,现用一个例子来剖析这类错误,希望能够起到抛砖引玉的效果,先看一段代码:
- #include <stdio.h>
-
-
int main(void)
- {
-
-
int *p;
-
p = (int *)0x0123456;
-
*p = 0x11;
-
printf("*p is %d", *p);
-
return 0;
-
}
编译运行会产生段错误,什么原因呢?
大多数人都知道是因为没有给p分配合法空间,就直接给p指向的空间赋值会导致产生段错误。
但为何不给指针p分配合法的空间而直接往p指向的空间赋值就会产生段错误,内核是怎样做的呢?
很多人知其然,并不知其所以然,好奇心重的我并不满足于此。
下面是对该问题的一个参考答案:
上面那段代码是运行在用户空间的,每个进程都有自己的页表和页目录,操作系统没有为你设置页表让你访问0x0123456这个线性地址所在的页。page unit(页式管理单元)自然没办法帮你把这个线形地址翻译成物理地址,那就只好给你个page fault异常,然后内核就发送个段错误的信号给你的进程!(如需更深的答案,且看ulk3第九章)。
阅读(4517) | 评论(1) | 转发(0) |