Memory management 操作系统如何在分页方案中捕获非法内存引用?

Memory management 操作系统如何在分页方案中捕获非法内存引用?,memory-management,x86,operating-system,paging,Memory Management,X86,Operating System,Paging,我试图理解操作系统是如何在使用分页的系统中捕获所有非法内存访问的。(32位,x86,已启用分页) 更具体地说,让我们假设我有一个只有一页大小的小应用程序。考虑到MS操作系统占用了“虚拟内存地址空间”的上半部分,而我的微型EXE只占用了VMA下半部分的4k,那么: 1)当我的代码试图从我自己的Exe的4k之外写入内存位置时,操作系统如何意识到存在“非法内存引用/访问”?(显然,该指针不是从“malloc”或类似调用中获得的) 2)如何为这个微小的Exe管理页面表?操作系统是否必须使用“不存在”属性

我试图理解操作系统是如何在使用分页的系统中捕获所有非法内存访问的。(32位,x86,已启用分页)

更具体地说,让我们假设我有一个只有一页大小的小应用程序。考虑到MS操作系统占用了“虚拟内存地址空间”的上半部分,而我的微型EXE只占用了VMA下半部分的4k,那么:

1)当我的代码试图从我自己的Exe的4k之外写入内存位置时,操作系统如何意识到存在“非法内存引用/访问”?(显然,该指针不是从“malloc”或类似调用中获得的)

2)如何为这个微小的Exe管理页面表?操作系统是否必须使用“不存在”属性集和“系统”属性定义所有1M页条目(-1页条目)?(创建该“流程”时)

任何建议或评论都会受到欢迎

编辑: 为了说明问题,答案(由所有慷慨捐款汇总而成)是:

为了捕获未分配内存的非法引用,应用程序的VMA应标记为用户和不存在,VMA的其余部分应标记为内核和不存在。 (当然,分配的内存具有用户属性。请注意,用户和不存在的在第一次运行之前处于“进程创建”状态。之后它将更改为用户和存在的

这样,硬件监视器将捕获应用程序边界之外的任何访问!!! 页面错误处理程序将假定非法访问,因为不允许用户代码访问(读/写)内核页面

[VMAS=虚拟内存地址空间]

当我的代码试图从自己的Exe的4k写入外部的内存位置时,操作系统如何意识到存在“非法内存引用/访问”?(显然,该指针不是从“malloc”或类似调用中获得的)

引发页面错误并执行页面错误处理程序。在内存访问无效的情况下,它会终止程序。在访问交换内存的情况下,它会将磁盘中的内存内容再次恢复到主内存中,并让程序继续

如何为那个微小的Exe管理页面表?操作系统是否必须使用“不存在”属性集和“系统”属性定义所有1M页条目(-1页条目)?(创建该“流程”时)

在x86上,有两级页面结构:页面目录和页面表。假设您的程序适合于单个页面,操作系统将初始化一个页面目录,该目录只包含一个指向页面表的有效条目,并且只包含一个指向包含所需内存的页面的有效条目

当我的代码试图从自己的Exe的4k写入外部的内存位置时,操作系统如何意识到存在“非法内存引用/访问”?(显然,该指针不是从“malloc”或类似调用中获得的)

引发页面错误并执行页面错误处理程序。在内存访问无效的情况下,它会终止程序。在访问交换内存的情况下,它会将磁盘中的内存内容再次恢复到主内存中,并让程序继续

如何为那个微小的Exe管理页面表?操作系统是否必须使用“不存在”属性集和“系统”属性定义所有1M页条目(-1页条目)?(创建该“流程”时)

在x86上,有两级页面结构:页面目录和页面表。假设您的程序适合于单个页面,操作系统将初始化一个页面目录,该目录只包含一个指向页面表的有效条目,并且只包含一个指向包含所需内存的页面的有效条目

1) 当我的代码试图从自己的Exe的4k写入外部的内存位置时,操作系统如何意识到存在“非法内存引用/访问”?(显然,该指针不是从“malloc”或类似调用中获得的)

必须发生一系列事件。处理器将(a)正在访问的逻辑页作为输入;(b) 访问类型;以及(c)处理器模式,以确定访问是否有效

  • 该页是否有页表条目?If not=>访问冲突
  • 页表条目是否标记为有效? 这里的处理是特定于系统的,这取决于页面表是否能够区分无效的页面表条目和未映射到页面框架的有效条目。在前一种情况下=>访问冲突。在后一种情况下,它会触发页面错误,操作系统必须确定是触发访问冲突还是加载页面
  • 页表是否允许当前处理器模式的访问类型?如果没有=>访问冲突
  • 如果硬件触发访问冲突异常,它将切换到内核模式并调用操作系统的访问冲突处理程序

    2) 如何为那个微小的Exe管理页面表?操作系统是否必须使用“不存在”属性集和“系统”属性定义所有1M页条目(-1页条目)?(创建该“流程”时)

    操作系统提供将内存映射到进程地址空间的系统服务。通常,程序加载器读取EXE文件中的指令,并调用页面映射系统服务来设置应用程序的初始状态

    发生这种情况的时间取决于操作系统。在宦官的土地上,过程是其父代的克隆。程序的运行发生在exec系统调用中。一些操作系统有一个后台命令处理器,允许在一个进程内顺序运行多个应用程序

    从那以后,这取决于