首页 > 试题广场 >

.请你来说一下什么时候会发生段错误

[问答题]

请你来说一下什么时候会发生段错误

  • MMU在做逻辑地址到物理地址的转换时发生2次检查
  • 一,检查逻辑地址是否在某个已定义的内存映射区域,这一步通过和mm_struct中,mmap指针所记录的vm_area_struct链表中的每个每个节点所限定的虚拟内存区域比较 实现。vm_area_struct结构中的vm_start和vm_end成员记录该节点所定义的虚拟内存区域的起始/结束地址(逻辑地址)。如果要访问的地址不在任何一个区域中,则说明是一个非法的地址。Linux在搜索vm_area_struct是,不是使用链表,而是使用树结构加速查找速度。
  • 二,MMU得到该地址的页表项,检查页表项中的权限信息,如果操作(读/写)与权限不符,则触发保护异常。
  • 上述两种操作都会导致段错误。
发表于 2020-05-17 15:48:32 回复(0)

发生在访问非法内存的时候

1、使用野指针(指针常量没有初始化;指向一块内存已经释放掉的地址;指针操作超过了定义域)

2、试图修改字符串常量的内容

编辑于 2021-08-09 10:16:46 回复(0)
段错误是计算机软件运行过程中可能出现的一种特殊错误情况。当程序试图访问不允许访问的内存位置,或试图以不允许的方式访问内存位置(例如尝试写入只读位置,或覆盖部分操作系统)时会发生段错误。分段是操作系统内存管理和保护的一种方法。在大多数情况下,它已经被分页所取代,但是分段的许多术语仍然被使用,“分段错误”就是一个例子。尽管分页被用作主内存管理策略,但有些操作系统在某些逻辑级别上仍然有分段。在类Unix操作系统上,访问无效内存的进程接收SIGSEGV信号。在Microsoft Windows上,访问无效内存的进程会收到状态“访问冲突”异常
发表于 2021-03-20 11:09:05 回复(1)
MMU在做逻辑地址到物理地址的转换时发生2次检查 一,检查逻辑地址是否在某个已定义的内存映射区域,这一步通过和mm_struct中,mmap指针所记录的vm_area_struct链表中的每个每个节点所限定的虚拟内存区域比较 实现。vm_area_struct结构中的vm_start和vm_end成员记录该节点所定义的虚拟内存区域的起始/结束地址(逻辑地址)。如果要访问的地址不在任何一个区域中,则说明是一个非法的地址。Linux在搜索vm_area_struct是,不是使用链表,而是使用树结构加速查找速度。 二,MMU得到该地址的页表项,检查页表项中的权限信息,如果操作(读/写)与权限不符,则触发保护异常。 上述两种操作都会导致段错误。 段错误通常发生在访问非法内存地址的时候,具体来说分为以下几种情况: 使用野指针 试图修改字符串常量的内容
编辑于 2020-09-04 10:02:13 回复(0)