16KB页,32bit 地址的划分有些问题

arm-linux内存管理学习笔记(1)-内存页表的硬件原理 学习内核的内存管理如果脱离了MMU的硬件原理,只去学习其软件逻辑,真的很难懂。说到底,软件代码的逻辑是为硬件服务,只是为了充分发挥硬件的各项功能,因此学习linux的内存管理机制,首先要学习下该处理器架构下MMU的工作原理,这样对我们理解页表机制的逻辑很有帮助 阅读详情
32 bit kernel, 16KB 页大小,龙芯2E平台

tlb_refill_handler为:

lui       k1, %hi(pgd_current)
mfc0   k0, C0_BADVADDR
lw       k1, %lo(pgd_current)(k1)
srl     k0, k0, PGDIR_SHIFT
sll       k0, k0, PGD_T_LOG2
addu   k1, k1, k0

mfc0   k0, C0_CONTEXT
lw       k1, 0(k1)
srl     k0, k0, 3
andi     k0, k0, (PTRS_PER_PTE/2-1) << (PTE_T_LOG2 + 1)
addu   k1, k1, k0

lw       k0, 0(k1)
lw       k1, sizeof(pte_t)(k1)
srl     k0, k0, 6
mtc0   k0, C0_ENTRYLO0
srl     k1, k1, 6
mtc0   k1, C0_ENTRYLO1
tlbwr
eret

相应的,直接从正在运行的 kernel 里获取的 tlb_refill_handler 为:

    0:   52801b3c   lui k1,0x8052
    4:   00401a40   mfc0   k0,$8       /* 从 BadVaddr 获取转换失败的 VA */
    8:   18007b8f   lw k1,24(k1)       /* 读取 PGD 所在基地址 */
    c:   82d51a00   srl k0,k0,0x16     /* VA 右移22位 */
    10:   80d01a00   sll k0,k0,0x2
    14:   21d87a03   addu   k1,k1,k0

    18:   00201a40   mfc0   k0,$4       /* 读取 Context 值 */
    1c:   00007b8f   lw k1,0(k1)
    20:   c2d01a00   srl k0,k0,0x3        
    24:   f83f5a33   andi   k0,k0,0x3ff8
    28:   21d87a03   addu   k1,k1,k0

    2c:   00007a8f   lw k0,0(k1)
    30:   04007b8f   lw k1,4(k1)
    34:   82d11a00   srl k0,k0,0x6
    38:   00109a40   mtc0   k0,$2
    3c:   82d91b00   srl k1,k1,0x6
    40:   00189b40   mtc0   k1,$3
    44:   06000042   tlbwr
    48:   18000042   eret

Context 之格式为:

63                       23 22           4 3     0
|                           |     BadVPN2   |   0   |

22~4 共 19 位对应导致 TLB miss 之虚地址的31~13(VA[31:13]),因此如下指令

    20:   c2d01a00   srl k0,k0,0x3        
    24:   f83f5a33   andi   k0,k0,0x3ff8     /* 获取 VA[25:15] 共11位,低3位为0 */

的 意图旨在获取 VA[25:15],并以 2^3=8 字节为单位索引PageTable,实际的索引范围为 2^12 = 4K ,这个与每页容纳的项数相一致(16K/4=4k)。实质上使用 VA[25:14]索引 PageTable,因每次取一对,故而VA[14] 不用。

VA[13:0] 页内位移,没有问题。

但 使用 VA[31:22] 索引 PGD 就让人困惑了。32bit kernel 中定义 PGDIR_SHIFT 始终为 22 ,不管页大小为何,这个在4KB页大小下,是正好的,但在16KB下,由于使用 VA[25:15] 索引PageTable,因此用于索引 PGD 的域与索引 PT 的域重叠了4位(25~22)!

如果有2个虚址,VA1[22] = 1,VA2[23] = 1 ,当 TLB miss 时,当前内核的 tlb_miss_handler 是向2个不同的 PGD 入口找寻 PTE 的,尽管按照地址划分他们应该在同一个 PGD 入口才是。

关于地址的划分,应该从低位往高位切分才是,即:首先切取PAGE_SIZE所需位,然后根据PAGE_SIZE,确定索引 PT 的位数。如4KB,则为4K/4=1K, 10 位,16KB则为12 位,64KB 则为14位。

余下的高位作为索引PGD 的位数才是。因此应该是 6 | 12 | 14 才对。

---------------------------------

32 bit 模式下, PGD 索引位与PT 索引位部分重叠并不会导致灾难性的后果,只是会造成核心分配给PT的页过多,浪费空间。

测了一下,改动后的 kernel,启动后 nr_page_table_pages 为 63 左右,而原有kernel 在101左右,多分配了 (101-63)*16KB 作为 PageTable。

另外我写了一个测试程序,使用mmap 映射一个40MB左右的文件在地址 0x2ac94000 附近,然后随机访问该文件中的数据 1亿次,新旧对比,原 kernel 要多分配 13*16KB 作为 PageTable(cat /proc/vmstat)。

---------------------------------

后 记:该问题已经提交到linux-mips mail list,最新内核的 PGDIR_SHIFT 定义已经修改为: (2 * PAGE_SHIFT + PTE_ORDER - PTE_T_LOG2)(原来写死为 22),现在可以根据 PAGE_ SHIFT 动态调整了。



 
在32位虚拟地址 + 256MB物理内存 + 4KB分页系统下,地址是如何转换的 页表翻译的是“页号部分”(高位),不翻译页内偏移(低位12 bits);所以每个 PTE 管理一整页(4KB)的映射。如果你想,我可以帮你整理成中文完整版图解或者出几个题目练习页表大小/页数/地址分解。需要吗?📘✨。 阅读详情

相关推荐

别再乱写Flash了!深入GD32的FMC控制器,搞懂页大小、Bank划分与零等待区的性能影响

本文深入解析GD32 Flash架构,从零等待区到Bank划分的实战优化,揭示GD32 Flash控制器(FMC)的硬件设计哲学。通过详细的代码示例和实测数据,帮助开发者理解Flash物理结构对嵌入式开发的影响,提升系统性能和稳定性。

weixin_30307921的博客 457

计算机组成原理——存储器作业

一、某机字长为32位,其存储容量为64KB,按字编址其寻址范围是多少?若主存以字节编址,试画出主存字地址的分配情况。 二、一个容量为16K x 32位的存储器,其地址线和数据线的总和是多少?当选用下列不同规格的存储芯片时,各需要多少片? 1K x 4位,2K x 8位,4K x 4位,16K x 1位,4K x8位,8K x 8位 三、某8位微型计算机地址码为18位,若使用4K x 4位的RAM芯片组成模块板结构的存储器,试问: (1) 该机所允许的最大主存空间是多少? (2) 若每个模块板为32K x

weixin_45286211的博客 2万+

ARM64内存页大小之争:4KB内核如何支撑64KB大页进程

内存页大小是操作系统内存管理的基础参数,直接影响TLB覆盖范围与性能表现。ARM64架构原生支持4KB、16KB、64KB三种页大小,但Linux内核编译时只能选择一种作为全局基本页。4KB页兼容性好但TLB命中率低,64KB页能显著减少TLB miss却可能带来内存碎片和驱动兼容问题。透明大页(THP)与hugetlb机制允许用户态进程突破内核基本页限制,通过映射2MB甚至64KB大页来提升性能。ARM64的双页表设计(TTBR0/TTBR1)以及stage-1/stage-2虚拟化翻译,为内核与用户空间

weixin_29304985的博客 255

16KB地址空间及1KB页面

总结起来,16KB地址空间和1KB页面意味着计算机系统可以寻址和存储最大16 * 1024个字节的数据,每个页面的大小为1KB,可以根据页面的地址访问和操作其中的数据。在使用16KB地址空间和1KB页面时,计算机系统可以通过访问不同的页面来加载和存储不同的数据。当需要访问一个特定的字节时,计算机系统可以使用地址空间中相应的地址来定位和操作所需字节。16KB地址空间可以寻址16 * 1024个字节的数据。每个页面都有一个唯一的地址,可以通过该地址来访问和操作页面中的数据。

Kegi_的博客 1177

arm地址转换

arm virtualization 地址转换 guest va -> ipa  -> host pa guest va 通过stage1 mmu的两级页表转换成ipa ipa 通过stage2 mmu的三级页表装换成host pa ipa(40bit)使用的arm的LPAE Stage-1 and Stage-2 page table walk on ARMv7

dyfrank的专栏 1550

避坑指南:STM32硬件I2C驱动AT24C256时,你可能会遇到的页写和延时问题

本文深入剖析了STM32硬件I2C驱动AT24C256时常见的五大技术陷阱,包括页写边界、延时问题、时钟配置等,并提供了工业级解决方案。通过实战代码示例和实测数据,帮助开发者规避数据错位、通信失败等风险,提升系统稳定性。特别针对HAL库使用中的关键参数配置给出了优化建议。

weixin_30730053的博客 532

区分< 字节、字、位、比特 >

相同点:都是描述 容量。

weixin_53501829的博客 859

64/32位Linux系统的差异(地址空间布局,系统调用)对比分析

映射地址:可以看到,对应的地址0x7fd9b8c00000是PSE页,映射了10M,是PMD级的大页映射,也就是2M页面的映射。连续影射了5个PMD大页。这些大页的分配是在mmap后,执行memset(addr, 0x5a, ...)时通过page fault流程进行分配的,对应执行hugetlb_fault的执行流程。

tugouxp的专栏 3224

虚拟地址的映射(页表)

虚拟地址采用页表的形式的映射

m0_74212594的博客 1954

SAP BTP-Cloud foundry 构建并部署JAVA应用程序

本文为 SAP BTP Java 应用程序的简单实例, 我们可以用此实例来熟悉SAP BTP 中的java应用开开发流程.在你完成改示例java应用程序以后, 我们可以直接使用该java应用程序进行后续的开发流程, 或直接构建一个新的JAVA应用程序来支持新的业务开发。

seyafly的博客 803

电路研究9.4——合宙Air780EP的LuatOS、CSDK跟标准AT

 C-SDK、AT指令、LuatOS

esmember的博客 1116

地址编号从80000H到BFFFFH且按字节编址的内存容量为__KB,若用16K×4bit的存储芯片够成该内存 ,共需_ _片。

地址编号从80000H到BFFFFH且按字节编址的内存容量为__KB,若用16K×4bit的存储芯片够成该内存 ,共需_ _片。

qq_34536480的博客 6463

从机械到数字:EC11旋转编码器与ESP32的PWM控制艺术

本文详细解析了EC11旋转编码器与ESP32的PWM控制技术,探讨了如何将机械旋转动作转换为精确的数字信号控制。通过硬件连接、信号处理和软件优化等实践技巧,开发者可以构建高效的人机交互系统,适用于智能照明、电机控制等多种应用场景。

android的专栏 782

bit、byte、KB、B、字节、位、字符之间关系详解

本文详细解析了计算机存储单位bit、byte、KB、B及字符间的核心关系(1 byte=8 bits,1 KB=1024 bytes),并阐明了字符大小如何随编码(如ASCII、UTF-8)变化。通过换算示例和代码演示,说明如何计算文件存储空间与传输时间,同时指出常见误区(如bit/byte混淆)。文章涵盖从硬件存储到网络传输的多场景应用,并提供字符编码验证等实用技巧,是理解计算机数据存储的完整指南。(149字)

likuoelie的博客 5092

从数据集到产品:聊聊Room-to-Room (R2R) 如何影响扫地机器人、AR导航的未来

本文探讨了Room-to-Room (R2R) 数据集如何推动视觉与语言导航(VLN)技术的发展,并重塑扫地机器人和AR导航的未来。通过分析R2R基于Matterport3D的设计及其在真实场景中的应用,揭示了其在提升智能导航精度和自然语言交互能力方面的潜力。文章还讨论了从实验室到产品化的关键技术挑战与解决方案。

weixin_29084231的博客 139

AD9361 官方例程详解(一)

文章目录前言一、pandas是什么?二、使用步骤总结 前言 一、pandas是什么? 二、使用步骤 总结

weixin_44630490的博客 4万+

AT24C32/64大容量EEPROM驱动避坑指南:STM32硬件I2C页写延迟与地址处理详解

本文详细解析了AT24C32/64大容量EEPROM在STM32硬件I2C驱动开发中的关键问题,包括16位地址处理、页写延迟控制及健壮性设计。通过实战代码示例和错误排查指南,帮助工程师规避常见陷阱,提升参数存储的可靠性和效率。

weixin_30896511的博客 389

uniapp - 使用 <video> 播放视频黑屏,浏览器控制台报错: DOMException: The element has on supported sources.(详细完美解决方案)

uniapp video 视频播放黑屏,uniapp 报错DOMException: The element has on supported sources.,uniapp如何解决DOMException: The element has on supported sources.,uniapp使用video标签无法播放视频出现黑屏问题处理,uniapp解决video视频黑屏显示0秒,并且浏览器报错DOMException: The element has on supported sources.,un

✅ 精选推荐文章 7055

4kb边界及4Gb地址空间及扩展

4kb边界问题及4Gb空间

m0_71354184的博客 2717

【WRF-Urban】URBPARM_LCZ.TBL 查找表解释及内容

URBPARM_LCZ.TBL 查找表解释及内容

WW、forever的博客 1754

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux arm64 PTE contiguous bit

ARM64架构通过Contiguous PTE机制优化TLB性能,允许将16个连续的4KB页(共64KB)合并为一个TLB条目。该特性通过PTE表项的bit52(PTE_CONT)标记,使MMU将物理连续、权限一致的多个PTE条目缓存为单个TLB项,减少TLB占用并提高命中率。

小立仔 1148

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

W25Q32-FLASH详细存储结构讲解文档:深度解析存储架构,提升开发效率

W25Q32-FLASH详细存储结构讲解文档:深度解析存储架构,提升开发效率 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代电子系统中,FLASH存储器作为重要的数据存储介质,其高效、可靠的存储结构至关重要。W25Q32-FLASH详细存储结构讲解文档旨在帮助开发者和工程师深入理解W25Q32型号FLASH的存储架构,从而优化存储解决方案,提高开发效率。 项目技...

gitblog_06759的博客 1015

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

W25Q32-FLASH详细存储结构讲解文档

W25Q32-FLASH详细存储结构讲解文档 去发现同类优质开源项目:https://gitcode.com/ 本文档为您详细解读W25Q32型号FLASH的存储结构。W25Q32具备32M-bit(即4MB字节)的存储容量,其结构可以被划分为64个存储块,每个存储块大小为64KB。进一步地,每个存储块可以被划分为16个扇区,每个扇区的大小为4KB。而在每个扇区内部,还可以继续划分为16个页,每页...

gitblog_06716的博客 349

DDR3中bank, 16bit和32bit等概念

DDR3中bank, 16bit和32bit等概念 最近在看内存相关的东东。以前认为内存就是块资源,需要的时候,malloc出来一部分使用即可。对内部的东东没有深入了解过。刚开始看起来,感觉有点丈二和尚。通过各种查询,并请教牛人,对基本概念有了个初步了解,先总结一把。 先说说bank。看到bank首先想到了银行,然后是利率,然后是房贷...扯远了,这儿的bank是存储库的意思。也就是说,一块内...

weixin_34289744的博客 132

容量换算和地址总线

// 1G = 1024 MB // 1MB = 1024 KB // 1KB = 1024 B // 1Byte = 8bit // 1G = 2^30 B(2^10 M = 2^10 * 2 *10 KB = 2^10 * 2^10 * 2^10 B) // 4G = 2^32 B // 16 = 4个二进制位 = 0.5字节 // 4个字节 = 1个16进制位 // 16位地址总线 :4位(16进制),表示的地址范围就是16个二进制位也就是 4个16地址位,所以16位地址总线 = 4 位16地址 .

koral的博客 1539
上一篇: linux下把共享库(SO)加载到指定的内存地址
下一篇: 使用 graphviz 形象化有向图
Jack Tan
博客等级 码龄22年 28粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值