c++ linux Segmentation fault报错记录
什么是Segmentation fault?
segmentation,分割,分段,segmentation fault就是段错误
的意思。所谓的段错误就是指访问的内存超过了所给这个程序的内存空间,通常这个值是由gdtr来保存的,它是一个48位寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下表,最后3位包括了程序是否在内存中以及程序的cpu中的运行级别,指向的gdt是由64位为一个单位的表,在这张表中就保存着程序运行的代码段、数据段的起始地址、相应的断限和页面交换还有程序运行级别和内存粒度等信息,一旦一个程序发生了越界访问,CPU就会产生相应的异常保护,于是segmentation fault就出现了。
即当程序试图访问不被允许访问的内存区域(比如,尝试写一块属于操作系统的内存),或以错误的类型访问内存区域(比如,尝试写一块只读内存)。这个描述是准确的。为了加深理解,我们再更详细的概括一下SIGSEGV。段错误应该就是访问了不可访问的内存,这个内存要么是不存在的,要么是受系统保护的。
SIGSEGV:SIG是信号名称的一般前缀,SEGV是segmentation violation(分段违规),这是一个内存段错误。可以理解为发生segmentation fault的时候就会发出信号SIGSEGV
- SIGSEGV是在访问内存时发生的错误,它属于内存管理的范畴
- SIGSEGV是一个用户态的概念,是操作系统在用户态程序错误访问内存时所做的处理
- 当用户态程序访问(访问表示读、写或执行)不允许访问的内存时,产生SIGSEGV
- 当用户态程序以错误的方式访问允许访问的内存时,产生SIGSEGV
用户态程序地址空间,特指程序可以访问的地址空间范围。如果广义的说,一个进程的地址空间应该包括内核空间部分,只是它不能访问而已。