1、Linux内核空间与用户空间
Linux的虚拟地址空间范围为0~4G(x86 32位),通常32位Linux内核地址空间划分为0~3G为用户空间,3~4G为内核空间。
每个进程都可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。从这个角度来说,每个进程可以拥有4G的虚拟空间。
Linux使用两级保护机制:0级供内核使用,3级供用户程序使用,每个进程有各自的私有用户空间(0~3G),这个空间是进程独立的,其他进程不可见的。最高的1G虚拟内核空间则为所有进程以及内核共享的。
内核空间存放的是内核代码和数据,而进程的用户空间存放的是用户程序的代码和数据。不管是内核空间还是用户空间,他们都处于虚拟空间中。虽然内核空间占据了每个虚拟空间中的最高1G字节,但映射到物理内存却总是从最低地址开始(0x00000000)
使用虚拟地址可以很好的保护内核空间不被用户空间破坏,虚拟地址到物理地址转换过程由操作系统和CPU共同完成:操作系统为CPU设置好页表,CPU通过MMU单元进行地址转换。
2、每个进程的内存分布
自底向上的方式进行讲解:
1. 代码段:主要是程序的代码以及编译时静态链接进来的库。这段内存大小在程序运行之前就已经确定,而且是只读,可能存在一些常量,比如字符串常量。
2. 数据段:分为data和bss两个段,表现为静态内存段,data段存放已初始化的全局变量(静态内存分配的变量和初始化全局变量)。bss段存放未初始化的全局变量,在内存中bss段被清零。
3. 堆 段:用于程序动态内存分配和管理,如何分配和管理由程序的开发者决定,大小不固定(跟您的机器内存有关系),可以动态伸缩。
4. 映射段:该内存区域存放链接其它动态程序库的向量,共享内存映射向量等等。
5. 栈 段:栈是一种先进后出的数据结构,该段内存区域由程序在运行中自行管理,如:局部变量、临时变量、函数调用的返回指针等。
6. 输入的环境变量和参数段:主要内存程序执行时的环境变量,输入参数等等。
7. 就是系统区域。
3、查看Linux下 栈和堆空间的大小
ulimit -s:查看linux的默认栈空间大小
du -sh:查看当前目录占用空间的大小
df -h:以磁盘分区为单位来查看文件系统的大小