Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该空间是块大小为4G的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可使用比实际物理内存更大的地址空间(具体的原因请看硬件基础部分)。
在讨论进程空间细节前,这里先要澄清下面几个问题:
第一、4G的进程地址空间被人为的分为两个部分----用户空间与内核空间。用户空间从0到3G(0xC0000000),内核空间占据3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间虚拟地址。只有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间。
第二、用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表(init_mm.pgd),用户进程各自有不同的页表。
第三、每个进程的用户空间都是完全独立、互不相干的。
问题:1、4G的线性虚拟空间是指系统为每个进程分配的还是系统把物理内存虚拟成4G?
2、4G中用户占0到3G,内核占3G到4G,此处的内核是不是控制该进程运行及提供运行环境的内核,还是别的作用,还是整个内核?


eastage 于 2008-03-02 01:11:36发表:
1、4G的线性虚拟空间是指系统为每个进程分配的还是系统把物理内存虚拟成4G?
我想4G应该只是说理论上每个进程可以拿到的最大值,但是创建时不用按这个最大值给每个进程分配,
有些是在运行时分配的,分配的意思也就是给用到的线性地址指定相应的物理页框。
2、4G中用户占0到3G,内核占3G到4G,此处的内核是不是控制该进程运行及提供运行环境的内核,还是别的作用,还是整个内核?
内核(代码,数据,堆,栈)当然是在3G到4G的这个线性地址范围内,当然是整个内核。
在用户态用户进程在运行时,内核代码是没有起作用的,但是当硬中断,系统调用等引致用户态和内核态切换后,
作为管理者身份的内核代码就开始运行了,完成中断处理或是进程切换等。