要谈segment fault,必须要谈指针。

指针的本质是什么?只不过是一种带*的数据类型,其特色有:

1、宽度

2、声明

3、赋值

4、++与--

5、+与-

6、求差值

7、比较

当声明int *ptr = 0x0之后,ptr1就是一个指针变量了,

可以对ptr1做++,--,+,-等各种操作,

然而不能访问ptr地址中的内容,因为访问的是非法内存地址0x0(内核空间地址?)。

当声明int *prt2 = 0x12345678之后,prt2就是一个指针变量了,

可以对ptr1做++,--,+,-等各种操作,

也可以访问ptr地址中的内容,因为访问的是合法内存地址0x12345678(用户空间地址)。

从Linux内核角度来看,segment fault发生有三种原因:

当应用程序访问一个虚拟地址时,正常情况下,你实际上是在访问处于某个VMA中的一个地址而已。如果你正常的访问,那么一切都如你所愿,MMU读入内核task_struct中记录的表格,然后,虚拟地址正确地转换到物理内存地址。但是,如果: 
1. 如果内核标明这个VMA是只读的,但你偏偏往这个地址段中写,内核自然不能容忍应用程序犯这样的错误。
2. 你可能去访问虚拟地址空间中某个根本没有映射的hole. 刚学指针的 C 程序员总是以为自己无所不能,比如:
int *p = (int *)0x543;
*p = 5;
然后运行程序时,他肯定会很开心地收到段错误,然后为此郁闷一个下午。究其原因其实很简单: 0x543这个地址没有处于一个合法的VMA中,它可能处于一个根本没有和物理内存映射的虚拟空间的hole中. 对于教训新手 C 程序员来说,内核还是非常乐意的,因为新手C程序员离能够驾驭Linux内核的水准至少还差那么三五年时间。
3. 应用程序访问内核空间(0xc000 0000 --> 0xffff ffff),内核早早就说明那不是应用程序应该访问的地址范围。居然敢打内核的主意!这个应用程序一定活得非常不耐烦,是在找抽。

segment fault本质的更多相关文章

  1. 出现segment fault 错误的几种原因

    segment fault 段异常各种原因www.MyException.Cn 发布于:2012-11-26 11:48:50 浏览:24次 0 segment fault 段错误各种原因一 造成se ...

  2. Segment fault及LINUX core dump详解 (zz)

    C 程序在进行中发生segment fault(core dump)错误,通常与内存操作不当有关,主要有以下几种情况: (1)数组越界. (2)修改了只读内存. (3)scanf("%d&q ...

  3. Segment fault及LINUX core dump详解

    源自:http://andyniu.iteye.com/blog/1965571 core dump的概念: A core dump is the recorded state of the work ...

  4. 利用linux信号机制调试段错误(Segment fault)

    在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...

  5. GDB调试之core文件(如何定位到Segment fault)

    core dump又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个core文件中,叫core dump.(内部实现是:linux系统中内存越界会收到SI ...

  6. segment fault异常及常见定位手段

    问题背景 最近boot中遇到个用户态程序的segment fault异常,除了一句"Segment fault"打印外无其他任何打印.该问题复现概率较低,定位起来比较棘手.我们的b ...

  7. gdbserver移植到DM368板子上的过程 以及segment fault problem

    问题描述 我在PC机上安装了gdbserver,但是移植到板子上后却出现了问题.运行不了,显示错误:"segment fault". 决定重新在另一台虚拟机上gdbserver. ...

  8. “段错误(segment fault)”、“非法操作,该内存地址不能read/write” 非法指针解引用造成的错误。

    小结: 1. “段错误(segment fault)”.“非法操作,该内存地址不能read/write”非法指针解引用造成的错误. <程序员的自我修养 : 链接.装载与库> Q 我写的程序 ...

  9. 【Z】段错误Segment Fault定位,即core dump文件与gdb定位

    使用C++开发系统有时会出现段错误,即Segment Fault.此类错误程序直接崩溃,通常没有任何有用信息输出,很难定位bug,因而无从解决问题.今天我们介绍core dump文件,并使用gdb进行 ...

随机推荐

  1. 【BZOJ4547】Hdu5171 小奇的集合 矩阵乘法

    [BZOJ4547]Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这 ...

  2. delphi----Tstringlist,将有符号的数据变成数组"aaa,bbb,ccc"---->list[0]=aaa,list[1]=bbb

    //TStringList 常用方法与属性: var   List: TStringList;   i: Integer; begin   List := TStringList.Create;   ...

  3. 巨蟒python全栈开发-第13天 内置函数 匿名函数lambda

    一.今日内容总览 1.内置函数(1):并不是每一个内置函数都是那么常用 上菜:内置函数部分//思维导图:https://www.processon.com/view/link/5b4ee15be4b0 ...

  4. 网站漏洞扫描工具(appscan,mdcsoft-ips)

    网站漏洞扫描工具:主要应用网站漏洞扫描工具,其原理是通过工具通过对网站的代码阅读,发现其可被利用的漏洞进行告示,通过前人收集的漏洞编成数据库,根据其扫描对比做出. 具体网站扫描工具有:appscan, ...

  5. Vmware VsPhere下的VM安装Hyper-v服务

    问题:Vmware VsPhere下的VM无法安装Hyper-v服务 解决方案:打开vmware vm的安装目录,然后找到.vmx的文件,然后进行修改 打开w-c-w2012.vmx文件 添加如下 h ...

  6. 利用python实现TCP和UDP服务器

    利用python的socket模块可以实现基本的网络编程,并且只限于一对一的连接.当然,也可以在其基础上实现一个网络服务器,但由于太底层这种做法不被推荐.其实如果要实现一个网络服务器很简单,调用pyt ...

  7. 第08章—整合Spring Data JPA

    spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...

  8. kubestack 源码分析

    简介:KubeStack is an OpenStack network provider for kubernetes.KubeStack is devided into two functions ...

  9. matlab循环保存dat文件

    将数据保存为dat文件 这里有两种方法,第一种是: save filename dataname; 这种方法书写简单,但是功能也很简单.这里的filename就是死的filenam,即filename ...

  10. NUnit.Framework的使用方法演示

    using NUnit.Framework; namespace CheckExcel { [TestFixture] public class TestExcelHelper { /// <s ...