c - 硬件进程是 "sandboxed"吗?

标签 c assembly operating-system kernel cpu

进程能否访问所有 RAM 或 CPU 是否为进程提供内核决定的特定部分,并且进程(在用户空间中运行)不能更改?换句话说 - 一个进程是否被硬件沙盒化,或者它可以做任何事情,但被操作系统监控?

编辑

我在评论中被告知这太宽泛了,所以让我们假设 x86/x64。我还要补充一点,这个问题是在阅读我所理解的进程可以访问所有 RAM 的内容时出现的——这似乎与我所阅读的有关操作系统安全性的内容相冲突。

最佳答案

如果您将 MS-DOS 视为“操作系统”,那么进程可以做任何事情(并且不受监视)。即使是 Windows95 也没有真正的内存保护,一个错误的进程可能会因为在错误的内存上乱写而导致机器崩溃。

如果您只计算具有特权分离的现代操作系统(Unix/Linux、Windows NT 及其衍生版本),那么进程是沙盒化的。

据我所知,除了“如果你尝试做某事就会出错”之外,没有真正的系统可以进行任何类型的监控。内核设置边界,如果用户空间进程试图超出边界,则会出现错误。

如果您想象内核可能会查看非特权进程的行为,并相应地进行调整,那么不,这不是发生的事情。


  • https://en.wikipedia.org/wiki/Memory_protection :通常通过为每个进程提供自己的虚拟地址空间(virtual memory)来实现。这是硬件支持的:您的代码使用的每个地址都通过快速转换缓存 ( TLB ) 转换为物理地址,它缓存操作系统设置的转换表(也称为页表)。

    进程不能直接修改自己的页表:它必须要求内核将更多的物理内存映射到它的地址空间(例如,作为 malloc() 的一部分)。因此内核有机会在执行请求之前验证请求是否正常。

    此外,一个进程可以要求内核将数据复制到/从文件(或其他东西)到它的内存空间。 (写入/读取系统调用)。

  • https://en.wikipedia.org/wiki/User_space : 正常进程在用户模式下运行,这是一种由硬件提供的模式,特权指令将陷入内核。

关于c - 硬件进程是 "sandboxed"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39560954/

相关文章:

c - 在扩展 asm 输出参数中使用 "+"修饰符时输入参数索引?

c# - 尝试在 C# 中创建基本编译器,获取访问冲突错误

c - 我如何知道嵌入式系统项目是否正在使用嵌入式操作系统?

c - 在端口扫描器中使用非阻塞套接字

c - 从 C 中的命令行参数打印整数

c - 在 fork/execvp 控制不返回父级之后

memory-management - 在内存分配中 - 12 位页面偏移量实际上是做什么用的?

在 Linux 系统中更改日期,但重启后新日期丢失

gcc - 与 Intel 语法相比,AT&T 语法中源操作数的顺序是什么?

你能在 Linux 中手动分配虚拟页面吗?