1.每个进程都有自己的虚拟地址空间,内核也有自己的内核,内核是一堆进程,这是否意味着每个内核进程都有自己的虚拟地址空间?
2.在32位架构系统中,每个进程都有4GB的虚拟地址空间,内核空间的大小是多少?
用户空间的3.0x00000000-0xffffffff被内核占用,但是它们是不同的空格,这是如何实现的?
4.为什么内核需要将某些东西复制到自己的空间?
答案 0 :(得分:3)
每个进程都有自己的虚拟地址空间,内核也有自己的内核,内核是一堆进程,这是否意味着每个内核进程都有自己的虚拟地址空间?
内核可能没有特殊的内核进程。它甚至可能没有特殊的内核线程。例如,在MSDOS中没有,但它是原始操作系统。它只有ISR,各种内部代码(例如文件系统驱动程序,内存管理器等)和应用程序的系统调用API。
操作系统可以通过(或IOW,委托给)用户进程提供一些功能。这就是微内核的想法。与常规流程相比,这些专用流程可能具有其他权限。
在这种情况下,内核几乎是一组可由用户进程以某种方式调用的子例程(DOS就是这样,除了没有进程,并且所有内容都有一个地址空间)。内核仍然必须是所有人都可以访问的,因此,它所驻留的内存在所有地址空间中共享(例如,通过页面转换)。每个内核都有这样一个共同/共享的部分。
在32位架构系统中,每个进程都有4GB的虚拟地址空间,内核空间的大小是多少?
这取决于CPU和内核实现。 32位Windows通常为地址空间的用户和内核部分保留2GB。如果需要,这可以被覆盖为3GB用户和1GB用于内核。
用户空间的0x00000000-0xffffffff被内核占用,但是它们是不同的空格,这是如何实现的?
这取决于CPU的MMU。通过x86上的页表,您可以组织整个虚拟地址空间,使得只有一部分在进程/线程切换期间将其映射更改为物理内存(这是用户部分),而另一部分仍然是相同(这是共享内核部分)。
通常,从CPU的角度来看,只有一个虚拟地址空间。但通常将其部分称为单独的用户和内核虚拟地址空间。
为什么内核需要将某些东西复制到自己的空间?
如何从流程中获取输入,例如系统调用参数?但最重要的是,如果必须异步执行一些长时间的输入处理,只需接收输入,让调用者继续,然后在工作完成时发出信号通知,该怎么办?调用进程可以自由地修改或释放它刚刚传递给内核的数据缓冲区。内核可能不会非常“高兴”地观察它正在变化或消失的数据。如果进程中有多个线程,即使使用同步调用也会发生此问题,因为另一个线程可以更改缓冲区,而内核正在使用它。
将数据复制到地址空间的内核部分或将其保存在地址空间的内核部分可能还有其他原因。