Linux内核的映射机制设计成三层,在页面目录和页面表中间增设了一层“中间目录”。
在代码中,页面目录称为PGD中间目录称为PMD,而页面表称为PT
PT中的表项称为PTE,PTE是“Page Table Entry”的缩写。
PGD、PMD和PT均为数组。
在逻辑上也把线性地址从高位到低位划分成4个位段。

4G字节虚存空间
Linux内核将这4G字节的空间分成两部分:
将最高的1G字节(从虚地址0xC0000000至0xFFFFFFFF)用于内核本身,称为“系统空间”。
将较低的3G字节(从虚地址0x0至0xBFFFFFFFF)用作各个进程的“用户空间”
系统空间由所有进程共享。
每当一个进程通过系统调用进入了内核,该进程就在共享的系统空间中运行,不再有其自己的独立空间。

虽然系统空间占据了每个虚存空间中最高的1G字节,在物理的内存中却总是从最低的地址(0)开始。
对于内核来说,其地址的映射是很简单的线性映射,0xC0000000就是两者之间的位移量。
此位移称为PAGE_OFFSET,定义于文件include/asm-i386/page.h中。
PAGE_OFFSET也代表着用户空间的上限,常数TASK_SIZE就是通过它定义的。
对于系统空间而言,给定一个虚地址x,其物理地址是从x中减去PAGE_OFFSET;相对应地,给定一个物理地址x,其虚地址是x+PAGE_OFFSET

_pa()只是为内核代码中当需要知道与一个虚地址对应的物理地址时提供方便。
例如,在切换进程的时候要将寄存器CR3设置成指向新进程的页面目录PGD,而该目录的起始地址在内核代码中是虚地址,但CR3所需要的是物理地址,这时候就要用到_pa()。

每个进程的局部段描述表LDT都作为一个独立的段而存在,在全局段描述表GDT中要有一个表项指向这个段的起始地址,并说明该段的长度以及其他一些参数。
每个进程还有一个TSS结构(任务状态段)
每个进程都要在全局段描述表GDT中占据两个表项

段寄存器中用作GDT表下标的位段宽度是13位,所以GDT中可以有8192个描述项。
一些系统开销:(GDT中的第2项和第3项分别用于内核的代码段和数据段,第4项和第5项永远用于当前进程的代码段和数据段,第1项永远是0,等等)
有8180个表项可供使用,所以系统中最大的进程数量是4090。

①物理内存管理:

Linux内存最小管理单位为页(page),通常一页为4K。初始化时,linux会为每个物理内存也建立一个page的管理结构(切记是linux系统不是uboot,也就是物理内存的管理肯定是在linux系统上的),操作物理内存时实际上就是操作page页。某些设备会映射在物理内存地址外,这些地址会在使用时建立page结构。

②进程内存管理:

Linux进程通过vma进行管理,每个进程都有一个task_struct结构体进行维护,其中的mm_struct结构体管理这进程的所有内存。Mm_struct中维护者一个vma链表,其中的每一个vma节点对应着一段连续的进程内存。这里的连续是指在进程空间中连续,物理空间中不一定连续。如果使用malloc等申请一段内存,则内核会给进程增加vma节点。

--

Linux内存管理的基本框架⭐⭐的更多相关文章

  1. linux内存管理之全局框架

    讲解复杂繁琐的机制原理,最通俗的方法就是用模型架构的方式向读者呈现,先要在整体上了解大方向大架构,再根据大方向大架构来进行分支深入,犹如毛主席那句话“战略上蔑视敌人,战术上重视敌人”.下面我也以这种方 ...

  2. Linux内存管理解析(二) : 关于Linux内存管理的大体框架

    什么是内存管理 ? 首先内存管理管理的主要对象是虚拟内存,但是虚拟内存对应的映射主要为物理内存,其次也可能通过交换空间把虚拟内存与硬盘映射起来,既然如此,那我们先了解物理内存的管理. 对于物理内存而言 ...

  3. linux 内核源代码情景分析——linux 内存管理的基本框架

    386 CPU中的页式存管的基本思路是:通过页面目录和页面表分两个层次实现从线性地址到物理地址的映射.这种映射模式在大多数情况下可以节省页面表所占用的空间.因为大多数进程不会用到整个虚存空间,在虚存空 ...

  4. Linux内存管理专题

    Linux的内存管理涉及到的内容非常庞杂,而且与内核的方方面面耦合在一起,想要理解透彻非常困难. 在开始学习之前进行了一些准备工作<如何展开Linux Memory Management学习?& ...

  5. 伙伴系统之避免碎片--Linux内存管理(十六)

    1 前景提要 1.1 碎片化问题 分页与分段 页是信息的物理单位, 分页是为了实现非连续分配, 以便解决内存碎片问题, 或者说分页是由于系统管理的需要. 段是信息的逻辑单位,它含有一组意义相对完整的信 ...

  6. 伙伴系统之伙伴系统概述--Linux内存管理(十五)

    在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法. Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, ...

  7. 启动期间的内存管理之bootmem_init初始化内存管理–Linux内存管理(十二)

    1. 启动过程中的内存初始化 首先我们来看看start_kernel是如何初始化系统的, start_kerne定义在init/main.c?v=4.7, line 479 其代码很复杂, 我们只截取 ...

  8. 启动期间的内存管理之初始化过程概述----Linux内存管理(九)

    在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检 ...

  9. Linux内存管理 (16)内存规整

    专题:Linux内存管理专题 关键词:内存规整.页面迁移.pageblock.MIGRATE_TYPES. 内存碎片的产生:伙伴系统以页为单位进行管理,经过大量申请释放,造成大量离散且不连续的页面.这 ...

随机推荐

  1. LeetCode 笔记系列十 Suduko

    题目:Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by ...

  2. MySql在Linux上实现每天自动备份

    Mysql自动备份 创建存放备份sql的文件夹 mkdir /jimisun/mysqlBackup 测试命令行备份数据库 /usr/bin/mysqldump --opt -uroot -pjimi ...

  3. 01.Elasticsearch安装

    1.下载运行Elasticsearch 1.下载解压elasticsearch Elasticsearch官网地址:https://www.elastic.co/ Elasticsearch最新版下载 ...

  4. Struts2数据验证与使用Java代码进行数据验证

    Struts2数据验证 使用Java代码进行数据验证 重写ActionSupport的validate()方法 对Action类的中所有请求处理方法都会进行验证! 对Action类的数据属性进行检查, ...

  5. PM 项目管理

    BugTracker:http://www.ifdefined.com/bugtrackernet.html PM:http://www.zentao.net/download.html 51cto: ...

  6. 【Python算法】图与树的实现

    邻接列表及其类似结构 对于图结构的实现来说,最直观的方式之一就是使用邻接列表.下面我们来实现一个最简单的:假设现在我们有n个节点,编号分别为0,...,n-1. 然后,每个邻接列表就是一个数字列表,我 ...

  7. uitextFiled字数输入限制

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementS ...

  8. Fully qualified name FQCN

    Fully qualified name - Wikipedia https://en.wikipedia.org/wiki/Fully_qualified_name In computer prog ...

  9. time-based DB

    这类时间序列数据库最多,使用也最广泛.一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper ...

  10. react 将字符串解析为markdown

    react 中有许多组件支持把字符串转化为markdown,并以html的形式展示出来.这里我试用了 react-markdown 和 hyperdown 两个库,发现hyperdown比较好,因为r ...