在操作系统中,是什么实施了内存保护?

10 浏览
0 Comments

在操作系统中,是什么实施了内存保护?

通常情况下,我知道一个进程无法写入具有禁止写入权限的内存(在其地址空间中)。\n但是谁来检查进程是否可以执行此操作?是否有任何汇编指令经过操作系统?它是如何工作的?

0
0 Comments

在操作系统中,内存保护的执行是通过硬件来支持的。通常,在描述分配的内存块的信息中,会有一个位来指示该内存块是否可以执行。在英特尔处理器中,这被称为NX(Never Execute)位,而AMD称之为XD(Execution Disabled)位。

具体来说,NX位指的是页表中64位条目中的第63位(即最高有效位)。如果将该位设置为0,则可以从该页执行代码;如果设置为1,则不允许从该页执行代码,该页上的任何内容都被假定为数据。

在操作系统将可执行代码加载到内存后,该位由操作系统设置。它只能由特权代码(例如操作系统或驱动程序)设置。

为了保护内存免受恶意代码的攻击,操作系统需要确保只有被信任的代码能够执行。通过使用NX位或XD位,操作系统可以限制可执行代码的执行范围,从而避免恶意代码在内存中执行。

相关链接:

- NX位:http://en.wikipedia.org/wiki/NX_bit

- 可执行空间保护:http://en.wikipedia.org/wiki/Executable_space_protection

0
0 Comments

操作系统中的内存保护是由页面表实现的。页面表中包含了当前正在执行的进程的内存空间的所有信息。当你尝试访问只读内存进行写操作,或者访问不属于你的内存时,处理器无法找到对应的映射(或者看到你无法写入该内存),会向操作系统发出页面错误。然后,操作系统会判断这是否是一个写时复制页面,如果你访问的页面确实属于你,但尚未映射,或者你只是访问了错误的内存空间,并相应地处理它(通常会通过段错误终止进程,如果你访问了错误的内存空间)。

那么为什么需要内存保护以及如何实现呢?在操作系统中,每个进程都有自己的内存空间,包括代码、数据和堆栈。这些内存空间是相互隔离的,以确保每个进程都可以安全地访问自己的内存,而不会干扰其他进程的内存。

然而,有时候程序可能会出现错误,比如试图访问只读内存进行写操作,或者访问不属于自己的内存。如果没有内存保护机制,这些错误可能会导致操作系统崩溃或其他进程受到影响。

为了解决这个问题,操作系统引入了内存保护机制,其中的一个重要组成部分就是页面表。页面表存储了每个进程的内存映射关系,包括哪些内存地址属于该进程以及对应的权限(读、写、执行等)。当程序访问内存时,处理器会根据页面表的信息来判断该访问是否合法。

如果访问违反了内存保护规则,处理器会触发一个页面错误(page fault)中断,将控制权交给操作系统。操作系统会根据页面错误的类型和原因来处理,可能会进行以下几种操作之一:

1. 如果访问的内存是只读的,但程序试图进行写操作,操作系统会将其视为一个拷贝写操作(copy-on-write),即先将只读页面复制一份给当前进程,然后再进行写操作。

2. 如果访问的内存尚未映射到当前进程的地址空间,操作系统会进行页面映射,将对应的内存页映射到进程的地址空间中。

3. 如果访问的内存根本不属于当前进程,即访问了错误的内存空间,操作系统会终止该进程,并向用户报告段错误(segmentation fault)。

通过这些处理,操作系统能够保护每个进程的内存空间,防止非法访问和错误操作对系统的影响。页面表作为内存保护的关键机制之一,能够确保每个进程只能访问属于自己的内存,提高了系统的稳定性和安全性。

0
0 Comments

大多数现代CPU(Intel x86,大多数ARM版本)会自行执行内存保护检查。CPU会在其中一个寄存器中存储一段数据结构的地址,该数据结构指定了内存的布局(“页表”)- 具体而言,指定了哪些地址可读,哪些可写,哪些可执行。CPU中的每个内存访问操作都会与页表进行比对。

当程序尝试对一个相应页表条目不允许的内存位置进行操作时,CPU会生成一个异常(中断),然后操作系统获得控制权。进一步的操作取决于操作系统。一种常见的情况是操作系统显示错误消息并终止有问题的程序。但不一定总是如此。例如,通过相同的机制实现了页面交换(将内存写入磁盘上的页面文件,并在需要时读取回来)。

页表由操作系统维护,通常对用户空间代码不可见。操作系统中与此相关的部分是与硬件相关的。

0