【Linux驱动开发】004 物理内存与虚拟内存的转换

这篇具有很好参考价值的文章主要介绍了【Linux驱动开发】004 物理内存与虚拟内存的转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、地址映射

MMU 全称叫做 Memory Manage Unit,也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU,但是现在Linux 内核已经支持无 MMU 的处理器了。MMU主要功能:

①、完成虚拟空间到物理空间的映射。 
②、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。 

对于 32 位的处理器,虚拟地址范围是 2^32=4GB,我们的阿尔法开发板上有 512MB 的 DDR3,这 512MB 的内存就是物理内存(RAM),经过 MMU 可以将其映射到整个 4GB 的虚拟空间。虚拟地址范围比物理地址范围大的问题处理器自会处理,这里我们不要去深究。

【Linux驱动开发】004 物理内存与虚拟内存的转换


二、物理内存与虚拟内存的转换

Linux 内核启动的时候会初始化 MMU,设置好内存映射,设置好以后 CPU 访问的都是虚拟地址。

1、ioremap 函数 

ioremap 函数用于获取指定物理地址空间对应的虚拟地址空间。

假如我们要获取 I.MX6ULL 的 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 寄存器对应的虚拟地址,使用如下代码即可: 

#define SW_MUX_GPIO1_IO03_BASE    (0X020E0068) // 物理地址
static void __iomem*    SW_MUX_GPIO1_IO03; 
SW_MUX_GPIO1_IO03 = ioremap(SW_MUX_GPIO1_IO03_BASE, 4); // 虚拟地址,对于 I.MX6ULL 来说一个寄存器是 4 字节(32 位)的,因此映射的内存长度为 4。

2、iounmap 函数 

卸载驱动的时候需要使用 iounmap 函数释放掉 ioremap 函数所做的映射。

iounmap 只有一个参数 addr,此参数就是要取消映射的虚拟地址空间首地址,即SW_MUX_GPIO1_IO03

iounmap(SW_MUX_GPIO1_IO03); 

三、I/O 内存访问函数

这里涉及到两个概念:I/O 端口和 I/O 内存。

  • I/O 端口: 当外部寄存器或内存映射到 IO 空间时,例如我们学习单片机的时候讲的 GPIO 引脚。
  • I/O 内存: 当外部寄存器或内存映射到内存空间时。

但是对于 ARM 来说没有 I/O 空间这个概念(ARM 处理器通过内存映射 I/O 来控制 I/O 设备,而不是使用独立的I/O地址空间),因此 ARM 体系下只有 I/O 内存(可以直接理解为内存)。

使用 ioremap 函数将寄存器的物理地址映射到虚拟地址以后,我们就可以直接通过指针访问这些地址,但是 Linux 内核不建议这么做,如果直接操作虚拟内存可能出现一些意想不到的问题,因此这里推荐使用提供的两个函数进行操作。

1、读操作函数

参数 addr 就是要读取写内存地址,返回值就是读取到的数据。

// 分别是1字节、2字节、4字节( 8bit、16bit 和 32bit )读操作
1 u8  readb(const volatile void __iomem *addr) 
2 u16 readw(const volatile void __iomem *addr) 
3 u32 readl(const volatile void __iomem *addr) 

2、写操作函数 

参数 value 是要写入的数值,addr 是要写入的地址。文章来源地址https://www.toymoban.com/news/detail-450531.html

//  8bit、16bit 和 32bit 写操作
1 void writeb(u8 value,  volatile void __iomem *addr) 
2 void writew(u16 value, volatile void __iomem *addr) 
3 void writel(u32 value, volatile void __iomem *addr) 

到了这里,关于【Linux驱动开发】004 物理内存与虚拟内存的转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux内存管理 | 四、物理地址空间设计模型

    我的圈子: 高级工程师聚集地 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强企业! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 前面几篇文章,主要讲解了虚拟内存空间的布局和管理,下面同步来聊聊物理内

    2024年02月08日
    浏览(49)
  • 【操作系统基础】【CPU访存原理】:寄存 缓存 内存 外存、内存空间分区、虚拟地址转换、虚拟地址的映射

    存储器怎么存储数据、内存空间分区、虚拟地址转换 计算机的存储器:寄存 缓存 内存 外存(按功能划分) 计算机的处理器需要一个存储器来存储大量的指令和数据以便自己不断取指执行和访问数据。 内存 (内存就是运行内存,如手机的8G运行内存,电脑的16G运行内存)就

    2024年01月25日
    浏览(56)
  • 【Linux从入门到精通】进程地址空间(虚拟地址 vs 物理地址)

         本篇文章会围绕 三个问题(什么是地址空间?地址空间是如何设计的?为什么要有地址空间?) 进行展开讲述。其中主要是了解虚拟地址和物理地址的区别。希望本篇文章会对你有所帮助。 文章目录 一、什么是地址空间? 1、1 验证地址空间 1、2 地址空间是指的物理

    2024年02月10日
    浏览(94)
  • 【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系

    ========================================================================= 个人主页点击直达: 小白不是程序媛 Linux专栏: Linux系统化学习 代码仓库: Gitee ========================================================================= 目录 虚拟地址和物理地址 页表 进程地址空间 进程地址空间存在的意义 我们在学

    2024年02月05日
    浏览(50)
  • 《操作系统》逻辑地址如何转换为物理地址

    (1)十六进制 逻辑地址=页号+页内地址 物理地址=块号+页内地址 (2)非十六进制 物理地址=块号*页内大小+页内地址 页号=逻辑地址/页面大小字节=(取整数) 页内地址=逻辑地址%页面大小字节=(取余数) (1)十六进制 例题 一分页存储管理系统中逻辑地址长度为16位,页面

    2024年02月04日
    浏览(45)
  • 虚拟化中的虚拟地址与物理地址的映射——EPT机制

    ​当 secondary processor-based VM-execution control 字段 “enable EPT” 为 1 时,启用 EPT ( Extended Page Table,扩展页表)机制 ​开启 EPT 机制后 VMM 需要建立 EPT 页表结构,通过在 EPTP ( Extende Page Table Pointer ) 中提供 EPT 页表结构的指针值,为每个 VM 准备不同的 EPT 页表结构或在同一个 EPT 页

    2024年02月19日
    浏览(37)
  • Windows 虚拟地址 到底是如何映射到 物理地址 的?

    我发现有很多的 .NET程序员 写了很多年的代码都没弄清楚什么是 虚拟地址 ,更不用谈什么是 物理地址 以及Windows是如何实现地址映射的了?这一篇我们就来聊一聊这两者之间的联系。 怎么去找 虚拟地址 呢?相信很多朋友都知道 应用程序 用的是虚拟地址,所以从应用程序中

    2024年02月11日
    浏览(40)
  • 2.3.1操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则

    在存储管理当中,操作系统会负责将外存的一些文件调入到内存当中,以便给CPU调用,如果调用的内容不在内存当中,那么会产生一种中断,叫做缺页中断。然后从外存调数据,调完数据再返回,接着访问之前的断点部分。 在调用的过程当中,如果是一个几十G的文件,调入

    2024年02月03日
    浏览(44)
  • Linux设备驱动开发 - 虚拟时钟Clock驱动示例

    By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 很多设备里面系统时钟架构极其复杂,让学习Clock驱动的盆友头大。这里我参考S3C2440的clock驱动写了一个virtual clock,即虚拟时钟驱动,分别包含clock的provider和

    2023年04月21日
    浏览(38)
  • 怎么让虚拟机的IP地址与物理机的IP地址处于同一个网段

    首先打开虚拟机的设置: 设置网络适配器的连接方式: 点击下拉按钮,查看连接方式 我选择VMent8是因为我的物理机网络适配器有一个VMent8的虚拟网卡,那怎么选择自己想要的虚拟网段呢? 打开物理机的 控制面板- 这两个都是物理机的虚拟网卡, 对VMent8 右键--属性--Internet协

    2024年02月11日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包