❶ 为什么要划分为用户空间和内核空间
Linux虚拟内存的大小为2^32(在32位的x86机器上),内核将这4G字节的空间分为两部分。最高的1G字节(从虚地址
0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而较低的3G字节(从虚地址0x00000000到
0xBFFFFFFF),供各个进程使用,称为“用户空间”。因为每个进程可以通过系统调用进入内核,因此,Linux内核空间由系统内的所有进程共享。
于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟地址空间(也叫虚拟内存).
每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB内核空间则为所有进程以及内核所共享。另外,进程的“用户空间”也叫“地址空间”,在后面的叙述中,我们对这两个术语不再区分。
用户空间不是进程共享的,而是进程隔离的。每个进程最大都可以有3GB的用户空间。一个进程对其中一个地址的访问,与其它进程对于同一地址的访问绝不冲
突。比如,一个进程从其用户空间的地址0x1234ABCD处可以读出整数8,而另外一个进程从其用户空间的地址0x1234ABCD处可以读出整数
20,这取决于进程自身的逻辑。
因此Linux对用户空间与内核空间的划分起到了一定程度上的冲突避免。
❷ Linux的内核空间和用户空间是如何划分的(以32位系统为例)
通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。地址分配如下图所示
直接映射区:线性空间中从3G开始最大896M的区间,为直接内存映射区,该区域的线性地址和物理地址存在线性转换关系:线性地址=3G+物理地址。
动态内存映射区:该区域由内核函数vmalloc来分配,特点是:线性空间连续,但是对应的物理空间不一定连续。vmalloc分配的线性地址所对应的物理页可能处于低端内存,也可能处于高端内存。
永久内存映射区:该区域可访问高端内存。访问方法是使用alloc_page(_GFP_HIGHMEM)分配高端内存页或者使用kmap函数将分配到的高端内存映射到该区域。
固定映射区:该区域和4G的顶端只有4k的隔离带,其每个地址项都服务于特定的用途,如ACPI_BASE等。
❸ 怎样去理解Linux用户态和内核态
在Linux技术讨论中,用户态和内核态的术语常常被提及。用户态与内核态代表的是操作系统架构中两个不同的层面。用户态是应用程序运行的空间,而内核态代表的是操作系统的核心部分,负责控制计算机的硬件资源,如协调CPU资源、分配内存资源并提供稳定环境供应用程序运行。
通过系统调用,整个Linux体系被分为用户态和内核态。系统调用是操作系统最小的功能单位,用于用户态与内核态间的交互。不同Linux发行版本提供的系统调用数量在240-350之间,它们构成了用户态与内核态间交互的基本接口。例如,用户态需要申请内存时,会通过系统调用进行操作。库函数则进一步简化了系统调用的使用,屏蔽了复杂的底层实现细节,提供简单的基本接口给用户,增强了程序的灵活性。
Shell作为操作系统与用户间的接口,可以被视作一层外壳。它提供命令行界面,使得用户可以与系统进行交互。shell脚本是符合shell语法的文本,用于实现常用功能,提高工作效率。
Linux体系架构可以分为多个层次,内核负责管理和控制硬件资源,包括进程调度、内存管理、文件系统管理、设备驱动管理、网络管理等,为应用程序提供统一的系统调用接口。这种分层设计提高了系统的稳定性和扩展性,增强了兼容性。
从用户态到内核态的切换,是通过系统调用来实现的。这涉及到对资源的有效利用与限制,以避免资源访问冲突。内核态与用户态的主要区别在于权限等级不同,用户态进程受限于资源访问控制,而内核态进程则拥有更大的自由度。
实际上,从用户态到内核态的切换有三种方式:通过系统调用、使用特定的内核函数,或是通过硬件中断。系统调用是切换的主要途径,涉及上下文切换,而其他方式在特定场景下可能适用。
综上所述,Linux用户态与内核态的概念是操作系统架构中的关键部分。理解这些概念对于深入学习Linux及其内核原理至关重要。