@@ -78,5 +78,66 @@ linux用clone方法创建线程。其工作方式类似与fork,但启用了精
7878
7979地址空间的最大长度与实际可用的物理内存数量无关,这被称为虚拟地址空间。
8080
81+ 2^10byte=1Kib 2^20byte=1Mib 2^30byte=1Gib
82+ 由于内存区域是通过指针寻址,因此对于32位系统是2^32byte=4Gib,对64位是2^64byte。
83+
84+ linux将虚拟地址空间划分为两个部分,分别称为内核空间和用户空间。
85+ 0到TASK_SIZE是用户进程的虚拟地址范围。
86+ TASK_SIZE到2^32或2^64是内核空间。
87+ TASK_SIZE是一个特定与计算机体系结构的常数,如对于32位系统能够寻址的虚拟地址空
88+ 间为4Gib,TASK_SIZE常数是3Gib处,用户空间为0-3Gib,内核空间为3-4Gib。这种划分
89+ 与可用的内存数量无关。由于地址空间虚拟化的结果,每个用户进程都认为自身有3Gib的
90+ 内存,各个系统进程的用户空间是完全彼此分离的,而虚拟地址空间顶部的内核空间总是
91+ 同样的,这样内核的地址空间总是不会和用户地址空间混在一起,这样用户态和内核态之
92+ 间的分离的这种机制可防止进程无意间修改彼此的数据而造成相互干扰。
93+
94+ 从用户状态到核心态的切换通过系统调用的特定手段完成。
95+ 普通进程只能借助于系统调用向内核发出请求,内核首先检查进程是否允许执行想要的操
96+ 作,然后代表进程执行所需的操作,接下来返回到用户状态。
97+
98+ 虚拟地址如何映射到物理地址上呢?一一对应,显然不行。
99+ 内核将地址空间划分为很多等长的部分,这些部分称之为页。这样虚拟地址空间和物理地
100+ 址空间都能够用同样大小的页来表示,通过页来产生一一对应的关系,这样虚拟地址空间
101+ 就能和物理地址空间映射到一起。由于内核负责将虚拟地址空间映射到物理地址空间,因
102+ 此可以决定那些内存区域在进程之间共享,那些不共享,这样在内核的管控下,内核空间
103+ 和用户空间的进程内存仍然是分离的,不会造成混乱。
104+
105+ 用来将虚拟地址空间映射到物理地址空间的数据结构称为页表。为减少页表的大小并容许
106+ 忽略不需要的区域,linux将虚拟地址划分成几部分,采用四级页表的管理方式,如同用
107+ 树形的数据结构可以快速寻找到自己所需要的内存块,如果你知道算法是怎么一回事的话,
108+ 这里应该很容易理解,如果有困难的话,自己做一下功课,这里不打算展开讲。
109+
110+ 每次访问内存时,必须逐级访问多个数组才能将虚拟地址转换为物理地址,CPU则使用如
111+ 下的方法来加速该过程:
112+ 1)CPU中有一个专门的部分称为MMU(Memory Management Unit,内存管理单元),该单
113+ 元优化了内存访问操作。
114+ 2)地址转换中出现最频繁的那些地址,保存到称为地址转换后备缓冲器(TLB)的CPU高
115+ 速缓存中。无需访问内存中的页表即可从高速缓存直接获得地址数据。
116+
117+ 内核在实现设备驱动程序时直接使用了内存映射。外设的输入/输出可以映射到虚拟地址
118+ 空间的区域中。对相关内存区域的读写会由系统重定向到设备,因而大大简化了驱动程序
119+ 的实现。
120+
121+ 伙伴系统:内核中很多时候要求分配连续页。为快速检测内存中的连续区域,内核使用了
122+ 一种叫做伙伴系统。
123+ 系统中的空闲内存块总是两两分组,每组中的两个内存块称为伙伴。伙伴的分配可以是彼
124+ 此独立的。但如果两个伙伴都是空闲的,内核会将其合并为一个更大的内存块,作为下一
125+ 层上某个内存块的伙伴。
126+ 内核对所有大小相同的伙伴,都防止到同一个列表中管理。
127+ 例如:如果系统想在需要8个页帧,则将16个页帧组成的块拆分为两个伙伴。其中一块用
128+ 与满足应用程序的请求,而剩余的8个页帧则放置到对应8页大小内存块的列表中。
129+
130+ slab缓存:伙伴系统作为一种在使用比页帧大的内存的一种解决办法,但是,内核本身经
131+ 常需要比完整页帧小的多的内存块时就是一个问题了。这时,内核将伙伴系统提供的页划
132+ 分为更小的部分,还对频繁使用的小对象实现了一个一般性的缓存(slab缓存)。
133+ slub则是slab的一个替代品,但是slub完全兼容slab。slub的效率更高更简单。
134+
135+ 页面交换:页面交换通过利用磁盘空间作为扩展内存,从而增大了可用的内存。在内核需
136+ 要更多内存时,不经常使用的页可以写入硬盘,如果再需要访问相关数据,内核会将相应
137+ 的页切换回内存。
138+
139+ 页面回收用于将内存映射被修改的内容与底层的块设备同步,有时也称为数据回写。
140+
141+
81142==============================================================================
82143==============================================================================
0 commit comments