要谈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. xmpp muc 群聊协议 1

    翻译来自 :http://wiki.jabbercn.org/index.php?title=XEP-0045&variant=zh-cn#.E6.9C.AF.E8.AF.AD 通用术语 Af ...

  2. org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x160fd6f04410017 after 0ms

    dubbo报错: org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x160fd6f04410017 after ...

  3. XXE(xml外部实体注入漏洞)

    实验内容 介绍XXE漏洞的触发方式和利用方法,简单介绍XXE漏洞的修复. 影响版本: libxml2.8.0版本 漏洞介绍 XXE Injection即XML External Entity Inje ...

  4. Powershell Get-FileHash

    File Hash (Get-FileHash C:\fso\myfile.txt).hash Get-FileHash C:\Users\Andris\Downloads\Contoso8_1_EN ...

  5. color depth 色彩深度 像素深度

    Screen.colorDepth - Web APIs | MDN https://developer.mozilla.org/en-US/docs/Web/API/Screen/colorDept ...

  6. git --fast-version-control

    --distributed-is-the-new-centralized 读二进制文件 python  读doc  xls 几乎所有的版本控制系统都以某种形式支持分支.使用分支意味着你可以把你的工作从 ...

  7. T-SQL with关键字 with as 递归循环表

    )SET @OrgId = N'901205CA-6C22-4EE7-AE4B-96CC7165D07F'; WITH Childs AS ( SELECT * FROM HROrgRelation ...

  8. json/pickle/shelve/xml/configparser/hashlib/subprocess - 总结

    序列化:序列化指把内存里的数据类型转成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes为什么要序列化:可以直接把内存数据(eg:10个列表,3个嵌套字典)存到硬盘 ...

  9. mysql 内置功能 函数 date_format函数

    创建数据库db12 create database db12 charset=utf8; use db12; 准备表和记录 CREATE TABLE blog ( id INT PRIMARY KEY ...

  10. FileZilla Server IP限制设置

      上面那个是黑名单. * 代表所有   下面那个是白名单. 多个是用 空格 分割