0

1.每个进程都有自己的虚拟地址空间,内核也有自己的,内核是一堆进程,是不是每个内核进程都有自己的虚拟地址空间?

2.在32位架构系统中,每个进程都有4GB的虚拟地址空间,内核空间的大小是多少?

一个用户空间的3.0x00000000-0xffffffff被内核占用,但是它们是不同的空间,这是如何实现的?

4.为什么内核需要将某些东西复制到自己的空间中?

4

1 回答 1

3

每个进程都有自己的虚拟地址空间,内核也有自己的,内核是一堆进程,这是否意味着每个内核进程都有自己的虚拟地址空间?

内核可能没有特殊的内核进程。它甚至可能没有特殊的内核线程。例如,MSDOS 中没有,无论它是多么原始的操作系统。它所拥有的只是 ISR、用于各种事物的大量内部代码(例如文件系统驱动程序、内存管理器等)以及用于应用程序的系统调用 API。

操作系统的某些功能可以由(或,IOW,委托给)用户进程提供。这就是微内核的想法。与常规进程相比,这些专用进程可能具有额外的特权。

在这种情况下,内核几乎是一组可由用户进程以某种方式调用的子例程(DOS 就是这样,除了没有进程并且所有东西都有一个地址空间)。内核仍然必须可供所有人访问,因此,它所在的内存在所有地址空间之间共享(例如,通过页面转换)。每个内核都有这样一个公共/共享部分。

在 32 位架构系统中,每个进程都有 4GB 的虚拟地址空间,内核空间的大小是多少?

这取决于 CPU 和内核实现。32 位 Windows 通常为地址空间的用户和内核部分保留 2GB。如果需要,可以将其覆盖为用户 3GB 和内核 1GB。

一个用户空间的0x00000000-0xffffffff被内核占用,但是它们是不同的空间,这是如何实现的?

这取决于 CPU 的 MMU。使用 x86 上的页表,您可以组织整个虚拟地址空间,使得在进程/线程切换期间只有一部分更改其到物理内存(这是用户部分)的映射,而另一部分仍然是相同(这是共享内核部分)。

通常,从 CPU 的角度来看,只有一个虚拟地址空间。但是将其部分称为单独的用户和内核虚拟地址空间是很常见的。

为什么内核需要将某些东西复制到自己的空间中?

它如何从进程中获取输入,例如系统调用参数?但最重要的是,如果它必须异步执行一些长时间的输入处理,只接受输入,让调用者继续,然后在工作完成时向调用者发出信号怎么办?调用进程可以自由地修改或释放它刚刚传递给内核的数据缓冲区。内核可能不太“高兴”地观察它正在处理的数据发生变化或消失。如果进程中有多个线程,即使是同步调用也会出现这个问题,因为另一个线程可以改变缓冲区,而内核正在使用它。

将数据复制到地址空间的内核部分或将其保存在地址空间的内核部分中可能还有其他原因。

于 2012-10-05T03:20:57.010 回答