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等方式获取内存时,也不会涉及到该物理页面,原理同前所述。
分享到:
相关推荐
本章节将详细介绍ARM-Linux内存管理的关键概念和技术,包括虚拟内存管理和物理内存管理。 #### 内存管理的本质特征 在ARM-Linux系统中,每个进程都需要占用一定的内存资源。但是,由于成本、体积和功耗等因素限制...
深入理解linux内核中文第三版...你将了解到什么条件会促使Linux产生最佳性能,你还会看到,Linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现Linux系统的魅力。
文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...
5. **Linux进程通信**:Linux系统提供了多种进程间通信(IPC)机制,包括管道、信号量、消息队列、共享内存等。实验中涉及的是管道通信,通过管道,进程之间可以实现单向的数据传输。 实验内容包括: 1. **进程的...
### LINUX进程管理实验知识点解析 #### 一、进程与程序的区别 在进行LINUX进程管理实验之前,首先需要理解进程与程序之间的区别。程序是指令的集合,是静态的,而进程则是程序的一次动态执行过程,具有生命周期,...
文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的...
Linux内存屏障是并行编程领域的重要概念,它关注的是如何在多处理器系统中保持内存操作的顺序性和一致性。在进行并行编程时,尤其是在多核CPU环境下,内存访问顺序和一致性问题尤为突出。为了解决这些问题,处理器...
3. **内存管理**:Linux 0.0.1中的内存管理系统负责分配和释放内存,包括物理内存和虚拟内存的管理,这对于高效利用系统资源至关重要。 4. **文件系统**:早期的Linux支持了基本的文件操作,如打开、读取、写入和...
Linux 0.01是Linux操作系统创始人Linus最早实现的一个操作系统版本,其代码量只有9000行左右,具有多任务系统、多用户系统、进程管理、设备管理、内存管理及文件系统等基本功能。 文章首先介绍了Linux 0.01的基本...
"Linux专家之路"不仅是一条技术探索之旅,也是一次理解操作系统本质的旅程。这个过程中,你会遇到诸如中断处理、调度算法、数据结构设计等方面的挑战,但同时也将收获对系统运行机制的深刻认识。通过不断实践和学习...
从硬件层面上看,Android使用了基于Linux的内存管理系统;而在应用层面上,则采用了Java的垃圾回收机制。为了充分利用有限的内存资源,开发者需要熟悉这些机制,并采取适当的措施来优化内存使用,以确保应用程序的...
然后开始分析Linux内核源代码,从系统调用陷入内核,进程调度与进程切换,最后返回到用户态进程,通过仔细分析梳理这一过程,并推广到硬件中断、缺页异常等内核执行路径,最终能从本质上把握Linux内核的实质,乃至在...
内存管理是Linux内核的关键部分,它包括物理内存分配、虚拟内存映射和内存保护。在Linux 0.11中,内存分配使用了简单的页表结构,通过mm_struct数据结构管理进程的内存映射。 4. **设备驱动** 设备驱动程序使内核...
为了透彻理解Linux的工作...你将了解到什么条件会促使Linux产生最佳性能,你还会看到,Linux 在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现Linux系统的魅力。
13. **Linux性能调优**:涉及内存管理、磁盘I/O优化、CPU调度等,提升系统性能。 14. **虚拟化技术**:介绍KVM、Docker等虚拟化工具,以及容器化技术的应用。 15. **Linux服务器部署**:学习如何在Linux上搭建常见...
为了透彻理解linux的工作机理...你将了解到什么条件会促使linux产生最佳性能,你还会看到,linux在各种环境下如何满足进程调度、文件访问及内存管理期间系统提出的快速响应要求。本书有助于你充分展现linux系统的魅力。
两者都支持多任务、虚拟内存、共享库、按需加载、共享副本写执行文件、良好的内存管理和多栈网络,包括IPv4和IPv6。然而,Linux是免费和开源的,而Unix通常是商业软件。 4. **Linux内核版本**: Linux内核版本随着...
- Linux通过多种机制来管理内存,如页表、内存映射等。 5. **中断与中断处理**: - 中断是计算机系统中非常重要的机制,它允许硬件向处理器发送信号以请求服务。 - Linux内核通过中断处理程序来响应这些信号,并...
2. **内存管理**:LINUX内存管理包括物理内存的分配、回收,以及虚拟内存的映射。页表机制用于实现虚拟地址到物理地址的转换,交换机制则允许将不活跃的内存换出到磁盘,以节省物理内存。 3. **文件系统**:LINUX...