操作系统如何阻止程序访问内存?

Tyl*_*ler 4 assembly operating-system cpu-architecture virtual-memory mmu

我目前的理解是

  • 我可以用C编写操作系统

  • 我可以用C语言为该操作系统编写程序

  • 当我编写操作系统时,我可以看到所有内存

  • 当我编写程序时,操作系统会向其他程序隐藏内存。

  • 每当程序在OS内运行时,在程序中似乎就好像分配的内存是计算机拥有的所有内存一样

CPU / OS如何实现这一目标?这是纯粹在软件级别实现的吗?还是也需要硬件实现?

小智 6

它不仅仅在软件级别上。对于英特尔架构,请使用以下几句话:

每个进程的地址空间是隔离的。每个进程具有相同的虚拟地址空间(简化为:0x00000000到0xffffffff),它们映射到不同的物理位置。

地址空间代表内存页面的集合。仅在需要时才对页面进行物理映射。从物理内存中删除长时间未访问的页面(有特殊算法);如果它们包含动态修改的内容,它们将存储在硬盘驱动器上的“交换”文件中。

每个页面都属于特定进程(某些系统页面除外),已分配了虚拟地址和访问标志:读/写/执行。似乎是连续数组的东西,可以分配在几个不连续的页面上,并且其中一些甚至可以现在换出到硬盘上。

程序(进程)只能看到其自己的地址空间。有几种方法可以到达其他进程的空间,但是常规程序很少这样做。

地址空间不是完全可访问的:如果程序尝试访问未分配的地址,或写入受写保护的页面,则会触发内存冲突。

通常,程序只能在其自己的地址空间中分配,取消分配或更改页面的访问标志。内存有多种类型(用于加载可执行映像,用于堆栈以及几种不同类型的可分配内存)。

抱歉,我不记得这本书的书名,很早以前就读过。

  • 关键字:“虚拟内存”,“页面错误”,“页面表”,“ tlb”。该答案没有说明硬件支持进行这些映射。此外,虚拟内存启用了分页/换出冷页的功能,但是如果没有虚拟内存,则可以拥有虚拟内存。对于带有大量RAM的现代CPU上的玩具OS来说肯定是合理的。 (2认同)