Linux系统中的地址映射

一.  简介

在前面的裸机开发实验 LED灯实验中 ,其实就是操作 IMX6ULL芯片的寄存器。

Linux 驱动开发也可以操作寄存器,但是,Linux不能直接对寄存器物理地址进行读写操作,例如,寄存器 A的物理地址为 0X01010101。 裸机开发时可以直接对 0X01010101这个物理地址进行操作,但是,Linux 开发则不行。因为 Linux会使能 MMU。

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

二.  Linux系统中的地址映射

1.  MMU(即内存管理单元)

MMU也就是内存管理单元。主要完成的功能如下:

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

我们重点来看一下第 ① 点,也就是虚拟空间到物理空间的映射,也叫做地址映射。

首先了
解两个地址概念:虚拟地址 (VA,Virtual Address) 、物理地址 (PA PhyscicalAddress) 。对于 32
的处理器来说,虚拟地址范围是 2^32=4GB ,我所使用的开发板DDR3的容量是 256MB ,这  256MB 内存就是物理内存,经过 MMU 可以将其映射到整个 4GB 的虚拟空间。
注意:不单单是 DDR,外设的寄存器的地址也是物理地址!!
如下图 所示:

物理内存只有 512MB ,虚拟内存有 4GB ,那么肯定存在多个虚拟地址映射到同一个物理地址上去,虚拟地址范围比物理地址范围大的问题处理器自会处理,这里我们不要去深究,因为 MMU 是很复杂的一个东西。

2.  内存映射涉及函数

Linux 内核启动的时候会初始化 MMU ,设置好内存映射,设置好以后 CPU 访问的都是虚
拟 地 址 。
例如, I.MX6ULL GPIO1_IO03 引 脚 的 复 用 寄 存 器 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 的地址为 0X020E0068 。如果没有开启 MMU 的话, 直接向 0X020E0068 这个寄存器地址写入数据就可以配置 GPIO1_IO03 的复用功能。
现在开启 MMU ,并且设置了内存映射,因此,就不能直接向 0X020E0068 这个地址写入数据了。我们必 须得到 0X020E0068 这个物理地址在 Linux 系统里面对应的虚拟地址。
这里就涉及到了物理内 存和虚拟内存之间的转换,需要用到两个函数: ioremap()函数 iounmap 函数。

ioremap 函数

ioremap 函 数 用 于 获 取 指 定 物 理 地 址 空 间 对 应 的 虚 拟 地 址 空 间 , 定 义 在
arch/arm/include/asm/io.h 文件中,定义如下:
#define ioremap(cookie,size) __arm_ioremap((cookie), (size), 
MT_DEVICE)void __iomem * __arm_ioremap(phys_addr_t phys_addr, size_t size, 
unsigned int mtype)
{return arch_ioremap_caller(phys_addr, size, mtype,__builtin_return_address(0));
}

ioremap 是个宏,有两个参数: cookie size ,真正起作用的是函数 __arm_ioremap ,此函
数有三个参数和一个返回值,这些参数和返回值的含义如下:
phys_addr :要映射给的物理起始地址。
size :要映射的内存空间大小。
mtype ioremap 的类型,可以选择 MT_DEVICE MT_DEVICE_NONSHARED
MT_DEVICE_CACHED MT_DEVICE_WC ioremap 函数选择 MT_DEVICE
返回值: __iomem 类型的指针,指向映射后的虚拟空间首地址。

iounmap 函数

卸载驱动时,需要使用 iounmap 函数释放掉 ioremap 函数所做的映射, iounmap 函数原
型如下:
void iounmap (volatile void __iomem *addr)
iounmap 只有一个参数 addr ,此参数就是要取消映射的虚拟地址空间首地址。

三.  举例说明

假如,我们要获取 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);
SW_MUX_GPIO1_IO03_BASE 是寄存器物理地址, SW_MUX_GPIO1_IO03 是映射后
的虚拟地址。对于 I.MX6ULL 来说一个寄存器是 4 字节 (32 ) 的,因此映射的内存长度为 4
映射完成以后直接对 SW_MUX_GPIO1_IO03 进行读写操作即可。

假如,我们现在要取消掉 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 寄存器的地址映射,使用如下代码 即可:
iounmap(SW_MUX_GPIO1_IO03);

这里了解 Linux地址映射,主要为 LED灯驱动开发准备。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32的HC-SR501红外感应模块驱动与应用

一、 简介 HC-SR501红外感应模块是一种常用的人体红外感应模块,常用于安防监控、智能家居等领域。本文将介绍如何在STM32单片机上驱动和应用HC-SR501红外感应模块,实现基本的人体检测功能。 二、 模块原理 HC-SR501红外感应模块基于红外热释电传感器&am…

C++设计模式 #3策略模式(Strategy Method)

动机 在软件构建过程中,某些对象使用的的算法可能多种多样,经常改变。如果将这些算法都写在类中,会使得类变得异常复杂;而且有时候支持不频繁使用的算法也是性能负担。 如何在运行时根据需求透明地更改对象的算法?将…

DRF之引入

目录 一、web应用模式 【1】前后端混合开发 【2】前后端分离 二、API接口 三、接口测试工具:Postman 四、RESTful API规范 【1】什么是RESTful 【2】RESTful API的规范 2.1 数据的安全保障 2.2 接口特征表现 2.3 多数据版本共存 2.4 数据即是资源&#…

Python并行计算和分布式任务全面指南

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python并行计算和分布式任务全面指南。全文2900字,阅读大约8分钟 并发编程是现代软件开发中不可或缺的一部分,它允许程序同时执行多个任务&#xff0…

Win10纯净版edge浏览器改为ie浏览器的方法

在Win10纯净版系统中,用户喜欢使用ie浏览器来浏览页面,但是电脑默认浏览器为edge浏览器,所以想把edge浏览器改成ie浏览器,但不知道更改的操作方法。下面小编给大家详细介绍将Win10电脑默认浏览器edge浏览器改为ie浏览器的方法步骤…

文献速递:生成对抗网络医学影像中的应用——基于CycleGAN的图像到图像转换,用于逼真的外科手术训练模型

文献速递:生成对抗网络医学影像中的应用——基于CycleGAN的图像到图像转换,用于逼真的外科手术训练模型 本周给大家分享文献的主题是生成对抗网络(Generative adversarial networks, GANs)在医学影像中的应用。文献的研究内容包括…

一文掌握分布式锁:Mysql/Redis/Zookeeper实现

目录 一、项目准备spring项目数据库 二、传统锁演示超卖现象使用JVM锁解决超卖解决方案JVM失效场景 使用一个SQL解决超卖使用mysql悲观锁解决超卖使用mysql乐观锁解决超卖四种锁比较Redis乐观锁集成Redis超卖现象redis乐观锁解决超卖 三、分布式锁概述四、Redis分布式锁实现方案…

人大金仓Kingbase数据库备份和还原

前言 最近在项目开发过程中,使用了国产数据库人大金仓(即Kingbase数据库),在使用过过程中需要对数据库进行备份与还原,在此对相关的命令进行简单介绍,以备不时之需。 Linux环境下安装人大金仓可参考此篇文…

ECMAScript基础入门:猫头虎博主的技术分享

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

Spring中你一定要知道的afterPropertiesSet()

文章目录 功能源码 功能 初始化bean执行的回调方法其一,它不像PostConstruct一样可以有多个,只能调用一次;它执行的时机是在PostConstruct之后,从它的名称也可以看出,他是在属性填充完,也就是bean初始化完…

实力强的大模型都有哪些超能力?

实力强的大模型都有哪些超能力? 前几日,人工智能研究公司OpenAI CEO山姆奥特曼(Sam Altman)在谈及人工智能这项技术的潜力以及人们对它的担忧时,曾表示“AI发展速度快得吓人,就像停不下来的龙卷风。”可见&…

如何使用 NFTScan NFT API 在 Base 网络上开发 Web3 应用

Base 是 Coinbase 使用 OP Stack 开发的最新以太坊第 2 层(L2)网络,用于解决以太坊等主要区块链面临的可扩展性和成本挑战。Coinbase 将其描述为“安全、低成本、对开发人员友好的以太坊 L2,旨在将下一个 10 亿用户带入 Web3”。B…

一个抖店内做几个商品链接比较合适?解答下新手问题,建议收藏

我是王路飞。 一个抖店内的商品链接数量,是多一些比较好还是少一些比较好呢? 可能在大多数人看来,当然是多一些比较好了,商品数量更多,基数增加,也能承载更多的进店流量,增加下单几率。 但真…

【Kotlin】一款专门为 Java 程序员打造的快速掌握 Kotlin 技术博客

目录 初识 Kotlin 历史 工作原理 第一个Hello World! Kotlin 语法 变量 基本数据类型 函数 和 选择控制(if、when) if when 循环语句 类和对象 创建和使用 继承 构造 主构造 次构造 接口 定义 实现 权限修饰符 数据类…

VBA_MF系列技术资料1-247

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于定…

在线客服系统推荐:优质选择助您提升客户服务体验

大部分企业依靠在线客服系统和客户达成联系,他为客户和企业之间建立了有效的沟通桥梁。市场上这么多的在线客服系统哪个好呢? 1、明确自己的需求。 这一点是最重要的,要先明确公司使用客服系统是想做售前咨询还是售后服务。不同的需求相对应…

鸿蒙开发之hdc命令行

一、简介 hdc(HarmonyOS Device Connector)是HarmonyOS为开发人员提供的用于调试的命令行工具,通过该工具可以在windows/linux/mac系统上与真实设备进行交互。 二、环境准备 hdc工具通过HarmonyOS SDK获取,存放于SDK的toolchai…

JavaScript高级 函数进阶篇

函数进阶 1、函数的定义和调用 函数声明方式function关键字(命名函数);函数表达式(匿名函数);new Function()(此处的Function()是一个构造函数);var fn new Function(参…

六个探索性数据分析(EDA)工具,太实用了!

当进行数据分析时,探索性数据分析(EDA)是一个至关重要的阶段,它能帮助我们从数据中发现模式、趋势和异常现象。而选择合适的EDA工具又能够极大地提高工作效率和分析深度。在本文中,笔者将介绍6个极其实用的探索性数据分析(EDA)工具&#xff0…

和宝贝一起迎接冬日里的浪漫~优雅有气质

闪闪发光的刺绣亮片面料 自带闪光,是低调而浪漫的存在 蓬松拼接多层网纱 自带裙撑效果的网纱裙摆唯美飘逸 仿佛冬日里的小公主 热烈轻快的奔向即将到来的节日庆典