assembly - 操作系统如何阻止程序访问内存?
问题描述
我目前的理解是,
我可以用 C 编写操作系统
我可以用 C 为那个操作系统编写一个程序
当我写一个操作系统时,我可以看到所有的内存
当我编写程序时,操作系统会向我隐藏其他程序的内存。
每当一个程序在操作系统中运行时,它对程序的印象就好像它分配的内存是计算机拥有的所有内存
CPU / OS如何实现这一点?这是纯粹在软件级别上实现的吗?还是它也需要硬件实现?
解决方案
它不仅仅是软件层面的。对于英特尔架构的几句话:
每个进程的地址空间是隔离的;每个进程都有相同的虚拟地址空间(让我们简化一下:0x00000000 到 0xffffffff),映射到不同的物理位置。
地址空间代表内存页面的集合。页面仅在需要时进行物理映射。将长时间未访问的页面(有特殊算法)从物理内存中删除;如果它们包含动态修改的内容,它们将存储在硬盘驱动器上的“交换”文件中。
每个页面都属于特定的进程(除了一些系统页面),分配了虚拟地址和访问标志:读/写/执行。看似连续的数组,可以分配在几个不连续的页面上,其中一些甚至可以换出到硬盘驱动器。
程序(进程)只能看到自己的地址空间。有几种方法可以到达其他进程的空间,但常规程序很少这样做。
地址空间不可完全访问:如果程序试图访问未分配的地址,或写入写保护页,将触发内存违规。
通常,程序只能在自己的地址空间中分配、取消分配或更改页面的访问标志。有多种类型的内存(用于加载可执行映像、用于堆栈以及用于几种不同风格的可分配内存)。
对不起,我不记得书名了,很久以前读过的。
推荐阅读
- javascript - 如果电子表格中有图像,为什么 XMLHttpRequest 无法在 Firefox 中发送 excel 文件?
- python - .env 文件与 Python / Django 有什么关系?
- floating-point - 没有下溢和上溢,是否有任何2个数字,十进制形式的A < B,但转换为浮点后的A > B?
- php - Yii 2 不从 mysql 数据库中渲染表情符号
- javascript - 为什么即使函数无法调用,函数调用的参数部分中的表达式也会被评估?
- azure - 将现有应用的 B2C 本地帐户注册从电子邮件更改为用户名
- node.js - aws lambda 节点包需要 python
- javascript - NodeJS:“未定义不是有效的 uri 或选项对象”与请求
- html - CSS类嵌套不起作用
- ethereum - 来自 eth.coinbase 的 eth.sendTransaction 进行多次交易并减少 eth.coinbase 余额