segment fault 段错误 (core dumped)的起因分析!

本文详细探讨了导致Linux进程中段错误的原因,通过分析一个示例程序,解释了`segment fault (core dumped)`的根源。文章介绍了进程地址空间的组成,包括mm_users和mm_count的作用,以及如何遍历内存区域。通过分析进程地址空间的各个部分,如代码段、数据段、堆和栈,揭示了当访问未映射地址时产生段错误的原因。
摘要由CSDN通过智能技术生成

很久一致被这个问题,这里试着去理解理解,首先写一个程序:

int main()
{
     int *p=(int *)malloc(0);
     *p=10;
     printf("%p/n",p);

    sleep(100);

     printf("%d/n",getpid());


     p=(int *)0x847e008;
     *p=20;
     return 0;
}

 

[qiqi@localhost test]$ ./hello
0x9f9e008
段错误 (core dumped)
[qiqi@localhost test]$

 

产生段错的根本的原因,首先要理解进程的地址空间,这里找到来一篇关于进程地址空间的好文章:

Linux进程地址空间




内核使用内存描述符结构体表示进程的地址空间,该结构体包含了和进程地址空间有关的全部信息。内存描述符由mm_struct结构体表示,定义在文件<linux/sched.h>中。进程地址空间由每个进程的线性地址区(vm_area_struct)组成。通过内核,进程可以给自己的地址空间动态的添加或减少线性区域。如下图是内存描述符mm_struct和线性区域描述 符vm_area_struct的关系:

      mm_users域记录正在使用该地址的进程数目。比如,如果两个进程共享该地址空间,那么mm_users的值便等于2;mm_count域是mm_struct的结构体的主引用计数,只要 mm_users不为0,那么mm_count值就等于1.当mm_users值减为0(两个线程都退出)时,mm_count域的值才变为0。如果mm_count的值等于0,说明已经没有任何指向该mm_struct结构 体的引用了,这时该结构体会被销毁。mmap和mm_rb这两个不同的数据结构描述的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值