`
cocos
  • 浏览: 393606 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Linux内存:内存管理的实质

阅读更多

1. 内核初始化:

* 内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了[3G--3G+len]::[0--len]这样的虚地址vaddr和物理地址paddr的线性对应关系;
* 内核建立一个page数组,page数组和物理页面系列完全是线性对应,page用来管理该物理页面状态,每个物理页面的虚地址保存在page->virtual中;
* 内核建立好一个free_list,将没有使用的物理页面对应的page放入其中,已经使用的就不用放入了;

2. 内核模块申请内存vaddr = get_free_pages(mask,order):

* 内存管理模块从free_list找到一个page,将page->virtual作为返回值,该返回值就是对应物理页面的虚地址;
* 将page从free_list中脱离;
* 模块使用该虚拟地址操作对应的物理内存;

3. 内核模块使用vaddr,例如执行指令mov(eax, vaddr):

* CPU获得vaddr这个虚地址,利用建立好的页目录页表数据库,找到其对应的物理内存地址;
* 将eax的内容写入vaddr对应的物理内存地址内;

4. 内核模块释放内存free_pages(vaddr,order):

* 依据vaddr找到对应的page;
* 将该page加入到free_list中;

5. 用户进程申请内存vaddr = malloc(size):

* 内存管理模块从用户进程内存空间(0--3G)中找到一块还没使用的空间vm_area_struct(start--end);
* 随后将其插入到task->mm->mmap链表中;

6. 用户进程写入vaddr(0-3G),例如执行指令mov(eax, vaddr):

* CPU获得vaddr这个虚地址,该虚地址应该已经由glibc库设置好了,一定在3G一下的某个区域,根据CR3寄存器指向的current->pgd查当前进程的页目录页表数据库,发现该vaddr对应的页目录表项为0,故产生异常;
* 在异常处理中,发现该vaddr对应的vm_area_struct已经存在,为vaddr对应的页目录表项分配一个页表;
* 随后从free_list找到一个page,将该page对应的物理页面物理首地址赋给vaddr对应的页表表项,很明显,此时的vaddr和paddr不是线性对应关系了;
* 将page从free_list中脱离;
* 异常处理返回;
* CPU重新执行刚刚发生异常的指令mov(eax, vaddr);
* CPU获得vaddr这个虚地址,根据CR3寄存器指向的current->pgd,利用建立好的页目录页表数据库,找到其对应的物理内存地址;
* 将eax的内容写入vaddr对应的物理内存地址内;

7. 用户进程释放内存vaddr,free(vaddr):

* 找到该vaddr所在的vm_area_struct;
* 找到vm_area_struct:start--end对应的所有页目录页表项,清空对应的所有页表项;
* 释放这些页表项指向物理页面所对应的page,并将这些page加入到free_list队列中;
* 有必要还会清空一些页目录表项,并释放这些页目录表项指向的页表;
* 从task->mm->mmap链中删除该vm_area_struct并释放掉;

综合说明:

* 可用物理内存就是free_list中各page对应的物理内存;
* 页目录页表数据库的主要目的是为CPU访问物理内存时转换vaddr-->paddr使用,分配以及释放内存时不会用到,但是需要内核内存管理系统在合适时机为CPU建立好该库;
* 对于用户进程在6中获得的物理页面,有两个页表项对应,一个就是内核页目录页表数据库的某个pte[i ],一个就是当前进程内核页目录页表数据库的某个 pte[j],但是只有一个page和其对应。如果此时调度到其他进程,其他进程申请并访问某个内存,则不会涉及到该物理页面,因为其分配时首先要从 free_list中找一个page,而该物理页面对应的page已经从free_list中脱离出来了,因此不存在该物理页面被其他进程改写操作的情况。内核中通过get_free_pages等方式获取内存时,也不会涉及到该物理页面,原理同前所述。

分享到:
评论

相关推荐

    内存管理内存管理内存管理

    文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的...

    深入理解linux内核中文第三版(高清有目录)

    深入理解linux内核中文第三版...你将了解到什么条件会促使Linux产生最佳性能,你还会看到,Linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现Linux系统的魅力。

    操作系统(内存管理)

    文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...

    深入理解Linux内核(第三版) (英文版) Understanding the Linux Kernel

    为了透彻理解Linux的工作...你将了解到什么条件会促使Linux产生最佳性能,你还会看到,Linux 在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现Linux系统的魅力。

    打通Linux脉络系列:进程、线程和调度.pdf

    打通Linux脉络系列:进程、线程和调度 1. 第一部分大纲 1.1 Linux进程生命周期 ...2.3 Linux线程的实现本质 2.4 孤儿进程的托孤,SUBREAPER 练习题 第三部分大纲 练习题 第四部分大纲 练习题

    深入理解Linux内核 第三版 中文高清完整pdf版.part3.rar

    为了透彻理解linux的工作机理...你将了解到什么条件会促使linux产生最佳性能,你还会看到,linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现linux系统的魅力。

    深入理解Linux内核 第三版 中文高清完整pdf版.part5.rar

    为了透彻理解linux的工作机理...你将了解到什么条件会促使linux产生最佳性能,你还会看到,linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现linux系统的魅力。

    深入理解LINUX内核(第三版)—英文

    本书第三版涵盖Linux 2.6,从中可以看到几乎内核每个子系统都有相当大的变化,首当其冲的是内存管理和块设备部分。本书集中讨论了如下内容: 内存管理,包括文件缓冲、进程交换以及直接内存访问(DMA) 虚拟文件系统...

    深入理解Linux内核 第三版 中文高清完整pdf版.part6.rar

    为了透彻理解linux的工作机理...你将了解到什么条件会促使linux产生最佳性能,你还会看到,linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现linux系统的魅力。

    深入理解Linux内核 第三版 中文高清完整pdf版.part1.rar

    为了透彻理解linux的工作机理...你将了解到什么条件会促使linux产生最佳性能,你还会看到,linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现linux系统的魅力。

    深入理解Linux内核 第三版 中文高清完整pdf版.part2.rar

    为了透彻理解linux的工作机理...你将了解到什么条件会促使linux产生最佳性能,你还会看到,linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现linux系统的魅力。

    深入理解Linux内核 第三版 中文高清完整pdf版.part4.rar

    为了透彻理解linux的工作机理...你将了解到什么条件会促使linux产生最佳性能,你还会看到,linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现linux系统的魅力。

    深入理解Linux内核

    为了透彻理解Linux的工作机理...你将了解到什么条件会促使Linux产生最佳性能,你还会看到,Linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现Linux系统的魅力。

    深入理解LINUX内核(第三版)

    为了彻底理解是什么使得Linux能正常运行以及其为何能在各种不同的系统中运行良好,你需要深入研究内核最本质的部分。内核处理CPU与外界间的所有交互,并且决定哪些程序将以什么顺序共享处理器时间。它如此有效地管理...

    深入理解linux内核中文第三版_001

    深入理解linux内核中文第三版...你将了解到什么条件会促使Linux产生最佳性能,你还会看到,Linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现Linux系统的魅力。

    深入理解linux内核中文第三版_003

    深入理解linux内核中文第三版...你将了解到什么条件会促使Linux产生最佳性能,你还会看到,Linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现Linux系统的魅力。

    深入理解linux内核中文第三版_002

    深入理解linux内核中文第三版...你将了解到什么条件会促使Linux产生最佳性能,你还会看到,Linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现Linux系统的魅力。

    Linux C 多线程编程之互斥锁与条件变量实例详解

    对于动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex_init进行初始化, 并且在释放内存(free)前需要调用pthread_mutex_destroy. 原型: int pthread_mutex_init(pthread_mutex_t *restrict mutex, ...

    深入理解linux内核

    为了彻底理解是什么使得Linux能正常运行以及其为何能在各种不同的系统中运行良好,你需要深入研究内核最本质的部分。内核处理CPU与外界间的所有交互,并且决定哪些程序将以什么顺序共享处理器时间。它如此有效地管理...

Global site tag (gtag.js) - Google Analytics