跳到主要内容

内存管理

程序的内存布局

代码段

用户存放CPU执行的机器指令。为了防止指令被其他程序修改,代码段一般只读且不可被更改。

初始化数据段

又称为数据段。用于存储初始化的全局变量和static变量。段的大小在编译时确定,所以内存的分配属于静态变量。

未初始化数据段

又称为BSS段,通常用来存放程序中未初始化的全局变量和Static。虽没有显式初始化,但是,在程序载入内存并且执行的时候,由内核清0。

这个数据段的大小将在编译时确定。

用于保存程序运行时动态申请的内存空间。由开发者手动申请,手动释放。

比如使用malloc()函数或者new 申请的内存空间

映射段

该区域内核将文件内容直接映射到内存。任何应用程序都可请求这段区域。

linux系统中可以通过mmap( )系统调用,Windows中通过creatFileMapping( )进行创建。文件进行I/O操作时使用内存映射的方式会更加高效和方便。它常用于加载动态库。

用于保存函数的局部变量(不包括static声明的静态变量)、参数、返回值、函数返回地址、以及调用者的环境信息(比如寄存器值)等。由系统进行统一管理。在函数执行完成之后,系统将自行释放栈区内存,不需要用户进行管理。

内核空间

用于存储操作系统和驱动程序。用户空间用于存储用户的应用程序,二者不能简单使用指针传递数据。当一个进程执行系统调用而陷入内核空间执行代码时,该程序将会处于内核运行态(或内核态)。此时,处理器处于特权最高的0级内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。同样的,当程序在执行用户自己的代码的时候,程序将会处于用户运行态(用户态)。也就是此时处理器在执行最低特权(3级)的用户代码中。

总结

![image-20221113212537476](/Users/cat/Library/Application Support/typora-user-images/image-20221113212537476.jpg)