免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3646 | 回复: 14
打印 上一主题 下一主题

[原]深入理解段错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-30 02:38 |只看该作者 |倒序浏览
这篇文错了哈,麻烦版主删除下

[ 本帖最后由 破碎细胞 于 2008-5-30 12:34 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-05-30 08:44 |只看该作者
呵呵

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2008-05-30 09:15 |只看该作者

论坛徽章:
0
4 [报告]
发表于 2008-05-30 09:50 |只看该作者
原帖由 破碎细胞 于 2008-5-30 02:38 发表
这是我碰到的很恶心的问题,把自己的一点心得体会写出来,希望对和我一样的初学者有帮助。
写得不好,还请多多指教。拍砖请轻点,没带钢盔~:wink:



谭孟泷
blog.csdn.net/crackcell
TanMenglong 圈儿A ...


你好, 我不是很赞同你的观点.

>>我们写的每个程序,都有自己的私有段(LDT)和公共段(GDT)。

在linux中只用到了GDT, 除非用了wine这些外, 不会用到LDT的. 而且段错误与GDT, LDT并无多大关系.
其实段错误的实质就是在一个进程的地址空间中, 你去对属性为只读的内存区域进行了写操作.

若我有说得不对的地方, 还请指点.

论坛徽章:
0
5 [报告]
发表于 2008-05-30 10:01 |只看该作者
Linux中把段的概念已经淡化了,主要用分页机制,出现段错误是在进程在访问页时由于一些检查没有通过而导致内核向进程发送SIGSEGV信号。

论坛徽章:
0
6 [报告]
发表于 2008-05-30 10:59 |只看该作者
原帖由 scutan 于 2008-5-30 09:50 发表


你好, 我不是很赞同你的观点.

>>我们写的每个程序,都有自己的私有段(LDT)和公共段(GDT)。

在linux中只用到了GDT, 除非用了wine这些外, 不会用到LDT的. 而且段错误与GDT, LDT并无多大关系.
其实 ...



奥~~~~LDT确实不是所有程序都有,这点是我说的有问题了。至于你说的,我不是很清楚,再继续学习下,呵呵,谁让我是菜鸟呢?:wink:

谢谢~

论坛徽章:
0
7 [报告]
发表于 2008-05-30 11:01 |只看该作者
原帖由 cugb_cat 于 2008-5-30 10:01 发表
Linux中把段的概念已经淡化了,主要用分页机制,出现段错误是在进程在访问页时由于一些检查没有通过而导致内核向进程发送SIGSEGV信号。

受教了,呵呵~

论坛徽章:
0
8 [报告]
发表于 2008-05-30 12:02 |只看该作者
原帖由 cugb_cat 于 2008-5-30 10:01 发表
Linux中把段的概念已经淡化了,主要用分页机制,出现段错误是在进程在访问页时由于一些检查没有通过而导致内核向进程发送SIGSEGV信号。


re

特别是现在的 flat memory model,code 和 data 都在一个段中,所以单纯说“当我们用指针去访问段外面的东西,那么对不起,段错误就出现啦”不大全面。
我个人的理解也是访问内存的时候没有通过一些检查才会引发 segfault。

比如说下面的代码,也是会引发 segfault 的,但是并不是越段的情况:

  1. int main()
  2. {
  3.       int i = 1000;
  4.       printf("%s\n", i);
  5.       return 0;
  6. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2008-05-30 12:21 |只看该作者
LZ彻底把“段错误”的段理解成X86的段了,错了哈。
之所以叫“段”错误,应该是8086时代UNIX的历史产物。
非要把“段错误”中的“段”安排一个对象,可以理解成linux中vm_area结构,它管理内存的思想其实和x86中的段是一样的。

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
10 [报告]
发表于 2008-05-30 12:22 |只看该作者
科普不是人人都可以写的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP