Memory management 操作系统如何在分页方案中捕获非法内存引用?
我试图理解操作系统是如何在使用分页的系统中捕获所有非法内存访问的。(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)处理器模式,以确定访问是否有效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管理页面表?操作系统是否必须使用“不存在”属性