RAM内存中的段

4

我对RAM内存中的段感到困惑,请澄清以下疑问:

  1. RAM被分为用户空间和内核空间;这种内存划分是由操作系统还是由硬件(CPU)完成的?

  2. 内核空间的内容是什么;据我所知,只有内核映像,如果我错了,请纠正我。

  3. 代码、数据、堆栈和堆段存在于哪里?

    a) 用户空间和内核空间是否具有单独的代码、数据、堆栈和堆段?

    b) 这些段是由硬件还是操作系统创建的?

  4. 我能找到内核空间和用户空间占用的内存量吗?

    a) 有没有Linux命令(或)系统调用可以找到这个信息?

  5. 为什么将RAM分成用户空间和内核空间?

    a) 我认为这是为了使内核免受应用程序的影响,是这样吗?这是唯一的原因吗?

我是一个初学者,请推荐一些好书籍、链接以及学习这些概念的方法。


大多数你的问题都太宽泛了,需要复杂而冗长的答案。我怀疑你的问题会被关闭。多读一些资料/搜索一下吧。 - Martin James
请尽量一次只提出一个问题。我无法选择在这里应该回答哪个问题。 - harper
1个回答

5

我接受了挑战,尝试用简短的答案回答:

Execution在用户空间和内核空间中进行。 BIOS和CPU支持操作系统检测和分离资源/地址范围,例如主存储器和设备(->相关问题)以建立受保护模式。在保护模式下,内存通过虚拟地址空间分隔,这些空间被映射为页面(通常是4096字节的块),通过MMU(内存管理单元)将其映射到物理内存的真实地址。

从用户空间,无法直接访问内存(在实模式下),必须通过MMU访问它,MMU充当具有访问保护的透明代理。访问错误称为分段错误、访问冲突、分段违规(SIGSEGV),在高级编程语言(如Java)中用NullPointerException(NPE)抽象化。

阅读有关受保护模式、实模式和“环”的内容。

注意:特殊的CPU(例如嵌入式系统中的CPU)不一定具有MMU,因此可能仅限于像μClinux或FreeRTOS等特殊操作系统。

内核还会分配缓冲区,驱动程序也是如此(例如,磁盘、网络接口和GPU的IO缓冲区)。

一般来说,每个空间和进程/线程都有资源。
a)内核将其自己的受保护堆栈放在用户空间堆栈(每个线程)之上,并且还具有单独的代码(也是“文本”)、数据和堆段。此外,每个进程都有自己的资源。
b)CPU架构具有某些要求(取决于它们提供的支持程度),但最终是软件(用于接口的内核和用户空间库)创建这些结构。

每个合理的操作系统都至少提供一种方法来执行此操作。
a)尝试sudo cat /proc/slabinfo或简单地sudo slabtop

阅读1。
a)主要是这样,就像用户空间进程相互隔离一样,除了特殊技术(例如CMA(跨内存附加))用于新内核中的快速直接访问。

1
嗨,Sam,感谢你花时间回答我的问题,真的很有帮助。我会继续自学后再来请教你的。 - user2972122
@artless noise:感谢您的评论。我真的应该提到MMU,所以我更新了答案。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接