Linux程序地址空间及库函数与系统调用接口
程序地址空间
- 概念:程序地址空间也叫虚拟地址空间,在Linux下,每运行一个程序即一个进程,操作系统都会为其分配一个虚拟的地址空间,在32位操作系统下,操作系统分配的虚拟地址空间为0~4G。
- 进程的内存描述符(mm_struct):每个进程都有一个mm_struct,它是一个结构体,我们也把它叫做内存描述符,Linux就是通过这个结构体实现对内存的管理,mm_struct就是用来描述一个进程的虚拟地址空间
- 虚拟地址空间的分配情况
从下到上为:
受保护的区域 (0~4K)
代码段 – 二进制机器指令
全局区 (已初始化全局变量 (data段) 未初始化全局变量(bss段))
堆 (从下往上存储)
共享库 (c标准库及Linux系统IO函数)
栈 (从上往下存储)
命令行参数
环境变量
内核区 (kernel)
示意图如下 - 为什么要引入虚拟地址空间
1、 虚拟地址空间能够让进程使用连续的内存地址。
2、 它能保证进程的独立性
3、 它能进行内存访问控制,提高内存的利用率 - Linux下内存管理
CPU通过进程描述符task_struct中指向内存描述符的一个指针找到内存描述符,进而通过mm_struct内存描述符查到页表信息,通过页表将虚拟地址映射到实际的物理内存中,进而操作内存。
库函数与系统调用接口
- 关系:库函数其实是对系统调用接口的一层封装,它们是上下级的调用关系,库函数调用了系统调用函数。库函数通过发起系统调用,调用系统调用接口,通过系统调用接口调用设备驱动,再通过设备驱动进而操作硬件设备。
- 示意图如下
还没有评论,来说两句吧...