Linux进程的虚拟存储器知识点

来源:互联网 发布:linux开启ftp服务 编辑:程序博客网 时间:2024/06/05 16:08

这里写图片描述

用libreoffice画表真时有点蛋疼,效率很低..

深入理解计算机系统->虚拟存储器

内核虚拟存储器

操作系统处理进程时分为用户态和内核态.虚拟存储器中,进程虚拟存储器占大部分空间,内核虚拟存储器占小部分空间.

与进程相关的数据结构

每个进程都不相同.所以并不是每个进程的内核虚拟存储器都相同,里边有各个进程不同的部分.

这块区域相关联:
1.task_struct
(1) state:进程状态
(2)thread_info:进程信息和内核堆栈
(3)run_list,array:用于进程调度
(4)mm:进程地址空间
(5)pid:进程id
(6)group_info:群组管理
(7)user:用户管理
(8)fs:工作目录,根目录
(9)signal:信号信息
(10)sighand:信号处理
(11)程序计数器
等等….
其中最重要的时mm,就是mm_struct

2.mm_struct
(1)pgd:指向第一级页表基址
(2)mmap:指向一个vm_area_struct(区域结构)的链表,每个vm_area_struct都描述了当前虚拟地址空间的一个区域(area).
等等…
重点mmap.

3.vm_area_struct
(1)vm_end
(2)vm_start
(3)vm_prot:读写许可权限
(4)vm_flags:是私有还是共享的
(5)vm_next:指向链表中的下一个区域结构

物理存储器与内核代码和数据

相关知识点:何时从用户态转变成内核态.

进程虚拟存储器

共享库的存储器映射区域

linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器的内容,这个过程称为存储器映射.

如果系统的可执行文件依赖共享库,则被映射到该区域.譬如printf函数等等…

未初始化数据.bss,已初始化数据.data和程序文件.text

这三部分分别称为BSS段,数据段和代码段.
BSS段:未初始化或者初值=0的全局变量静态变量.
数据段:已初始化且初值!=0的全局变量静态变量.
代码段:可执行代码,字符串字面值,只读变量.
注:局部变量在栈中.

栈和堆

1.由编译器自动分配释放.

2.本函数中栈的用途
把局部变量压入栈保存

3.调用函数时栈的用途
(1)存储被调用函数的参数值
(2)返回地址入栈
(3)被调用函数使用的非静态局部变量以及编译器自动生成的其他临时变量.
(4)保存上下文,保存函数调用前后需要保持不变的寄存器.

4.函数被调用时,数据入栈顺序
(1)被调用的函数的参数(C编译器中,参数从右到左入栈)
(2)返回地址
(3)旧的%ebp地址,用于还原.
(4)保存的寄存器
(5)新函数的局部变量和其他数据.

注意:静态变量不入栈.本次函数结束后,还原现场.具体看<<深入理解计算机系统>> 第3.7节.

5.跟数据结构的栈特性相同,后进先出.见图可知,入栈时,向低地址扩展.

1.一般由程序员分配释放.
相关知识点还包括垃圾回收.

2.程序员使用new,delete(动态分配指令)时,就会在进程的堆区域产生数据.

3.堆的知识点,主要时动态存储器分配时的知识点,包括
(1)分配器类型:隐式分配器和显式分配器.
(2)对齐问题
(3)碎片问题
(4)实现分配器:如何记录空闲块,如何放置,如何分割,如何合并
(5)隐式空闲链表
(6)显式空闲链表
(7)分离空闲链表
(8)垃圾回收

以上内容全部来源<<深入理解计算机系统>>.这里只是做个小小的总结,也可以说是小小的笔记.详细内容请阅读书本.

0 0