Linux操作系统中,kernel和设备驱动是运行在内核空间,用户进程运行在用户空间;当用户程序需要访问硬件设备时是通过系统调用,由kernel来完成对硬件设备的访问。
Linux是通过虚拟内存机制来实现对物理内存的访问。
在逻辑上物理内存是通过分区来管理的
1 32位的x86架构下,物理内存空间布局如下:
ZONE_DMA: 0~16M ,该区域的物理页面是专供IO设备使用的,对该部分的物理地址是直接访问的,不经过MMU转换的。并且是连续的物理地址。
ZONE_NORMAL:16~896M,该区域的物理页面是内核能直接使用的
ZONE_HIGHEME: 896M ~ 结束,该区域的物理页面内核不能直接使用
2 Linux虚拟地址内核空间分布
虚拟地址空间的0~3G是用户空间,3~4G是内核空间
内核空间的3G~3G+16M,用于DMA操作
内核空间的3G+16M~3G+896M,用于NORMAL
内核空间的3G+896M~4G,是高端内存区,高端内存区内核不能直接使用,是通过动态映射到物理内存的高896M的空间,使用完就释放。
内核地址的3G+896M是一一映射到物理地址的0-896M空间,在内核初始化时,内核的这部分地址空间已经把地址映射写死。
3 linux虚拟地址用户空间分布
虚拟地址的0~3G的用户空间,也是通过划分不同的线性区来管理的。当有新的用户进程创建时会通过系统调用来加载可执行程序,为进程分配一系列的线性区并存放不同的内容。
分配顺序是,栈段->代码段->数据段->bss->依赖库,堆是在运行过程中动态分配的,由内核中brk和mmap函数实现,C库将其封装成malloc函数。