Segmentation Fault错误原因 (段错误)

2018-01-08 13:34:56来源:网络收集作者:纳米程序员人点击

分享

阿里云爆款
一、什么是“Segmentation Fault in Linux”


    A segmentation fault (often shortened to SIGSEGV) is a particular error condition that can occur during the operation of computer software. A segmentation
fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (for example, attempting to write to a read-only location, or to overwrite part of the operating
system).



    Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much
of the terminology of segmentation is still used, "segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.



    On Unix-like operating systems, a process that accesses an invalid memory address receives the SIGSEGV signal. On Microsoft Windows, a process that accesses
invalid memory receives the STATUS_ACCESS_VIOLATION exception.



        就是:所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是segmentation
fault就出现了。



        即“当程序试图访问不被允许访问的内存区域(比如,尝试写一块属于操作系统的内存),或以错误的类型访问内存区域(比如,尝试写一块只读内存)。这个描述是准确的。为了加深理解,我们再更加详细的概括一下SIGSEGV。段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的。



Ø  SIGSEGV是在访问内存时发生的错误,它属于内存管理的范畴



Ø  SIGSEGV是一个用户态的概念,是操作系统在用户态程序错误访问内存时所做出的处理。



Ø  当用户态程序访问(访问表示读、写或执行)不允许访问的内存时,产生SIGSEGV。



Ø  当用户态程序以错误的方式访问允许访问的内存时,产生SIGSEGV。



用户态程序地址空间,特指程序可以访问的地址空间范围。如果广义的说,一个进程的地址空间应该包括内核空间部分,只是它不能访问而已



 


二、SIGSEGV产生的可能情况


        指针越界和SIGSEGV是最常出现的情况,经常看到有帖子把两者混淆,而这两者的关系也确实微妙。在此,我们把指针运算(加减)引起的越界、野指针、空指针都归为指针越界。SIGSEGV在很多时候是由于指针越界引起的,但并不是所有的指针越界都会引发SIGSEGV。一个越界的指针,如果不解引用它,是不会引起SIGSEGV的。而即使解引用了一个越界的指针,也不一定会引起SIGSEGV。这听上去让人发疯,而实际情况确实如此。SIGSEGV涉及到操作系统、C库、编译器、链接器各方面的内容,我们以一些具体的例子来说明。



(1)错误的访问类型引起


1

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台