Linux地址映射--线性映射与非线性映射

mips架构linux启动分析(六)(arch_mem_init(node内存)内存初始化) 这里开始就是各个node的内存的初始化了。 OK,直接看代码. static void __init arch_mem_init(char **cmdline_p) { extern void plat_mem_setup(void); //定义板级的屏幕的相关信息 plat_mem_setup(); //把代码段也加入到boot_mem_map进行管理(bootm机制) arch_m 阅读详情
 

一,线性映射与非线性映射

1.       内存管理

物理内存管理:

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

 

进程内存管理:

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

 

2.       为何内核与进程空间不重合

进程:0~3G

内核:3G~4G

进程与内核合起来使用了4G的地址空间,而不是各自使用4G空间,获得的好处是进程进入内核是不需要切换页表,降低了进出内核的消耗。

 

在2.6内核中,所有进程的内核空间(3G~4G)都是共享的。

Linux启动后,第一个进程是init进程,它的页表与内核页表是一致的,系统中的其他所有进程都是init进程的儿子或后代。Linux中进程创建通过fork()实现,子进程的PGD与PTE是父进程的拷贝此时会把内核进程的页表拷贝到每个进程中。在各个进程的运行过程中,他们的页表可能会发生变化,比如发生缺页异常。如果是进程页表发生改变,则只要改变进程的页表项(0G~3G)就够了,如果是内核页表发生变化,则必须通知到所有进程改变各自维护的一份内核页表(3G~4G)。最简单的方法是每次内核页表改变后,遍历所有进程去改变他们维护的内核页表,显然效率很低。Linux内核通过page fault机制实现内核页表的一致。内核页表改变时,只改变init进程的内核页表。当进程访问该页时,会发生一个缺页异常,异常处理中通过init进程更新当前进程的内核页表。

Linux地址映射(1)--线性映射与非线性映射 - lucien - lucien_cc 的博客

3.       非线性区域

非线性区与线性区是内核地址空间中的概念。

对于非线性区存在,可以做如下的解释。

Linux物理内存空间分为DMA内存区(DMA Zone)、低端内存区(Normal Zone)与高端内存区(Highmem Zone)三部分。DMA Zone通常很小,只有几十M。低端内存区与高端内存区的划分源于linux内核空间大小的限制。

Linux内核只有1G的空间,通常内核把物理内存与其地址空间做了线性映射,也就是一一映,这样可以提高内存访问速度。

当内存超过1G时,线性访问机制就不够用了,只能有1G的内存可以被映射,剩余的内存无法被内核使用。当然无法忍受。

为了解决这一问题,linux把内核分为线性区与非线性区两部分。线性区规定最大为896M,剩下的为非线性区。与线性区不同,非线性区不会提前进行内存映射,而是在使用时动态映射。线性区映射的物理内存成为低端内存,剩下的内存被称为高端内存。

假设物理内存为2G,则地段的896M为低端内存,通过线性映射给内核使用。其他的1128M内存为高端内存,可以被内核的非线性区使用。由于要使用128M非线性区来管理超过1G的高端内存,所以通常都不会映射,只有使用时才使kmap映射,使用完后要尽快用kunmap释放。

使用128M管理1G的内存是不是有点小马拉大车的感觉?其实不会,因为高端内存的大部分要进程使用。

对于物理内存为1G的内核,系统不会真的分配896M给线性空间,896M最大限制。下面是一个1.5G物理内存linux系统的真实分配情况,只有721M分配给了低端内存区,如果是1G的linxu系统,分配的就更少了。

MemTotal   1547MB

HighTotal     825MB

LowTotal     721MB

申请高端内存时,如果高端内存不够了,linux也会去低端内存区申请,反之则不行。

 

4.       linux管理之外的物理地址空间(other Addr)

理论上,32位系统可管理的物理地址空间为4G。x86架构多一些io空间。计算机系统中的每个设备都是要占用一定的物理地址空间的,如PCI设备,所以不会把4G都给内存,这也意味着32位系统无法支持4G内存。

对于这部分物理内存之外的物理地址空间,这段空间不知道应该怎么称呼,这里暂时称为Device Zone。

由于Device Zone没有被linux管理,也就不会为它建立page结构来管理,因此linux中使用该段内存时都是直接使用其物理地址,而使用物理内存则是通过向linux申请free page来实现。同样道理,这块肯定也不会映射到线性区,而是使用ioremap映射到非线性区域,或直接用mmap映射到进程空间。

 


如果申请的内存时低端内存,因为低端内存一直都被映射在内核页表中,因此只需要一个page_address()函数就可以完成转换。

如果申请的是高端内存,就没有这么简单了。

首先,如果可以在高端申请到足够的内存,需要先在非线性区映射,操作结束后在解除映射,我们可以使用kmap()与kunmap()解决这个问题。如果高端内存找不到足够的内存,则会在低端内存区分配一块,此时也该回调用kmap()与kunmap()函数,但内部实现时就只是调用page_address()获取地址,而不需要再映射到非线性区。

 

1.       进程空间内存分配

malloc/free:最常用的内存分配函数

valloc/free:分配的内存按页对齐

 

2.       内核空间内存分配

__get_free_pages/free_pages:分配制定页数的低端内存,不能分配在高端

Alloc_pages/__free_pages:分配izhiding页数的内存,可以是高端内存

Kmalloc/kfree:分配的内存物理上连续,只能在低端分配

Vmalloc/vfree:分配的内存在内核空间中连续,物理上无需连续。Vmalloc由于不需要屋里也连续,会造成TLB抖动,所以性能很差,一般只有在必须申请大块内存时才使用,如动态插入模块时。

 

上图揭示了进程空间、内核空间与物理地址之间的转换关系。

在linux中,物理地址用page结构 表示,物理内存在初始化时已经生成了page结构管理,其他地址空间则需要生成page再进行管理(ioremap)。物理地址可以被映射到内核空间或进程空间,也可以从内核空间或进程用户空间解除物理地址(page)。

所有转换中,只有mmap可以在进程中使用,其他都是内核函数。即使使用mmap,其内部也是靠内核中使用remap_pfn_range实现的。所有地址空间转换都在内核中实现。

踩坑ubuntu24.04 编译vtk9.3.1的安卓版本 NDK官方明确废弃了旧版 armeabi ABI,强制使用armeabi-v7a或arm64-v8a。错误信息显示你的构建系统仍在使用超级构建(superbuild)模式,并且内部引用了已不再支持的。生成的合并库: $(pwd)/libvtk_combined.a"超级构建过程可能内部未充分考虑现代NDK变化导致内部配置ARM老ABI,重复失败。echo "正在提取所有.o文件..."echo "合并前所有库的总大小:"# 提取所有.a文件中的.o文件。echo "创建合并库..." 阅读详情

相关推荐

基于TI MSPM0的PS2双轴按键摇杆模块ADC+GPIO驱动移植实战

本文详细介绍了在TI MSPM0微控制器上驱动PS2双轴按键摇杆模块的完整实战流程。通过SysConfig图形化工具配置ADC与GPIO引脚,并编写了包含ADC采样、按键检测及数据处理的驱动代码,实现了对摇杆X/Y轴模拟量及按键数字量的稳定读取,为嵌入式控制项目提供了可直接移植的解决方案。

weixin_42465140的博客 85

【Linux】—内存映射(线性映射、非线性映射、逆映射)

如果存在大文件的情况,那么需要将文件的不同部分以不同顺序映射到虚拟内存的连续区域中,通常必须使用几个映射,这样代价很昂贵。在实际的运行中,一个物理内存,可能被多个进程使用,与多个vm之间进行关联。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mlAUBZP0-1686223392527)(img/内存映射/5.png)]但是存在一个疑问,在将vm和file之间进行挂载的过程中,没有看到vm和address_space之间的关联,也没有看到其与rb_tree之间的挂载情况。

王磊明的博客 1568

亚马逊SP-API授权实战:从OAuth流程到Refresh Token获取

本文详细解析了亚马逊SP-API授权流程,从OAuth认证到Refresh Token获取的全过程。通过实战经验分享,帮助开发者快速掌握Marketplace Appstore、Website Workflow和自行授权三种方式,解决常见错误如MD5100和MD9999,并提供了安全存储Refresh Token的最佳实践。

weixin_30379531的博客 519

慢慢欣赏linux 线性地址与非线性地址映射

Linux地址映射(1)--线性映射与非线性映射 http://blog.chinaunix.net/uid-20528014-id-314322.html 操作系统:图文详解神秘的”内存映射“ 图文并茂,讲得不错 https://blog.youkuaiyun.com/carson_ho/article/details/87685001 SEGMENTATION FAULT...

shipinsky的博客 453

RFSOC实战解析:MTS多片同步的时序校准与相位相干实现

本文深入解析了在RFSOC平台上实现MTS多片同步的关键技术与实战流程。文章从相位相干的重要性出发,详细阐述了SYSREF与SYNC信号的协同工作机制,并提供了从硬件时钟配置到软件API调用的完整MTS实现步骤。重点探讨了时序校准的核心方法,旨在帮助工程师解决多通道系统相位不一致的难题,确保ADC与DAC达到精确的相位相干,从而构建高性能的MIMO和相控阵系统。

weixin_29206669的博客 194

Project 编制进度计划【项目管理】

Project 项目管理编制进度计划详解。

m0_52861684的博客 5091

一个关于线性映射区的疑问

学习内存管理时一直有个疑问:内核虚拟地址空间中有一部分是线性映射用的,在内核初始化时会把物理内存映射到这个线性区域,既然映射已经建立完成了,那是不是就把物理内存全都占用了,用户空间是否就不能申请这些内存了? 后来宋宝华老师给出了解释:被映射和被占用完全是两码事。 下面就结合代码,谈谈我最这个解释的理解,以及自己碰到的疑问。 我最大的疑问是,在实际项目中,我看到的线性映射区并没有对所有的物理内存进行...

y658t的专栏 2508

【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码

大家好,我是阿光。本专栏整理了《深度学习100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。正在更新中~ ✨。

优快云 精品推荐 10万+

Linux Kernel线性映射代码分析

在Linux Kernel启动过程中,会根据物理内存的大小以及虚拟内存空间大小,决定线性映射区间的大小。在ARM64架构中,由于虚拟地址空间足够大,正常情况下都会对memory建立线性映射,有的也叫直接映射。本文主要是走读线性映射的代码。

Linux Kernel Tech 469

AI原生应用架构师指南:系统化思维框架解析

随着ChatGPT、Stable Diffusion等AI技术的普及,「AI原生应用」(AI-Native Application)已从概念走向实践。传统应用以「功能逻辑」为核心(比如用代码写死的购物车规则),而AI原生应用以「数据+模型」为核心(比如根据用户行为动态推荐商品)。本文的目的是为架构师提供一套系统化思维框架如何区分「伪AI应用」和「真AI原生应用」?数据、模型、业务场景三者如何协同设计?架构师需要关注哪些关键技术节点?如何避免「为了AI而AI」的陷阱?

AI Python 编程之道的博客 492

【系统架构设计师】2026年上半年真题论文:论高并发系统的设计与实践

本文围绕高并发系统架构设计展开,重点论述了电商秒杀系统的实战经验。文章采用"痛点-解决方案-效果"的逻辑结构,从缓存设计、异步处理、限流降级、数据库优化等6个维度详细阐述了应对高并发的技术策略。其中,重点介绍了多级缓存体系、基于消息队列的异步处理机制和微服务拆分实践,并辅以实际案例说明如何解决超卖、缓存雪崩等典型问题。全文强调高并发设计需要系统性思维,通过空间换时间、异步换吞吐、横向换能力等原则,最终实现系统吞吐量从500TPS提升至20000TPS的性能突破。

数据知道的博客 1160

Linux地址映射——地址转换(mmap,vma)

Linux内核的内存管理机制中地址映射的方法

baidu_38797690的博客 3183

发那科机器人通信库使用指南与踩坑记录

GitHubNuGet(如本文基于该库,在 C# / .NET 下通过 TCP 与 FANUC 机器人控制器通信,实现读当前位姿、PR 寄存器、以及 DI/DO/GI/GO 等 IO 的读写。GitHubNuGet(如本文基于该库,在 C# / .NET 下通过 TCP 与 FANUC 机器人控制器通信,实现读当前位姿、PR 寄存器、以及 DI/DO/GI/GO 等 IO 的读写。

songhuangong123的博客 328

Linux地址映射(1)--线性映射与非线性映射

一,线性映射与非线性映射1.       内存管理物理内存管理:Linux内存最小管理单位为页(page),通常一页为4K。初始化时,linux会为每个物理内存也建立一个page的管理结构,操作物理内存时实际上就是操作page页。某些设备会映射在物理内存地址外,这些地址会在使用时建立page结构。 进程内存管理:Linux进程通过vma进行管理,每个

Walker(QQ:343675038) 2068

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【转】Linux地址映射(1)--线性映射与非线性映射

一,线性映射与非线性映射 1.       内存管理 物理内存管理: Linux内存最小管理单位为页(page),通常一页为4K。初始化时,linux会为每个物理内存也建立一个page的管理结构,操作物理内存时实际上就是操作page页。某些设备会映射在物理内存地址外,这些地址会在使用时建立page结构。   进程内存管理: Linux进程通过vma进行管理,每个进程都有一个task

444

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux设备驱动程序读书笔记,读书笔记:写一个块设备驱动(4)

首先32位linux内核(2.6.32)中线性地址(虚拟地址)分为两块:3G~4G为内核地址空间其余为进程地址内核总共占据物理内存1G,分为3部分:DMA(0~15M)NORMAL(16~895M)HIGHMEM(896~)内核线性地址空间与物理内存地址一一对应,不过分为两部分:线性地址映射区(3G~3G+896M)非线性地址映射区(3G+896M~4G)线性地址映射区是与物理内存一一映射的,是在...

weixin_40009207的博客 116

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Zynq ECC实战避坑指南:硬件接对了,软件怎么配?从原理到验证一步到位

本文详细解析Zynq ECC从硬件原理到软件配置的全链路实现,提供系统化的诊断方法论。涵盖硬件设计陷阱、Linux驱动配置、地址映射调试等关键环节,并给出完整的验证流程与实用脚本框架,帮助开发者有效避免常见错误,确保DDR内存的可靠性。

weixin_33719619的博客 643

Linux地址映射

http://blog.chinaunix.net/uid-20528014-id-314322.html 一,线性映射与非线性映射 1.       内存管理 物理内存管理: Linux内存最小管理单位为页(page),通常一页为4K。初始化时,linux会为每个物理内存也建立一个page的管理结构,操作物理内存时实际上就是操作page页。某些设备会映射在物理内存地址外,这些

bmbm546的专栏 1939

Linux地址映射--地址转换(mmap,vma)

https://blog.youkuaiyun.com/yiyeguzhou100/article/details/72875122 2017年06月06日 10:00:34 yiyeguzhou100 阅读数:3535 一,线性映射与非线性映射 1. 内存管理 物理内存管理: Linux内存最小管理单位为页(page),通常一页为4K。初始化时,linux会为每个物理内存也建立一个page的管理结构,操作物...

hbcbgcx的博客 1000

linux地址映射1、2、3(⭐⭐⭐)

  欢迎关注瘋耔新浪微博:http://weibo.com/cpjphone     一.线性映射与非线性映射                                                       1◑内存管理 ①物理内存管理: Linux内存最小管理单位为页(page),通常一页为4K。初始化时,linux会为每个物理内存也建立一个page的管理结构(切记是l...

weixin_34417635的博客 106

30分钟搞懂Linux内核内存映射,(值得收藏)

一、内存映射基础知识 1、内核地址映射模型 比如:X86CPU采用段页式地址映射模型,进程代码地址为逻辑地址,经过段页式地址映射之后,才能够真正访问物理内存。32位Linux内核地址空间划分:0GB--3GB为用户空间,3GB--4GB为内核空间。32位和64位内核地址空间划分是不同的。具体空间表示如下: ​ 2、内核高端内存 比如:当内核模块代码或络访问内存时,代码中的地址为逻辑地址,而且对应到真正的物理内存地址,需要地址和它一对一的映射,假设:逻辑地址0xc0000003对应的物

youzhangjing_的博客 3018
上一篇: linux中的likely和unlikely...
下一篇: ubuntu/centos环境下玩android系统(一): 从编译android开始!
刀客777
博客等级 码龄15年 11粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值