微机总线地址物理内存地址虚拟内存地址简介

硬件地址的相关概念
Raspberry Pi 发布适用于 ARM 外设的 BCM2835 数据表
地址映射
总线地址
物理地址
虚拟地址
页表和内存管理单元MMU

《 Linux内核设计与实现(第三版)》

树莓派博通BCM2835芯片手册

硬件地址的相关概念

总线地址
32位的操作系统 ,cpu最多只能访问2^32bit,即只能访问4G的内存

64位的操作系统 ,cpu最多只能访问2^64bit,即只能访问8G的内存

物理地址
物理地址又叫硬件的实际地址或绝对地址

虚拟地址
是逻辑地址,有了虚拟地址cpu访问的内存可完全大于8g。程序大都跑在由物理地址映射成的逻辑地址上。

Raspberry Pi 发布适用于 ARM 外设的 BCM2835 数据表

如果您一直在关注 Raspberry Pi 项目,您可能已经注意到与 Broadcom 处理器相关的文档的缺乏。 对于 BCM2835(Raspberry Pi 板中使用的处理器),Broadcom 只有一个简洁的网页。

但 Raspberry Pi 的“超级团队”已经成功获得了 SoC 的(部分)数据表,其中显示了 BCM2835 ARM 外设的详细信息,这正是我们可能需要的。 这仅对使用 Linux(和 u-boot)驱动程序的人有用。

该文档包含有关处理器内存映射的详细信息,如下所示。
在这里插入图片描述
它还包含有关以下 ARM 外设的详细信息(寄存器、实现细节等):

  • Timers (定时器)
  • Interrupt controller (中断控制器)
  • GPIO (通用输入输出接口)
  • USB
  • PCM / I2S
  • DMA controller (DMA控制器)
  • I2C master (I2C主控)
  • I2C / SPI slave (I2C/SPI 从机)
  • SPI0, SPI1, SPI2
  • PWM (脉宽调制)
  • UART0, UART1 (串口)
    您可以下载 BCM2835 数据表以获取完整文档。

地址映射

除了 ARM 的内存管理单元( MMU )之外,BCM2835 还增加了一个粗颗粒的 MMU,用于将 ARM 的物理地址映射到系统总线地址。下面这幅图片展示了与之相关的地址空间。
在这里插入图片描述
在 ARM Linux 中的地址如下:

  • 首先是 ARM 内核规定的虚拟地址
  • 之后是 ARM MMU 映射的物理地址
  • 之后是 ARM mapping MMU 映射的总线地址
  • 最后为适当的外设和 RAM 地址

ARM 虚拟地址 (标准 Linux 内核)

一般情况下,BCM2835 标准的 Linux 内核在存储单元的头部对整个可使用的 RAM 进行了连续的地址映射。该内核被配置为在内核和用户使用的存储空间中分割了 1GB/3GB 的空间。

在 ARM 和 GPU 之间分割的区域用于存放一个支持的 start*.elf 文件,该文件被用作 SD 卡 FAT32 boot 区域的 start.elf。分配给 GPU 的最小存储量为 32MB,但是这将影响其多媒体性能;例如,32MB 的空间小于让 GPU 进行 1080p30 解码所需的缓存空间。

在内核模式下,虚拟地址为 0xC0000000 到 0xEFFFFFFF。

在用户模式下,即在运行 ARM Linux 时,虚拟内存为0x00000000 到 0xBFFFFFFF。

外设(物理地址为0x20000000)被映射到从地址 0xF20000000 处开始的内核虚拟地址空间。因此,在总线地址 0x7Ennnnnn 处的外设在 ARM 内核的虚拟地址为 0xF2nnnnnn。

ARM 物理地址

RAM 的物理地址从 0x00000000 处开始。

  • ARM 定义的 RAM 地址从 0x00000000 开始
  • 只有在系统被配置为支持内存映射显示时,RAM 中的 VideoCore 部分才会被映射(这是常见情况)

VideoCore MMU 通过 VideoCore (和 VideoCore 外设)将 ARM 物理地址空间映射到总线地址空间。RAM 的总线地址被设置为映射到 VideoCore 内 uncache[^1] 总线地址 0xC0000000 处开始。

外设的物理地址是从 0x20000000 到0x20FFFFFF。外设的总线地址被映射到外设地址总线 0x7E000000 处开始。因此访问地址 0x7Ennnnnn 实际上是在访问物理地址 0x20nnnnnn。

总线地址

在本文中将外设地址称为总线地址。软件直接访问外设时,需要用如上所示的方式将地址转换位物理地址或虚拟地址。软件使用 DMA 访问外设时必须使用总线地址。

软件直接访问 RAM 时,必须使用物理地址(从0x00000000开始)。软件使用 DMA 访问 RAM 时,必须使用总线地址(从0xC0000000开始)。

外设访问内存的正确顺序

BCM2835 系统使用 AMBA AXI 兼容的接口结构。为了保证较低的系统复杂性和较高的数据吞吐量,BCM2835 的 AXI 系统并没有始终按照次序地返回数据[^2]。GPU 具有特殊的逻辑可以不按次序的拷贝数据,但是 ARM 内核并不支持这个逻辑。因此在使用 ARM 访问外设时必须予以警惕。

在访问同一个外设时,数据总是按照次序地返回。但当访问是从一个外设到另一个外设时,数据就可能会错乱。为了确保数据具有正确的顺序,最简单的方法是在代码的临界区域设置内存隔离指令(memory barrier instructions)。如下两点:

  • 在首次写外设前设置一个内存写屏障
  • 在最后一次读外设之后设置一个内存读屏障

并不是每一次读或写操作之后都需要设置一个内存隔离指令,仅在代码对一个外设读或写操作是跟在对另一不同外设执行读或写操作之后时才需要,这通常是在进入或者退出外设服务函数时。

在代码的任何位置都有可能产生中断,因此你需要有如下防护措施。如果在读一个外设时发生中断,则需要先设置一个内存读屏障,如果在写一个外设时发生中断,则需要在之后设置一个内存写屏障。

[1] BCM2835 上具有一个 128KB 的 L2 cache,主要用于 GPU。访问内存时是经过还是绕过 L2 cache 由总线地址的高两位决定。

[2] 一般来说,在执行两次读操作时,处理器假定数据是按序返回的。所以先从 X 位置处读数据再从 Y 位置处读取数据时,应先返回 X 位置的数据。返回数据的顺序发生错乱将导致错误的结果。例如:

a_status = *pointer_to_peripheral_a;
b_status = *pointer_to_peripheral_b;

没有采取预防措施时,a_status 和 b_status 的数值可能会发生交换。

理论上这可能会导致错误,但实际上这种情况很难发生,因为 AXI 系统可以确保数据始终被按序地送到目的地。因此:

*pointer_to_peripheral_a = value_a;
*pointer_to_peripheral_b = value_b;

一直是正确的。唯一可能出现错误的时候是不同的外设被连接到了相同的外部设备。

内存屏障

内存屏障,也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。
大多数现代计算机为了提高性能而采取乱序执行,这使得内存屏障成为必须。
语义上,内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入内存屏障。

VideoCore

VideoCore 是一个由Alphamosaic Ltd开发并且现在被Broadcom拥有的低功耗移动多媒体指令集架构。二维的DSP架构使其在软件中可以灵活且高效地编解码多媒体数据的同时保持低功耗。该IP核目前仅在Broadcom的SoC中被使用。

总线地址

总线地址(Bus Address)通常是指在计算机体系结构中,硬件设备或内存区域在系统总线上的地址。在不同的硬件架构和操作系统中,总线地址的表示方式可能会有所不同。一般而言,总线地址用于唯一标识系统中的硬件设备或内存位置。

在嵌入式系统或计算机体系结构中,总线地址通常与物理地址或虚拟地址相关联,具体取决于系统的内存管理方案。以下是一些常见的总线地址的相关情境:

  1. 物理内存地址: 在物理内存中,总线地址通常直接映射到硬件设备或内存位置。在某些嵌入式系统中,设备寄存器的地址可能与物理内存地址相同。

  2. 虚拟内存地址: 在使用虚拟内存的系统中,总线地址可能会通过页表映射到虚拟地址空间。这允许操作系统灵活地管理内存,但硬件设备可能需要通过特殊的访问方式(例如内存映射 I/O)来与虚拟地址通信。

总线地址通常是硬件文档中提供的关键信息,用于编写驱动程序或与硬件交互的应用程序。在 Linux 等操作系统中,设备驱动程序通常需要知道硬件设备的总线地址,以便正确地访问设备寄存器或内存区域。

CPU能够访问内存的范围

物理地址

物理地址是计算机系统中主存(RAM)或其他硬件设备在物理内存中的唯一标识。它是硬件层面上的地址,直接对应于计算机系统的物理硬件。物理地址空间的大小取决于计算机的体系结构和硬件设计。

在典型的计算机系统中,物理地址是一个用于寻址主存的二进制值。CPU 通过物理地址直接访问主存中的数据,而无需进行额外的转换。物理地址的范围通常从零开始,到系统的最大物理内存地址。

对于 x86 架构的计算机,物理地址通常是一个32位或64位的值,具体取决于操作系统和硬件。在 32 位系统中,物理地址范围为 0x00000000 到 0xFFFFFFFF(4 GB),而在 64 位系统中,物理地址范围非常广泛。

物理地址的使用场景包括:

  1. 主存寻址: CPU 通过物理地址直接寻址主存中的数据和指令。
  2. 设备寻址: 某些硬件设备可能通过物理地址空间进行访问,例如外围设备寄存器。
  3. DMA(直接内存访问): DMA 控制器使用物理地址来直接访问主存,而无需 CPU 的干预。

物理地址和虚拟地址之间的映射是由操作系统的内存管理单元(MMU)进行管理的。虚拟地址在用户程序中使用,而 MMU 负责将虚拟地址翻译成相应的物理地址。这种映射提供了对主存的抽象,使得每个进程都认为它拥有自己的私有地址空间。

虚拟地址

虚拟地址(Virtual Address)是在计算机系统中用于访问虚拟内存的地址。每个运行的进程都拥有其独立的虚拟地址空间,这使得每个进程感觉自己独占整个计算机系统的内存。虚拟地址与物理地址之间的映射关系由操作系统和硬件共同管理。

关键点:

  1. 每个进程有独立的虚拟地址空间: 每个运行的进程都认为它在使用整个地址空间,从0到最大地址。这种隔离使得每个进程无法直接访问其他进程的内存。

  2. 虚拟地址与物理地址映射: 虚拟地址通过操作系统的地址翻译机制(例如页表)映射到物理内存地址。这个映射关系是动态的,可以随着进程的执行而改变。

  3. 虚拟地址空间的组成部分:

    • 代码段: 存放执行代码的部分。
    • 数据段: 存放全局和静态变量的部分。
    • 堆: 用于动态内存分配的区域,可以动态扩展和收缩。
    • 栈: 存放局部变量和函数调用信息的区域,是一个后进先出(LIFO)结构。
  4. 地址空间大小: 虚拟地址的位数决定了进程能够寻址的虚拟内存空间的大小。例如,32位系统可以寻址的虚拟地址空间为 2 32 2^{32} 232,而64位系统可以提供更大的虚拟地址范围。

  5. 用户空间和内核空间: 虚拟地址空间通常被分为用户空间和内核空间。用户空间用于存放应用程序代码和数据,而内核空间用于存放操作系统内核的代码和数据。用户空间和内核空间之间有一个分界线,通常由操作系统维护。

虚拟地址为多任务处理、内存隔离和动态内存管理提供了灵活性和抽象性。在程序执行时,操作系统负责将虚拟地址映射到实际的物理内存地址,以满足程序对内存的访问需求。

页表和内存管理单元MMU

页表(Page Table)和内存管理单元(Memory Management Unit,MMU)是计算机系统中用于实现虚拟内存的关键组成部分。

页表(Page Table):

  1. 定义: 页表是一个数据结构,用于存储虚拟地址到物理地址的映射关系。每个进程都有自己的页表,它将进程的虚拟地址映射到实际的物理内存地址。

  2. 工作原理: 当程序访问虚拟地址时,MMU使用页表将虚拟地址翻译为物理地址。页表以页面(通常大小为4 KB)为单位进行映射,将虚拟地址空间划分为页面,并将这些页面映射到物理内存中的相应页面。

  3. 层次结构: 为了支持大型地址空间,页表通常采用多级层次结构,例如两级或三级页表。这种结构允许灵活地组织和管理大量的映射关系,而不需要占用过多的内存。

内存管理单元(Memory Management Unit,MMU):

  1. 定义: MMU是计算机体系结构中的硬件组件,负责执行虚拟地址到物理地址的转换。它是一个关键的硬件模块,用于支持虚拟内存和提供内存隔离。

  2. 工作原理: MMU通过查找页表的内容,将程序产生的虚拟地址映射到实际的物理内存地址。这个过程是在硬件级别完成的,不需要程序员手动介入。

  3. 地址翻译: 当程序访问虚拟地址时,MMU将虚拟地址的各个部分进行解析,并根据页表中的映射关系计算出相应的物理地址。这个过程是透明的,对于应用程序而言,它感觉自己在使用整个地址空间。

总体而言,页表和MMU的组合允许操作系统和硬件协同工作,提供了虚拟内存的抽象层,使得每个进程都可以使用其独立的地址空间,而不必担心实际的物理内存布局。这种机制提高了内存的利用率,并为操作系统提供了更大的灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/256165.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【赠书活动】OpenCV4工业缺陷检测的六种方法

文章目录 前言机器视觉缺陷检测工业上常见缺陷检测方法延伸阅读推荐语 赠书活动 前言 随着工业制造的发展,对产品质量的要求越来越高。工业缺陷检测是确保产品质量的重要环节,而计算机视觉技术的应用能够有效提升工业缺陷检测的效率和精度。 OpenCV是一…

【机器学习】卷积神经网络(CNN)的特征数计算

文章目录 基本步骤示例图解过程 基本步骤 在卷积神经网络(CNN)中,计算最后的特征数通常涉及到以下步骤: 确定输入尺寸: 首先,你需要知道输入数据的尺寸。对于图像数据,这通常是 (batch_size, c…

1-完全理解以太坊智能合约

了解区块链 区块链技术的核心概念是分布式账本,它是许多参与者共享的特定类型的数据库。 这个特殊的数据库只是一个交易列表,记录着网络中发生的每笔交易。每个人都可以拥有自己的交易列表备份,再加上强有力的货币激励措施消除各方之间信任…

记录今日将C语言的Windows程序更改为python语言Windows程序,实现子窗口控制,类似微信程序框架最简单的原型

基本思路 为什么要选择python制作Windows应用程序,主要就是源代码直接展示,发现问题随时修改,同时可以不断增加新的功能方便。 由于C语言的Windows程序中结构类型在python中不能使用, 因此我们按照ctypes模块指导意见继承structu…

基于双目RGB图像和图像深度信息的三维室内场景建模matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 双目视觉原理 4.2 深度信息获取 4.3 表面重建 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .....................................…

STM32与Freertos入门(三)任务的创建、删除

1、串口配置 首先将串口进行配置,后续经常会应用,具体步骤点击:串口配置。 2、任务 创建一个任务,就是开辟一个空间、每个任务中都会有while(1)死循环。 2.1相关函数 动态创建:xTaskCreate…

ros2/ros 4轮2驱机器人xacro/urdf文件示例代码

这个实验中最重要的是&#xff1a;colcon build 之后要记得source install/setup.bash.否则修改的文件是不会更新的。知道了吧 <robot name"half" xmlns:xacro"http://wiki.ros.org/wiki/xacro"><xacro:property name"PI" value"3…

SL3041高耐压100V降压恒压芯片 24V降压5V 24V降压12V 12V降5V

SL3041宽电压100V恒压芯片 24V降压5V 24V降压12V SL3041是一款宽电压100V恒压芯片&#xff0c;具有高效率、高精度、高可靠性等优点&#xff0c;广泛应用于各种电源系统中。在本文中&#xff0c;我们将详细介绍SL3041的工作原理、应用场景以及如何使用它实现24V降压5V和24V降压…

无框架Java转go语言写http与tcp请求

项目地址 https://github.com/cmdch2017/http_tcpServer 项目结构 如何快速上手 http篇 1、controller包就相当于RestController&#xff0c;这里返回了一个Person对象&#xff0c;当你需要新建一个接口时&#xff0c;再新写一个func仿照下面的方法就行了 package control…

GaussDB数据库表创建行访问控制策略

目录 一、前言 二、GaussDB中的行访问控制 1、CREATE ROW LEVEL SECURITY POLICY语法 2、ALTER ROW LEVEL SECURITY POLICY语法 3、ROW LEVEL SECURITY策略与适配SQL语法关系 三、GaussDB中的行访问控制策略示例 1、实现GaussDB行访问控制的一般步骤 2、行访问控制策略…

AWS解决方案架构师学习与备考

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

信息收集 - 网站服务器

操作系统 区分大小写: 如果修改首页或其他页面的大小写后,网站返回一个错误页面,例如报错 "404 Not Found" 或类似的错误,这可能意味着网站运行在 Linux 或类 Unix 操作系统上。这是因为大多数 Linux 系统是区分大小写的。如果修改大小写后,网站页面正常显示,这…

maui中实现加载更多 RefreshView跟ListView(2)

一个类似商品例表的下拉效果&#xff1a; 代码 新增个类为商品商体类 public class ProductItem{public string ImageSource { get; set; }public string ProductName { get; set; }public string Price { get; set; }}界面代码&#xff1a; <?xml version"1.0&quo…

人体关键点检测4:C/C++实现人体关键点检测(人体姿势估计)含源码 可实时检测

人体关键点检测4&#xff1a;C/C实现人体关键点检测(人体姿势估计)含源码 可实时检测 目录 人体关键点检测4&#xff1a;C/C实现人体关键点检测(人体姿势估计)含源码 可实时检测 1.项目介绍 2.人体关键点检测方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&…

Vue--第十天

终极实战----大事件项目 1.简介&#xff1a; 2.创建项目&#xff1a; 1.创建&#xff08;159-163&#xff09;&#xff1a; 还是对着视频操作吧 2.路由&#xff1a; 3.element Plus: 导入element Plus 后不需要再导入插件配置&#xff0c;就连组件导入也不用 4.pinia构建用…

【C盘清理】Jetbrains全家桶(PyCharm、Clion……)更改 IDE 特定文件(配置、缓存、插件、日志等)存储位置

文章目录 一、官网说明二、更改 IDE 目录的位置1. 转到“帮助”|“编辑自定义属性”2. 各文件位置3. 以PyCharm系统目录为例4. 修改idea.properties 三、清理旧的 IDE 目录 一、官网说明 IDE 使用的目录官网说明 二、更改 IDE 目录的位置 默认情况下&#xff0c;PyCharm 将每…

pytorch——豆瓣读书评价分析

任务目标 基于给定数据集&#xff0c;采用三层bp神经网络方法&#xff0c;编写程序并构建分类模型&#xff0c;通过给定特征实现预测的书籍评分的模型。 选取数据 在各项指标中&#xff0c;我认为书籍的评分和出版社、评论数量还有作者相关&#xff0c;和其他属性的关系并大。…

vscode如何开发微信小程序?(保姆级教学)

1.安装“微信小程序开发工具”扩展 2.安装“vscode weapp api”扩展 3.安装“vscode wxml”扩展 4.安装“vscode-wechat”扩展 5.在终端执行命令&#xff1a; vue create -p dcloudio/uni-preset-vue uniapp-test uniapp-test就是我这里的项目名称了 6.如果遇到了这个错误&a…

云渲染插件怎么设置?云渲染插件设置教程

云渲染技术以其高效、便捷的特性正改变着3D设计和视频制作行业。为了进一步简化渲染过程&#xff0c;云渲染插件应运而生。云渲染插件可以让用户在熟悉的3D软件环境中直接完成渲染任务&#xff0c;大幅提高工作的连贯性与效率。那么如何在3D软件中安装和设定这些神奇的云渲染插…

【为数据之道学习笔记】5-7五类数据主题联接的应用场景

在数字化转型的背景下&#xff0c;华为的数据消费已经不再局限于传统的报表分析&#xff0c;还要支持用户的自助分析、实时分析&#xff0c;通过数据的关联&#xff0c;支持业务的关联影响分析以及对目标对象做特征识别&#xff0c;进行特定业务范围圈定、差异化管理与决策等。…