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

时间:2016-12-15 20:09:54

标签: memory-management x86 operating-system paging

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

更具体地说,假设我有一个只有1页大小的小应用程序。考虑到MS OS占用了虚拟内存地址空间的上半部分'而我的小EXE只占VMAS下半部分的4k,那么:

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

2)如何为这个微小的Exe管理页表?操作系统是否必须使用'非现在'来定义所有1 M页面条目(-1页面条目)。属性集和'系统'拥有? (当创建'进程'时)。

任何建议或意见都很好。

修改  只是为了说清楚,答案(编译形式所有慷慨的贡献)是:

为了捕获 未分配 内存的非法引用,应标记 应用 的VMAS作为 用户&不存在 和VMAS的 休息 应标记为 内核&不存在的。 (当然, 已分配 内存具有 用户 属性。请注意 用户和放大器;不存在 是在首次运行之前创建的流程!之后,它会更改为 用户和现在 )。

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

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

3 个答案:

答案 0 :(得分:2)

  

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

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

  1. 该页面是否有页面表条目?如果不是=>访问违规
  2. 页表条目是否有效? 这里的处理是系统特定的,这取决于页表是否可以区分无效页表条目和未映射到页框的有效条目。在前一种情况下=>访问违规。在后一种情况下,它会触发页面错误,操作系统必须确定是否触发访问冲突或加载页面。
  3. 页表是否允许当前处理器模式的访问类型?如果不是=>访问违规。
  4. 如果硬件触发访问冲突异常,它会切换到内核模式并调用操作系统的访问冲突处理程序。

      

    2)如何为这个微小的Exe管理页表?操作系统是否必须使用“非现有”属性集和“系统”所有权来定义所有1 M页面条目(-1页面条目)? (当创建'过程'时)。

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

    发生这种情况取决于操作系统。在太监之地,一个过程是其父母的克隆。程序的运行发生在exec___系统调用中。某些操作系统具有后台命令处理器,允许在单个进程中按顺序运行多个应用程序。

    从那里,应用程序来管理映射到其地址空间的页面。这是通过调用系统服务来完成的。例如,“malloc”调用将导致应用程序使用系统服务来映射页面。

    应用程序的初始状态可能存在无效用户地址漏洞。实际上,有效地址的范围在逻辑地址空间内可能不是连续的。

答案 1 :(得分:1)

  1. 每个页面都包含以下属性: Present Read / Write
    访问不存在的页面或编写只读页面会生成称为页面错误的特权事件。此事件采用CPU执行操作系统设置的特定例程的形式。 因此,OS会被告知事件和所做的尝试。

  2. 用于实现分页的结构是分层的:页面分组为目录,目录分组为更高目录。通常有四个级别 与在文件系统中一样,只需要创建到达特定页面所需的目录。

  3. 明确的信息来源是Intel manuals,特别是第三卷。

    这个答案故意使用简化的单词。

答案 2 :(得分:0)

  

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

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

  

如何为那个微小的Exe管理页表?操作系统是否必须使用“非现有”属性集和“系统”所有权来定义所有1 M页面条目(-1页面条目)? (当创建'过程'时)。

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