Linux 3.x 内核学习笔记——x86 64位内存管理

X86/X64处理器体系结构及寻址模式 由8086/8088、x86、Pentium发展到core系列短短40多年间,处理器的时钟频率几乎已接近极限,尽管如此,自从86年Intel推出386至今除了增加一些有关流媒体的指令如mmx/sse之外,其他新增的大多数指令都可以从最初的指令集中组合实现同样的功能,整个编程模型维持了约有20多年。 1. 处理器体系结构1.1. 处理器简要结构我们都知道CPU的根本任务就是执行指令,对计算机来说 阅读详情

地址映射

64位地址采用4层地址映射,如下图:

pgd、pud、pmd、pte各占了9位,加上12位的页内index,共用了48位。即可管理的地址空间为2^48=256T。而在32位地址模式时,该值仅为2^32=4G。

另外64位地址时支持的物理内存最大为64T,见e820.c中MAX_ARCH_PFN的定义:

# define MAX_ARCH_PFN MAXMEM>>PAGE_SHIFT

其中MAXMEM为2^46,PAGE_SHIFT为12。

而在32位地址时最大支持的物理内存为64G(开启PAE选项)。

 

地址空间

32位与64位具体地址分布如下图:

 

64位地址时将0x0000,0000,0000,0000 – 0x0000,7fff,ffff,f000这128T地址用于用户空间。参见定义:

#define TASK_SIZE_MAX   ((1UL << 47) - PAGE_SIZE),注意这里还减去了一个页面的大小做为保护。

而0xffff,8000,0000,0000以上为系统空间地址。注意:该地址前4个都是f,这是因为目前实际上只用了64位地址中的48位(高16位是没有用的),而从地址0x0000,7fff,ffff,ffff到0xffff,8000,0000,0000中间是一个巨大的空洞,是为以后的扩展预留的。

而真正的系统空间的起始地址,是从0xffff,8800,0000,0000开始的,参见:

#define __PAGE_OFFSET     _AC(0xffff,8800,0000,0000, UL)

而32位地址时系统空间的起始地址为0xC000,0000。

另外0xffff,8800,0000,0000 – 0xffff,c7ff,ffff,ffff这64T直接和物理内存进行映射,0xffff,c900,0000,0000 – 0xffff,e8ff,ffff,ffff这32T用于vmalloc/ioremap的地址空间。

而32位地址空间时,当物理内存大于896M时(Linux2.4内核是896M,3.x内核是884M,是个经验值),由于地址空间的限制,内核只会将0~896M的地址进行映射,而896M以上的空间用做一些固定映射和vmalloc/ioremap。而64位地址时是将所有物理内存都进行映射。

另外注意:在文档Documentation\x86_64\mm.txt中对系统空间中地址的描述,都比实际的(代码中的)少了0x700,0000,0000的偏移量,应该是代码修改时没有同步修改文档L,我用的是Linux-3.11.0内核。

 

64位Linux下的地址映射 IA32-e模式下地址映射之前写过,32位Linux虚拟地址映射,讨论了在CPU 80386下的虚拟地址映射。看过博主的《Linux内核在x86_64 CPU中地址映射》,对32位和64位下地址映射的区别做了一些总结。---------------------------------------------------------------------------1. x86_64CPU中逻辑地... 阅读详情

相关推荐

从X86到RISC-V:手把手对比分析C906(Sv39)与X86_64的MMU设计与Linux实现差异

本文深入对比了X86_64与RISC-V架构(以全志D1芯片的C906核心为例)在MMU设计与Linux实现上的关键差异。重点解析了Sv39与Sv48模式的地址空间划分、页表层级结构、寄存器配置及页表项格式等核心区别,并提供了Linux内核中进程管理、缺页处理和内存属性设置的具体实现案例,为开发者进行架构迁移或性能优化提供实用参考。

weixin_30764771的博客 1314

Linux 地址空间和优先级

内核

chanimei_11的博客 1541

计算机组成与系统结构(第三版) 袁春风主编 课后习题答案讲解 第一、二章 计算机系统概述 数据的机器级表示

计算机组成与系统结构(第三版) 袁春风主编 课后习题答案讲解 第一、二章 计算机系统概述 数据的机器级表示

qq_73523062的博客 2087

Linux 64位进程地址空间分布概况

对于Linux 64位系统,理论上,64bit内存地址可用空间为0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF(16位十六进制数),这是个相当庞大的空间,Linux实际上只用了其中一小部分(256T)。 Linux64位操作系统仅使用低47位,高17位做扩展(只能是全0或全1)。所以,实际用到的地址为空间为0x0000000000000000 ~ 0x00007FFFFFFFFFFF(user space)和0xFFFF800000000000 ~ 0xFFFFFFFFFFF

rayylee 1万+

从零到一:EHB-电机复合制动系统的Simulink仿真实战指南

本文详细介绍了EHB-电机复合制动系统在纯电动汽车中的Simulink仿真实战指南。通过系统概述、建模核心模块解析、控制策略开发及典型问题排查,帮助读者掌握从零到一的开发流程。重点讲解了液压子系统建模、电机再生制动模型及整车动力学集成,为开发者提供了一套完整的解决方案。

hh234的博客 1006

spdk + fio测试nvme 设备的性能

fio的测试对象可以是块设备、文件等,在spdk的使用过程中会unbind默认的nvme driver,所以在系统中是看不到nvme块设备的,在spdk中可以通过fio_plugin的方式,将spdk的用户态driver部分的io功能打包成一个ioengine提供给fio使用,可以综合spdk的高性能和fio提供的复杂场景。更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加。这个jobfile是spdk中提供的例子。领取,关注我持续更新哦!2.7 jobfile的例子。

lingshengxiyou的博客 1088

x64内核内存空间结构

0x00 前言 本文主要是讨论Windows 7 x64下的内核虚拟地址空间的结构,可以利用WiinDBG调试的扩展命令"!CMKD.kvas"来显示x64下的内核虚拟地址空间的整体布局。了解内核的地址布局在某些情况下是很有的,比如说在研究New Blue Pill的源码和虚拟化的时候。 0x01 基本结构 X64的CPU的地址为64位,但实际上只支持48位的虚拟地址空间供软件使用。虚拟地址...

weixin_30872733的博客 469

【DDR3 控制器设计】(1)MIG IP 核的详解与配置

2:1 比例的用户接口数据总线宽度是 MIG 内存接口宽度的 4 倍,比如 MIG 中配置的数据位宽是 16 位,而 DDR 双边采样,所以用户接口是 MIG 内存接口的 4 倍即数据位宽为 64 位,同理可以得到如果设置为 4:1 则是 8 倍的数据位宽即数据位宽为 128 位。这里选择不使用OFF。以下为 MIG 和 DDR 之间的连接框图,可以看到框图的左边是用户接口,中间是 MIG 核,右边是需要控制的 DDR 接口,用户只需要去配置使用 MIG 核,就可以对 DDR 进行控制读写等操作。

记录学习历程 5359

解决VMware下64位Linux系统不支持全虚拟化(VMX)

一、前提:cpu支持Inter VT-X或AMD虚拟化技术,具体参考官网说明。二、问题描述:物理机下,VMware Workstation能安装64位CentOS系统,处理器Inter i3 M390,且支持Inter VT-X虚拟化技术,物理机BIOS中已打开Inter虚拟化开关(自己找),既然能安装64位系统,说明物理机BIOS中支持虚拟化开关已打开。半虚拟化为pae全虚拟化为vmx(Inte...

愚己的博客 5203

【YOLOv8-pose姿态识别部署至RK3588:模型训练到RKNN落地,让人体姿态分析精度与边缘推理速度双突破】

本教程从YOLOv8-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

FJN110的博客 328

RK3399外设驱动之MIPI

RK3399外设驱动之MIPI 文章目录RK3399外设驱动之MIPIMIPI命令解析入口代码mipi显示配置实例rk3399mipi驱动rk mipi驱动注册过程rk32_mipi_dsi.c解析 内核版本 Linux4.4 平台 rk3399 作者 nineyole MIPI命令解析入口代码 MIPI的入口代码如下:kernel\drivers\video\rockchip\screen\lcd_mipi.c static int __init rk_mipi_screen_in

学无止境 2227

Linux 64位操作系统内核研究:从架构革新到性能跃迁

《Linux 64位操作系统内核实现技术研究》摘要 本文系统探讨了Linux 64位内核的技术演进与设计创新。基于x86_64架构的三大硬件特性(寻址空间扩展、寄存器增强、虚拟化支持),内核在内存管理、进程调度和文件系统等核心模块实现突破性优化。安全方面重点强化了KASLR、内核完整性保护和容器安全机制。未来将聚焦超大规模内存支持、异构计算适配和能效优化三大方向。研究表明,Linux 64位内核通过软硬件协同创新,成功支撑了云计算、AI等现代计算场景,其设计理念对开源生态发展具有重要指导意义。

fearhacker的专栏 1240

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

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

Linux x86 64位内存管理

地址映射 64位地址采用4层地址映射,如下图: pgd、pud、pmd、pte各占了9位,加上12位的页内index,共用了48位。即可管理的地址空间为2^48=256T。而在32位地址模式时,该值仅为2^32=4G。 另外64位地址时支持的物理内存最大为64T,见e820.c中MAX_ARCH_PFN的定义: # define MAX_ARCH_PFN MAXMEM>>PA...

ndzjx的专栏 2292

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【内存管理】Linux内核高端内存(High Memory)深度解析:32位与64位系统的内存管理演进

高端内存是Linux在32位系统中的特殊内存管理机制,用于解决内核1GB虚拟地址空间无法直接映射全部物理内存的问题(物理内存可能超过4GB)。32位系统将内存分为两部分:低端内存(0-896MB)采用固定线性映射,高端内存通过kmap()等机制临时映射。64位系统由于拥有巨大的地址空间(如x86_64的256TB),无需高端内存概念,可直接线性映射所有物理内存。这种架构演进体现了硬件进步如何简化软件设计,虽然高端内存已成为历史,但理解其原理对掌握Linux内存管理演进仍有重要意义。

诸葛一帆丶的博客 1181

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

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

深度剖析:Linux内核启动流程(x86_64) —— 源码结构、核心机制与架构思想

本文深入解析了Linux内核在x86_64架构下的启动流程,从Bootloader加载到用户空间启动的完整过程。文章采用分层架构视角,详细剖析了各阶段的源码结构、核心机制和设计思想,包括实模式到保护模式切换、内核解压、早期汇编初始化、C语言主流程(start_kernel)以及各子系统初始化。重点阐述了Linux内核启动过程中的关键架构思想:分阶段分层设计、架构解耦、异常健壮性和可扩展性。同时介绍了内存管理、调度、中断等核心算法,以及调试优化技巧和架构演进趋势,为系统开发者提供了深入理解Linux内核启动机

IT技术学习与工作笔记分享 1060

linux 3.x内核系统调用表

本文列出了Linux 3.x内核(x86_64架构)的主要系统调用,涵盖了文件I/O、内存管理、信号处理等功能分类。核心系统调用包括文件操作(read/write/open/close)、内存管理(mmap/mprotect/munmap)、信号处理(sigaction/sigprocmask)等,每个调用都标注了内核函数名、用户接口名及功能说明。该清单综合了常见资源和内核源码信息,反映了3.x版本的普遍情况,但具体实现可能因小版本略有差异。

悟空看八戒烤熟了没的专栏c)4Upqt4SeVk 1490

Linux 页表机制详解(x86_64 架构)

本文系统介绍了x86_64架构下Linux系统的四级页表机制。详细解析了PGD、PUD、PMD和PT四级页表结构及其8字节页表项(PTE)的存储格式,包含52位物理地址和12位标志位。分析了页表空间占用情况,每级默认4KB,并讨论了2MB/1GB大页等特殊情况。同时阐述了内核与用户页表的隔离机制,以及CR3寄存器、TLB等硬件支持。最后概述了内核管理页表的关键数据结构和分配函数,为AI计算相关的内核驱动开发提供了内存管理方面的理论基础。

图形/计算GPU的驱动与虚拟化技术分享园地 2897

x86的pae, pse和x86-64

   虽然经典的IA32架构为PC提供了高达4GB的存储空间,可是随着计算规模以及相应存储规模的扩大,4GB的空间有时也会显得不足。在这种情况下,Intel在IA32的基础上推出了页地址扩展(PAE,PageAddress Extension),页面大小扩展(PSE,大概是Page SizeExtension的简称)。其后,为了满足更高的要求,Intel开始了IA64(号称安腾)架

邵志远技术博克 3867

全面解析Linux 内核 3.10.x - 内存管理 - 内存模型

From: 全面解析Linux 内核 3.10.x - 内存管理 全面解析Linux 内核 3.10.x - 内存管理 - 内存模型一、甚么是页框?从Intel的经典4K页框大小说起: 我们都中断intel多数处理器基本都是以4K为业基准,主要是因为以下两个原因: - 1.由分页单元引发的缺页异常很容易得到解释,或者由于请求的页存在但是不允许进程对其访问,或者是由于请求的页不存在,第二种情况

何文的专栏 1997

【Note】《Linux 内核深度解析:基于 ARM64 架构的 Linux 4.x 内核》 第一章:内核引导与初始化

异常向量vectors.S定义了 EL1/EL2 下的同步、IRQ、FIQ、SError 等处理入口中断控制器:GICv3 驱动在 initcalls 中注册中断域,调用调度器:CFS(完全公平调度)在中注册时钟、调度钩子,完成基本就绪队列初始化。本章从硬件上电、BootROM、ATF、U‑Boot 一直到内核_start,全流程拆解 ARM64 Linux 4.x 内核的引导与初始化。下一章将深入探讨内存管理子系统。

YZJincsdn的博客 1115

Linux内核,内存分布

在 Linux 内核汇编中,SYM_DATA 是一个宏,用于定义全局数据符号(Global Data Symbol)。它会确保符号的正确对齐(如按 8 字节对齐)并附加必要的元信息(如 ELF 节类型),以便链接器和内核正确识别。

weixin_43228946的博客 1296

x86_64架构四级页表深度解析:从CR3到PTE的地址转换与64TB物理内存支撑原理

本文系统分析了x86_64架构四级页表的内存管理机制。从历史演进看,32位PAE模式三级页表存在TLB效率低等问题,AMD64架构引入48位虚拟地址和四级页表,显著提升空间效率与安全性。文章详细解析了CR3寄存器、页表项结构等硬件设计,量化分析了MMU流水线延迟和地址转换算法,并通过TLB规格数据说明加速机制。针对64TB物理内存支持,阐述了PTE扩展和地址线复用技术。此外,深入探讨了Linux内核页表初始化、缺页中断处理等实现细节,并给出HugePage、PCID等优化策略的实测性能数据。

小李独爱秋的博客 1777
上一篇: 一种大文件的排序方法
下一篇: Linux 3.x 内核学习笔记——页面的周转
林 文
博客等级 码龄18年 14粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值