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灯驱动开发准备。

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

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

相关文章

2023亚马逊云科技re:Invent用Amazon Q打造你的知识库

随着ChatGPT的问世,我们迎来了许多创新和变革的机会。一年一度的亚马逊云科技大会re:Invent也带来了许多前言的技术,其中亚马逊云科技CEO Adam Selipsky在2023亚马逊云科技re:Invent大会中重磅推出Amazon Q,这预示着生成式AI的又一个里程碑。…

09.list 容器

9、list 容器 功能: 将数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成: 链表由一系列结点组成 结点的组成: 一个是存…

Canal使用详解

Canal介绍 Canal是阿里巴巴开发的MySQL binlog增量订阅&消费组件,Canal是基于MySQL二进制日志的高性能数据同步系统。在阿里巴巴集团中被广泛使用,以提供可靠的低延迟增量数据管道。Canal Server能够解析MySQL Binlog并订阅数据更改,而C…

【redis笔记】

Redis简介 安装步骤 Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型: 字符串string ​ 哈希hash 适合存储对象 列表list 按照插入顺序排序,可以有重复元素 集合set 无序集合,没…

[Android]CheckBox复选框

在Android开发中,复选框(CheckBox)是一种常用的控件,用于让用户在多个选项中进行选择。它通常用于表单中,让用户选择多个选项或者进行多项操作。在本篇博客中,我们将介绍如何在Android应用中使用CheckBox控…

Android MVI架构之UI状态的持有与保存

Android MVI架构之UI状态的持有与保存 我们将介绍状态持有者和其他与 UI 层相关的主题,例如在 Android 上提升状态和保存 UI 状态的位置。 状态持有者 状态持有者通过处理逻辑和/或公开 UI 状态来简化 UI。在本节中,我们将看到如何实现状态持有者以及…

Linux安装idea

目录 1.下载网址 2.解压安装 2.1新建idea安装路径 2.2解压压缩包到指定目录 2.3运行idea 3.下载Java环境 3.1命令行下载方式(建议自行下载较新版本一步到位) 3.2查看java版本 3.3版本不满意卸载当前jdk 3.4从官网下载较新的deb包进行下载 3.5解…

PyQt5设计一个简单的抽奖系统

PyQt5抽奖系统 程序运行截图 抽奖系统代码 该系统使用PyQt5模块以及openpyxl模块开发,需要使用pip安装导入PyQt5模块和openpyxl模块 import random, sys from PyQt5.QtWidgets import QWidget, QFormLayout, QLineEdit, QVBoxLayout, QApplication, QPushButton,…

Mysql 数据库APi 编程(c/c++)-1.0

MySQL数据库API库 访问MySQL服务器,这需要使用mysqlclient库,MySQL的大多数客户端API(除Java和.NET)都是通过这个库来和MySQL服务器通讯的,而这个库正是使用C语言编写的。 可使用mysql -V 命令查看当前系统内所使用的…

C# Onnx yolov8n csgo player detection

目录 效果 模型信息 项目 代码 下载 C# Onnx yolov8n csgo player detection 效果 模型信息 Model Properties ------------------------- date:2023-12-22T15:01:08.014205 author:Ultralytics task:detect license:AGPL-…

从0到1部署gitlab自动打包部署项目

本文重点在于配置ci/cd打包 使用的是docker desktop 第一步安装docker desktop Docker简介 Docker 就像一个盒子,里面可以装很多物件,如果需要某些物件,可以直接将该盒子拿走,而不需要从该盒子中一件一件的取。Docker中文社区、…

集合论:二元关系(1)

集合论这一章内容很多,重点是二元关系中关系矩阵,关系图和关系性质:自反、反自反、对称、反对称、传递以及关系闭包的运算,等价关系,偏序关系,哈斯图,真吓人! 1.笛卡儿积 由两个元素x和y按照一…

Opencv计算机视觉的分类

传统的计算机视觉可以使用Opencv等Python库,对图像进行简单的操作,例如对图像缩放、滤波、阈值分割等等。对于计算机来说,一张彩色图片就是一个三通道的矩阵,分别对应红绿蓝(RGB)三种颜色,通过改…

计算机网络 应用层上 | 域名解析系统DNS 文件传输协议FTP,NFS 万维网URL HTTP HTML

文章目录 1 域名系统DNS1.1 域名vsIP?1.2 域名结构1.3 域名到IP的解析过程域名服务器类型 2 文件传送协议2.1 FTP 文件传输协议2.2 NFS 协议2.3 简单文件传送协议 TFTP 3 万维网WWW3.1 统一资源定位符URL3.2 超文本传送协议HTTP3.2.1 HTTP工作流程3.2.2 HTTP报文结构…

生物系统学中的进化树构建和分析R工具包V.PhyloMaker2的介绍和详细使用

V.PhyloMaker2是一个R语言的工具包,专门用于构建和分析生物系统学中的进化树(也称为系统发育树或phylogenetic tree)。以下是对V.PhyloMaker2的一些基本介绍和使用说明: 论文介绍:V.PhyloMaker2: An updated and enla…

混合精度训练(MAP)

一、介绍 使用精度低于32位浮点数的数字格式有很多好处。首先,它们需要更少的内存,可以训练和部署更大的神经网络。其次,它们需要更少的内存带宽,这加快了数据传输操作。第三,数学运算在降低精度的情况下运行得更快&a…

web架构师编辑器内容-创建业务组件和编辑器基本行为

编辑器主要分为三部分,左侧是组件模板库,中间是画布区域,右侧是面板设置区域。 左侧是预设各种组件模板进行添加 中间是使用交互手段来更新元素的值 右侧是使用表单的方式来更新元素的值。 大致效果: 左侧组件模板库 最初的模板…

博客引擎 Hexo 入门介绍+安装笔记

Hexo Hexo is a fast, simple & powerful blog framework. 一直使用的是 jekyll,文章越写越多,不太好管理。是时候换个博客尝试一下。 Prepare blog zh_CN 本机为 MAC。不同系统会略有不同,但是大同小异。 Node.js 必须。 作用&…

LLM之RAG实战(八)| 使用Neo4j和LlamaIndex实现多模态RAG

人工智能和大型语言模型领域正在迅速发展。一年前,没有人使用LLM来提高生产力。时至今日,很难想象我们大多数人或多或少都在使用LLM提供服务,从个人助手到文生图场景。由于大量的研究和兴趣,LLM每天都在变得越来越好、越来越聪明。…

网站使用https认证

随着网络的普及和依赖程度的增加,网站安全性问题也日益凸显。为了确保用户和网站之间的数据传输安全,采用HTTPS认证已经变得至关重要。 1.数据安全是首要任务 在互联网上,信息传输是网站运作的基础。然而,未加密的传输容易受到中…