内存管理篇-21 虚拟内存管理:线性映射区

1.线性映射区的定义

这部分讲线性映射区的内容。一般老的嵌入式平台,它内存很小只有几百兆,都会直接把整个物理内存映射到线性映射区了,只有当物理内存大于1GB以上,线性映射区无法cover的时候就把剩下的放到高端内存。所以这个区域是最简单的。

线性映射区一般是指内核空间的某个部分,直接映射到低端内存的区域。并且他们之间是线性映射的。

PAGE_OFFSET就是内核的起始地址,如果配置内核用户空间是1:3的话,就是0xc0000000。如果配置2:2的话就是0x80000000;线性映射区的大小是可以配置的,

PYHS_OFFSET表示的是物理内存的起始地址。在zone_normal区域,一般是线性映射,假如虚拟地址0x8000000,物理地址是0x6000000

当物理内存很小的时候,256MB,会把所有的内存直接映射到线性映射区上,这样就能方便的使用。(用户空间怎么办呢?还有就是其他vmalloc区域岂不是都是0了么)

当物理内存很大的时候,3GB,线性映射区只能映射1.7GB左右,剩下的作为高端内存,通过vmalloc动态申请使用。

2.线性映射区的转换关系

一般就是增加一个偏移就能实现转换。内核中有现成的接口可以实现虚拟地址到物理地址之间的转化。__virt_to_phys 和phys_to_virt函数

3.代码实战

kmalloc函数申请的是哪里的地址?低端内存么?我们可以看到虚拟和物理内存只有一个偏差。就是因为这里把所有区域都通过线性映射了,不需要再进行高端内存的其他映射。--因为物理内存很小,完全没有这个必要用高端内存。

相关推荐
木卫二号Coding2 小时前
推荐Linux统计文件大小并操作删除工具-ncdu
linux·运维·服务器
zhangrelay4 小时前
机械臂末端规划智能模型的误区演示
linux·笔记·学习·ubuntu·ros2
Ivanqhz6 小时前
正余弦位置编码(Sinusoidal Positional Encoding)
java·linux·数据库
H.莓飛6 小时前
【数据结构】队列
linux·数据结构·centos
小此方6 小时前
Linux网络(十九):TCP流量控制与滑动窗口详解,超时重传和快重传到底有什么区别
linux·运维·服务器·网络·网络协议·tcp/ip
码上有光6 小时前
Linux进程通信——共享内存、消息队列和信号量
android·linux·运维·共享内存·通信
沫璃染墨6 小时前
《从零入门Linux系统篇(五十四):线程篇·七——互斥锁底层原理:从原子交换到线程竞争与锁实现》
linux·运维·服务器·开发语言·c++·驱动开发·系统架构
Java后端的Ai之路7 小时前
Python进阶探索24_应用案例_linux系统的监控
linux·开发语言·python·应用·探索
H.莓飛7 小时前
【数据结构】队列_OJ题
linux·数据结构·centos
H.莓飛7 小时前
【数据结构】栈_OJ题
linux·数据结构·算法·centos