process - 操作系统如何将进程彼此隔离?
问题描述
假设 CPU 处于保护模式:
当一个 ring-0 内核建立一个 ring-3 用户空间进程时,它必须修改哪个 CPU 级别的数据结构以指示该特定进程可以访问哪个虚拟地址空间?
它是否只是将全局描述符表中所有其他内存段的特权位设置为(环)0?
解决方案
每个进程都有一组它使用的页表。在 x86 上,这意味着带有一些页表的页目录。页目录的地址将在 CR3 寄存器中。每组页表都将映射内核(具有内核权限),因此当您进行系统调用时,内核可以访问它自己的页面。用户进程无法访问这些页面。执行上下文切换时,会将 CR3 寄存器中的地址更改为将要执行的进程的页表。因为每个进程都有一组不同的页表,所以它们各自对内存有不同的看法。为了确保没有两个进程可以访问相同的物理内存,您应该有某种物理内存管理器,可以查询尚未映射到任何其他页表中的全新内存区域。
因此,只要每个 Process 结构跟踪它自己的页表结构,您必须修改的唯一 cpu 级数据结构就是 CR3 寄存器。
推荐阅读
- flutter - 插件 `flutter_plugin_android_lifecycle` 使用了已弃用的 Android 嵌入版本
- c# - 在 while 循环中调用 StringBuilder.ToString() 调试 .NET 内存泄漏
- git - Git添加不起作用,推送已删除的文件
- google-maps - WebGL Overlay 谷歌地图:如何投射阴影?
- reactjs - Reactjs 单元测试:如何覆盖 useEffect 钩子中的代码?使用 Jest 和 Enzyme
- recaptcha - Recptcha V3 与原型版本冲突:'1.7' 问题
- javascript - Javascript - 文档查询选择器
- python - 如何在流式传输期间每 n 秒获取特定帧?
- php - 作曲家需要没有命令
- java - 尝试在 Eclipse 中构建 Gradle 项目时出错