地址空间的归纳总结

地址空间 (Address Space) 主要介绍了程序的地址空间分布,虚拟地址空间的介绍,虚拟地址如何如物理地址产生关联以及虚拟地址空间的好处等。 阅读详情

url: http://alanwu.blog.51cto.com/3652632/1082195

通常X86系统中会存在四大地址空间:进程地址空间、内核地址空间、物理地址空和PCI地址空间。这几大地址空间有些是硬件领域的相关内容,例如PCI地址空间,PCI Hole;有些是软件研发需要了解的。这几大地址空间有什么不同?他们之间是如何联系在一起的呢?

下图是进程地址空间、内核地址空间以及物理地址空间之间的联系,下面对几大地址空间的联系进行阐述。
 
 

 

 
进程地址空间大家比较熟悉,很多人都知道通过虚拟内存机制,在32位平台上每个进程都可以获得4GB大小的地址空间。在32位Linux系统中,高1GB空间是每个进程共享的内核地址空间,0~3GB的空间是每个进程独享的地址空间。进程地址空间通过页表与物理地址空间建立联系,为了减少这种映射带来的开销损失,X86处理器硬件提供了TLB页表Cache。由于访存具有很高的时空局部性,因此TLB Cache的命中率很高,为虚拟内存机制的工程应用奠定了基础。从硬件上讲,进程虚拟地址映射最重要的模块是MMU,只有拥有MMU的处理器才可以支持虚拟地址机制。从软件上来讲,虚拟地址最重要的是页表管理。操作系统需要为虚拟内存建立页表,当TLB Cache Miss的时候,处理器会产生中断,然后进行页表映射,并且加载页表。在进程的用户空间,很多时候也希望直接对PCI的设备内存空间直接进行操作,例如很多应用程序想直接操作显卡内存,获得性能上的优势。为了达到这种目的,需要将处理器域PCI设备内存地址映射至进程地址空间。在Linux中提供了mmap函数实现IO地址与虚拟地址之间的映射。这种映射本质上与物理内存的映射是一样的,同样需要建立页表。
 
OS内核地址空间占据了3~4GB,共1GB大小的地址空间。其中,绝大部分地址(3G~Vmalloc_end)都是通过线性映射的方式进行映射,起始的一段物理内存空间被直接映射至内核空间。因此,内核空间的这种线性映射的地址也称为逻辑地址,这种地址无需页表进行映射,物理地址和逻辑地址之间的转换可以通过简单的偏移运算即可完成。内核空间中也存在虚拟地址,这段地址空间为Vmalloc_end~4GB。内核空间通过Vmalloc函数为这段虚拟地址空间建立页表,与物理内存建立联系。另外,在实际的系统中,除了物理内存之外,PCI设备同样占据处理器物理地址空间,内核空间想要访问PCI设备内存时,需要通过ioremap函数将处理器域PCI设备内存地址映射到内核空间。这种映射与vmalloc的方式一样,同样需要建立页表。我们可以看到,实际上,在32位Linux中,虚拟地址空间不是很大,默认情况下只有几百兆的空间。那么,如果用户想映射一块非常大的PCI设备内存空间至内核,怎么办呢?我想如果用户有这方面的需求,那么只能通过调整vmalloc_end参数将虚拟地址空间扩大。另外,在ARM嵌入式系统中,由于系统的内存资源有限,32位Linux预留的内核空间地址足够,而且物理内存通常会小于1GB,因此,PCI物理地址空间往往会落在1GB以内。在这种情况下,PCI设备内存的映射可以采用内核空间逻辑地址映射的方式,直接通过偏移操作进行物理地址和IO虚拟地址的转换,而无需调用ioremap进行页表操作(ARM嵌入式系统中会定义_REG宏实现虚实地址转换)。
 

 

CPU物理地址空间理解上比较容易,就是处理器访问内存的地址空间。但是,值得注意的是,处理器内存地址空间并非全部用于物理内存的访问(DIMM),其中有一部分用于访问PCI设备地址空间。因此,如果处理器地址总线宽度为32位,拥有4GB地址空间,那么,其中只有一部分地址是用于访问物理内存的。因此,32位的地址总线无法支持4GB大内存。为了解决这个问题,Intel和AMD处理器在推出64位处理器之前采用了PAE技术,即Intel处理器将地址总线扩展到36位;AMD处理器扩展到40位。在软件的处理上,对页表也进行了修改,实现32位虚拟地址与36/40位物理地址的映射。从上图我们可以看出,当系统中安装的物理内存比较少时,例如只安装了1GB内存,那么物理地址空间还会存在空闲地址,4GB的顶端地址空间会分配给PCI设备,并且PCI设备地址空间与物理内存空间没有交叉。前几年这样的系统大量存在。但是,伴随着物理内存的日益廉价,大内存的系统大量出现,例如很多系统都配备大于4GB的内存。这样的系统会存在一个问题:PCI设备地址和物理内存存在地址交叉,处理器无法访问被PCI地址空间覆盖的物理内存。这也就在物理内存空间形成了一个地址空洞,这个空洞通常被称为PCI Hole。为了解决这个问题,芯片组提供了一组寄存器将被PCI设备地址覆盖的那部分物理内存重新映射到其它地址空间,从而实现将这部分遗失的内存回收。这种映射是通过硬件实现的。目前,在64位处理器上依然存在PCI Hole的问题,主要考虑到兼容性的问题。未来如果把PCI设备地址空间直接放到64位地址空间的顶端,PCI Hole这个问题也就不存在了。
 

 

很多人在开发PCI设备的时候很疑惑,什么是PCI地址空间?PCI地址和处理器地址是一回事吗?其实在X86系统中,PCI地址和处理器地址在数值方面是相同的,但是这两个地址仍然属于两个不同的地址域。上面讨论的物理地址所指的就是处理器域的物理地址,是站在处理器的角度来看待访问地址的。PCI地址不是站在处理器角度的地址,而是PCI总线域的地址,是站在PCI桥、PCI设备看到的地址。如上图所示,PCI总线域地址和处理器域地址是通过PCI主桥(Host或者Complex)进行映射转换的。位于处理器的软件如果想访问PCI设备,那么直接采用处理器域的PCI设备地址,当然位于内核的驱动程序需要采用ioremap之后的虚拟地址进行访问。位于设备端的DMA控制器需要进行数据传输时,需要采用PCI总线域的地址。有趣的是,X86处理器对这两个空间的地址进行等值映射,所以看到的值是相同的,但是PowerPC则进行了线性映射,两个值是不相同的。
 
这里对计算机系统中的几个地址进行了说明,希望对大家有所帮助,如有不对的地方请指正,在此谢过。
PCIe 访问 EP 配置空间,空间映射详解,BDF 计算偏移 两种 MEM 访问 EP 配置空间的方式都是通过基地址 + 偏移地址访问的。类 xilinx 的方式是全映射,需要 256M 的空间,将所有的 PCIe 设备的配置空间都映射到 CPU 的地址空间来。类 designware 则取巧,使用少量的 CPU 地址空间,但是每次访问之前需要重新映射 EP 的地址,使得相同的 CPU 地址空间可以放到的不同的 EP 设备的配置空间。 阅读详情

相关推荐

FPGA中DDR3读写测试系统设计与跨时钟域实现

DDR3作为高速动态随机存取存储器,其接口涉及严格的JEDEC协议、多级地址映射和严苛的时序约束。其核心原理在于PHY层训练、用户接口(UI)时钟域与系统时钟域的协同,以及跨时钟域数据同步机制。技术价值体现在高带宽、低成本大容量缓存能力,广泛应用于图像处理、实时信号采集、嵌入式AI推理等对内存吞吐敏感的场景。在FPGA平台(如Xilinx UltraScale+)上,常借助MIG IP核实现物理层兼容,而工程难点集中于sys_clk/ai_clk/clk_50mhz三时钟域隔离、异步FIFO设计及DDR3控

weixin_42453228的博客 68

物理地址、地址空间、内存空间、io空间

io空间:Intel采用独立编址,IO地址与存储地址分开独立编址,I/0端口地址不占用存储空间的地址范围,这样,在系统中就存在了另一种与存储地址无关的IO地 址,CPU也必须具有专用与输入输出操作的IO指令(IN、OUT等)和控制逻辑。如,intel 80x86就采用单独编址,CPU内存和I/O是一起编址的,就是说内存一部分的地址和I/O地址是重叠的。I/O地址空间和CPU的物理地址空间是两个不同的概念,例如I/O地址空间为64K,一个32bit的CPU物理地址空间是4G。

qq_46695411的博客 4799

归纳编程语言的语法grammer

背景: 我是一个系统软件工程师,之前没有使用过python 语言。 但是,最近项目需要使用python 脚本实现自动化测试。于是抽空学习了解了python,同时为了更好的灵活使用编程语言的技巧和了解意图。在此归纳编程语言的语法。 找对方法,对症下药。才能药到病除。 =====================================正好归纳一下编程语言的所有语法. 1. 条件判断 2. 赋值语句 expression 3. 循环遍历 iterator 4. 数据类型之间的转换 tr...

clam_zxf的博客 1205

Linux地址空间的归纳总结

转自:http://alanwu.blog.51cto.com/3652632/1082195

houxn22的专栏 756

第3章信息系统集成专业技术知识归纳总结补充

关键术语定义中间件位于硬件、操作系统等平台和应用之间的通用服务,解决分布式系统的异构问题,实现应用与平台的无关性,屏蔽操作协同和网络协议差异,提供多种通讯机制。数据库访问中间件通过抽象层访问数据库,允许用相同代码访问不同数据库资源,典型技术如ODBC、JDBC。远程过程调用中间件(RPC)分布式应用程序处理方法,允许应用程序“远程”执行不同地址空间的过程,效果类似本地调用。面向消息中间件(MOM)

Monitkey的博客 1090

从零开始讲PCIe(4)——PCI总线的地址空间分配

PCI架构支持三种地址空间,如图1-10所示:内存地址空间(Memory Map)、I/O地址空间(I/O Map)和配置地址空间(PCI Configure Space)。在x86处理器中,处理器可以直接访问内存和I/O空间。

apple_53311083的博客 4122

地址空间的归纳总结---PCI 涉及到的地址映射转换

通常X86系统中会存在四大地址空间:进程地址空间、内核地址空间、物理地址空和PCI地址空间。这几大地址空间有些是硬件领域的相关内容,例如PCI地址空间,PCI Hole;有些是软件研发需要了解的。这几大地址空间有什么不同?他们之间是如何联系在一起的呢? 下图是进程地址空间、内核地址空间以及物理地址空间之间的联系,下面对几大地址空间的联系进行阐述。     650) this.width=6

漂飘渔人 8812

STM32 GPIO寄存器映射与BSRR原子操作原理

内存映射I/O是嵌入式系统中CPU控制外设的基础机制,其核心在于将外设寄存器映射到统一地址空间,使硬件资源可被C语言指针直接访问。该机制依赖于ARM Cortex-M的存储器映像设计、volatile语义保障及总线协议协同,技术价值在于实现确定性、低开销与硬件抽象的统一。典型应用场景包括GPIO引脚控制、USART通信配置和定时器PWM生成等。在STM32平台,GPIO寄存器组(如CRL/ODR/BSRR)的协同操作体现了这一范式的完整性——尤其BSRR寄存器通过高低16位分离设计,规避了读-改-写竞态,为

weixin_32099703的博客 61

操作系统刷题总结——知识点归纳1(虚拟地址空间+死锁)

1. 虚拟地址空间 几个概念 虚拟内存: 虚拟内存是一种逻辑上扩充物理内存的技术。基本思想是用软、硬件技术把内存与外存这两级存储器当做一级存储器来用。虚拟内存技术的实现利用了自动覆盖和交换技术。简单的说就是将硬盘的一部分作为内存来使用。 虚拟地址空间: 在32位的i386 CPU的地址总线的是32位的,也就是说可以寻找到4G的地址空间。我们的程序被CPU执行,就是在0x00000000到0xFFFFFFFF这一段地址中。高2G的空间为内核空间,由操作系统调用,低2G的空间为用户空间,由用户使用。 寻址过程

超级无敌菜阿板的博客 690

STM32F0存储器映射原理与GPIO寄存器访问实战

存储器映射是嵌入式系统中CPU访问Flash、SRAM和外设寄存器的地址组织机制,其本质是硬件资源在32位地址空间中的逻辑布局。基于ARM Cortex-M0内核规范,该映射决定了总线结构、外设基地址分配及访问权限约束,直接影响裸机编程的可靠性与可移植性。掌握地址空间划分(如0x40000000外设区、0x20000000 SRAM区)和寄存器访问机制(如结构体封装、BSRR原子操作),可规避时钟未使能、地址偏移错误等高频问题。本文以STM32F0系列为典型,深入解析从Cortex-M0标准映射到GPIOA

weixin_30218749的博客 42

FANUC机器人与S7-1200 Profinet通讯五大断点排查指南

Profinet是一种基于工业以太网的实时通信协议,其核心原理在于通过IO控制器与设备间的周期性数据交换实现确定性控制。技术价值体现在高同步精度、强诊断能力与跨厂商互操作性,广泛应用于柔性产线中PLC与工业机器人(如FANUC R-30iB系列)的协同控制场景。实际部署中,通讯失败往往并非网络连通问题,而是源于硬件拓扑约束、GSDML文件版本不匹配、地址空间映射错位等隐性断点。本文聚焦S7-1200与FANUC机器人Profinet通讯调试过程中的典型故障模式,结合固件版本兼容性、IO控制器使能逻辑等关键要

weixin_29165725的博客 98

线程与进程的区别

线程与进程的区别归纳: a.地址空间和其它资源: 进程间相互独立,同一进程的各线程间共享。 某进程内的线程在其它进程不可见。 b.通信: 进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助, 以保证数据的一致性。 c.调度和切换: 线程上下文切换比进程上下文切换要快得多。 d.在多线程OS中,进程不是一个可执行的实体。

坚果儿的博客 337

Atlas 300I Pro推理卡性能深度测试:对比业界同类产品的能效比与算力表现

本文对昇腾Atlas 300I Pro推理卡进行了深度性能评测,重点对比了其与业界同类产品的能效比与算力表现。实测数据显示,该卡在运行BERT等模型时展现出高达39.6句子/秒/瓦的卓越能效比,电力成本可降低40%以上,同时其达芬奇架构和硬件加速特征检索能力,为高密度在线推理和向量检索场景提供了强大支撑。

weixin_29031161的博客 577

系统地址空间,PCI地址空间

1 系统地址空间与PCI地址空间 1.1 PCI地址空间 PCI总线具有32位数据/地址复用总线,所以其存储地址空间为2的32次方=4GB。也就是PCI上的所有设备共同映射到这4GB上,每个PCI设备占用唯一的一段PCI地址,以便于PCI总线统一寻址。每个PCI设备通过PCI寄存器中的基地址寄存器来指定映射的首地址。PCI地址空间对应于计算机系统结构中的PCI总线。 ...

huozheleisi 151

SE (3) -Transformers:三维旋转 - 平移等变注意力网络

E (3) 变换器,这是一种用于三维点云和图的自注意力模块变体,在连续三维旋转平移下具有等变性。注意力机制的计算量会随着点云规模的增大呈二次方增长,因此引入邻域的概念是很有必要的:每个点不再关注所有其他点,而只关注其最近的邻点。注意力机制此前已在图的领域中以内部注意力、自注意力、顶点注意力或图注意力等名称被引入 [17, 31, 32, 12, 26]。等变性意味着当输入数据发生旋转或平移时,模型的输出也会以相应的、可预测的方式进行变换,从而保证模型性能的稳定性和可预测性。

qq_49786473的博客 1479

电路保护设计实战:保险丝选型、I²t计算与多级协同方案

电路保护是电子系统可靠性的基石,其核心原理是在发生过流或过压等异常情况时,及时切断故障回路,防止能量持续灌入导致元器件损坏甚至安全事故。从技术价值看,优秀的保护设计能显著提升产品寿命、安全性和市场口碑,尤其在快充、电动汽车等高功率密度应用中,保护器件已成为不可或缺的安全屏障。在众多保护器件中,保险丝作为最基础的过流保护元件,其正确选型与应用直接关系到保护效果。本文聚焦于保险丝选型的实战细节,深入解析了I²t(电流平方时间积)这一关键参数,它定义了熔断所需的能量阈值,是匹配被保护半导体器件耐受能力、实现有效保

weixin_42662171的博客 308

存储器映射归纳

存储器映射归纳 首先说明一点:只要是基于ARM7内核的处理器,其中断都是从0x00-0x1c(8个中断向量)处开始执行。处理器的存储器映射可以归结为三种情况:1         没有存储器的映射这样的处理器有:三星的S3C44BX处理器。没有存储器映射的处理器,其BANK地址是固定的,而且第一级中断向量的都是放到规定好的BANK0处(即地址0x00处)。可以归纳为:BANK

supersi的专栏 3597

基于Python的微信聊天记录分析——数据获取

本篇为“基于Python的微信聊天记录分析”第一篇,主要涉及数据获取,包括Python环境配置、WeChatMsg项目配置和运行、获取聊天记录等内容,流程简单、比较基础,后续这个系列会涉及基于Python的数据处理、统计分析、NLP技术等内容。希望和大家多多交流,共同进步!

Henryli1202的博客 1万+

进程与线程的区别归纳

线程与进程的区别归纳: a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。 b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。 c.调度和切换:线程上下文切换...

112

机械臂学习:视觉引导——绪论

视觉引导 = 定位 + 引导定位:视觉系统定位到待引导的物体引导:视觉系统引导机械臂按需要的轨迹实现一定的工艺流程(过度点:人为指定机械臂的轨迹防止碰撞)(点云匹配:解决位姿估计姿态估计的问题)无序抓取的三个核心技术:3d识别(图中的点云匹配) 抓取方法路径规划(防止机械臂的碰撞,如自身碰撞等)如果只有同一高度的平移和旋转,其实并不需要点云,用单目就可以做,但是如果涉及到物体的倾斜以及高度的变换,那就是单目力所不能及,所以就是第三种情况:平移旋转加垫高。

2303_80018785的博客 4041

第十九届全国大学生智能车竞赛越野信标 硬件篇

全国大学生智能汽车竞赛,越野信标组

2301_77568650的博客 4114

线程与进程的区别归纳

地址空间     线程共享进程的地址空间、而进程有自己独立的地址空间     某进程内的线程在其它进程不可见     子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间、每个线程有自己的执行堆栈和程序计数器为其执行上下文 资源拥有     进程是资源分配和拥有的单位     同一个进程内的线程共享进程的资源      通信     进程间通信IPC

Tyrion_Matrix的博客 289

【电源专题】案例:对比不同电池在不同电流下的电池放电曲线

无

一点硬件 2840
上一篇: System Address Map Initialization in x86/x64 Architecture Part 1: PCI-Based Systems
下一篇: 关于PCI的问答
evenness
博客等级 码龄15年 99粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值