Linux的内存管理:
一、内存管理的调用关系
用户层
STL 自动申请/释放内存 调用C++
C++ new/delete 调用C
C malloc/free 调用POSIX 或者 Linux
POSIX brk/sbrk 调用内核kernal
Linux mmap/munmap 调用内核kernal
系统层
kernal kmalloc/vmalloc 调用驱动
driver get_free_page
二、进程映像
程序是存储在磁盘上的可执行文件(二进制文件、脚本文件)
当执行程序时,系统会自动将该文件加载到内存中,在内存的分布情况称为进程映像
从低地址到高地址的分区:
text 代码段
data 数据段
bss 静态数据段
heap 堆
stack栈
environ 环境变量表
argv 命令行参数
命令:ps -aux 查看当前所有进程信息
可以查看进程号
作业:打印出每个内存段中的数据所在的地址,然后与进程的内存信息记录文件中的地址对比
/proc/进程号/maps
总结:
1、栈内存的增长方向,受操作系统影响,大部分是从高地址向低地址增长,但也有些系统例如Ubuntu就是从低地址向高地址增长
2、如果是栈内存存储数组数据,数组中元素的增长方向一定是从低地址向高地址增长
虚拟内存:
1、操作系统会为每个进程分配4G的虚拟内存
2、用户只能使用虚拟内存,不能直接使用物理内存
3、虚拟内存要与物理内存进行映射后才能被用户使用,如果使用了没有映射的虚拟内存就会产生段错误
4、虚拟内存与物理内存的映射由操作系统(MMU)动态维护
5、虚拟内存能让系统使用更安全,不会暴露真实的物理内存地址
另一方面操作系统可以让进程使用比实际物理内存更大的地址空间
6、4G的虚拟内存地址分为两个部分
[0G~3G) 用户空间
[3G~4G) 内核空间
7、当进程\线程运行在用户空间时称进程处于用户态,当进程\线程运行在内核空间时称进程处于内核态
8、当进程处于内核态时,进程运行存储使用在内核空间,此时CPU可以发出执行任何指令,运行的代码不受任何限制,可以自由地访问任意有效的地址,也可以直接访问接口
9、当进程处于用户态时,进程运行存储使用在用户空间,
此时被执行的代码要受到CPU很多的检查:例如:用户进程只能访问自己映射过的内存
10、所有进程的内核
Day03 Linux的内存管理 虚拟内存 系统调用
于 2023-04-30 22:09:27 首次发布