linux内存操作--ioremap和mmap学习笔记

内存之ioremap内存映射 内核中ioremap为物理内存分配一段虚拟内存的流程实现 阅读详情

最近在做视频输出相关的东西,对于预留给framebuffer的内存使用不是很清楚,现在找到一些资料整理一下,以备使用。if (想看使用方法)  goto   使用方法;

对于一个系统来讲,会有很多的外设,那么这些外设的管理都是通过CPU完成。那么CPU在这个过程中是如何找到外设的呢?

尽管在一个系统中会有诸多的外设,在每个外设的接口电路中会有多个端口。但是如果系统能够每个端口都被赋予一个具体的地址值,那么在系统中就能轻易的找到任何一个外设。系统在管理的时候,不管是内存还是外设都需要分配一个内存地址。对于一个32bit的系统来讲,可寻址的范围为2^32=4G的地址空间。

既然说到地址空间,就要明确地址空间的种类:物理地址、总线地址、虚拟地址。

(1)物理地址

CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中内存的,但也常被映射到其他存储器上(如显存、bios等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。

(2)总线地址

总线的地址线或在地址周期上产生的信号。外设使用的是地址总线,cpu使用的是物理地址。

物理地址和总线地址之间的关系有系统设计决定的。在X86平台上,物理地址就是总线地址,这是因为它们共享相同的地址空间。在其他平台上,可能需要转换/映射。

(3)虚拟地址

现代操作系统普遍采用虚拟内存管理(virtual memory management)机制,这需要MMU的支持。MMU通常是CPU的一部分,如果处理器没有MMU,或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引脚上,被内存芯片(物理内存)接收,这成为物理地址,如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址,而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是讲虚拟地址映射成物理地址。

      linux中,进程的4GB内存分为用户空间和内核空间。用户空间分布为1~3GB剩下的1GB为内核空间。程序员只能使用虚拟地址。系统中每个进程有各自的私有用户控件(0~3GB),这个空间对系统中的其他进程是不可见的。

编址方式

  外设都是通过读写设备上的寄存器来进行工作的,外设寄存器也称为“IO端口”,而IO端口的编址方式有两种,独立编址和统一编址。

统一编址:外设接口中的IO寄存器(即IO端口)与主存单元一样看待,每个端口占用一个存储单元的地址,将主存的一部分划出来用作IO地址空间。 统一编址的原理是将IO的端口地址存储器寻址的地址空间范围之内,此方法也成为存储器映像编址。CPU访问一个端口的操作与访问内存的操作相同,也使用访问内存的指令。独立编址是为端口地址单独开辟一部分地址空间,其访问指令也需要使用单独的指令(不同于内存访问指令)。

   根据CPU体系结构的不同,CPU对IO端口的编址方式有两种:

  (1)I/O映射方式(I/O-mapped)
  典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元。
  (2)内存映射方式(Memory-mapped)
  RISC指令系统的CPU(如ARM、PowerPC等)通常只实现一个物理地址空间,外设I/O端口成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。
  但是,这两者在硬件实现上的差异对于软件来说是完全透明的,驱动程序开发人员可以将内存映射方式的I/O端口和外设内存统一看作是"I/O内存"资源。
 一般来说,在系统运行时,外设的I/O内存资源的物理地址是已知的,由硬件的设计决定。但是CPU通常并没有为这些已知的外设I/O内存资源的物理地址预定义虚拟地址范围,驱动程序并不能直接通过物理地址访问I/O内存资源,而必须将它们映射到核心虚地址空间内(通过页表),然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些I/O内存资源。

void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) 
入口: phys_addr:要映射的起始的IO地址; 
size:要映射的空间的大小; 
flags:要映射的IO空间的和权限有关的标志; 
功能: 将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问; 
实现:对要映射的IO地址空间进行判断,低PCI/ISA地址不需要重新映射,也不允许用户将IO地址空间映射到正在使用的RAM中,最后申请一 个 vm_area_struct结构,调用remap_area_pages填写页表,若填写过程不成功则释放申请的vm_area_struct空 间;
意义:
比如isa设备和pci设备,或者是fb,硬件的跳线或者是物理连接方式决定了硬件上的内存影射到的cpu物理地址。 
在内核访问这些地址必须分配给这段内存以虚拟地址,这正是__ioremap的意义所在 ,需要注意的是,物理内存已经"存在"了,无需alloc page给这段地址了. 

为了使软件访问I/O内存,必须为设备分配虚拟地址.这就是ioremap的工作.这个函数专门用来为I/O内存区域分配虚拟地址(空间).对于直接映射的I/O地址ioremap不做任何事情。有了ioremap(和iounmap),设备就可以访问任何I/O内存空间,不论它是否直接映射到虚拟地址空间.但是,这些地址永远不能直接使用(指物理地址),而要用readb这种函数。

使用I/O内存首先要申请,然后才能映射,使用I/O端口首先要申请,或者叫请求,对于I/O端口的请求意思是让内核知道你要访问这个端口,这样内核知道了以后它就不会再让别人也访问这个端口了.毕竟这个世界僧多粥少啊.申请I/O端口的函数是request_region, 申请I/O内存的函数是request_mem_region。request_mem_region函数并没有做实际性的映射工作,只是告诉内核要使用一块内存地址,声明占有,也方便内核管理这些资源。重要的还是ioremap函数,ioremap主要是检查传入地址的合法性,建立页表(包括访问权限),完成物理地址到虚拟地址的转换。

使用方法:

内核中的使用,往往是为某个设备预留一块内存,当使用的时候需要在board中定义这个设备的内存resource。通过 platform_get_resource获得设备的起始地址后,可以对其进行request_mem_region和ioremap等操作,以便应用程序对其进行操作。

ioremap/mmap的几个测试结论 环境:pc机,ubuntu 14.04  64位,物理机             arm板 omap3530 , 1G内存, 内核linux-2.6.32 1. mmap在pc机上测试映射大小,可以将文件映射大小4G,并且这4G可以使用数据全部覆盖,即映射的4G空间可以全部访问他的物理地址 #include #include #include #include #includ 阅读详情

相关推荐

通过ioremap和mmap映射物理地址,操作寄存器的方法

然而,对于一些高端的单片机来说,它们的寄存器可能不在CPU内部,而是连接在其他硬件设备上,并且可能需要使用物理地址才能访问。本文将介绍如何使用ioremap和mmap映射物理地址的方法,来方便地操作这些寄存器。mmap是一个系统调用函数,可以将一个物理地址映射到应用程序的虚拟地址空间中。iormap是一个函数,可以将一个物理地址映射到内核的虚拟地址空间中。通过这两种方法,可以方便地直接访问硬件寄存器,实现各种功能。需要注意的是,使用mmap函数需要先打开/dev/mem设备文件,并且需要具有root权限。

qq_37934722的博客 1463

Linux内核中ioremap映射的透彻理解

几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种:   (1)I/O映射方式(I/O-mapped)   典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如

独行者 403

【嵌入式面试题】Linux面试题总结

在Linux内核中,IO设备通常被映射到CPU的地址空间中,以便CPU能够直接访问IO设备的寄存器和内存。在x86架构中,IO设备通常被映射到物理地址空间中的一个特殊区域,称为IO空间(IO space)。另外,ioremap函数还会将映射的虚拟地址与对应的物理地址进行关联,并在内核的页表中添加对应的映射信息,以便内核能够正确地将IO地址转换为物理地址。因此,在Linux操作中如果要访问IO设备的寄存器和内存,需要使用ioremap函数将IO地址映射到内核虚拟地址空间中,以便能够通过指针进行访问。

CodeAllen嵌入式 1162

浅谈ioremap,vmalloc,mmap三者之间的区别

在应用层使用,在用户虚拟地址空间(0-3G)映射区申请一块可用的虚拟地址(vma),然后将这块虚拟空间的地址范围传入到driver,在driver中实现映射:vma<–>物理地址。在驱动中使用,用于建立内核中虚拟地址空间vmalloc与各其他外设寄存器地址之间的映射,期间并不分配新的物理内存,直接映射已知物理地址(寄存器地址)也在驱动中使用,也是在内核虚拟地址空间vmalloc区申请一段连续的虚拟空间,但物理地址不连续,广泛的用途就是给模块分配内存。

qq_41781462的博客 968

抖音小游戏(IAA)巨量引擎投放指南

摘要:本文详细介绍了在巨量引擎平台投放小游戏广告的完整流程,包括五个关键步骤:1)添加小游戏资产,填写ID等信息并等待审核;2)添加事件管理,配置激活和关键行为事件;3)通过橙子建站创建落地页,设置跳转链接;4)新建广告项目,选择小程序推广目标;5)完成广告创建。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 4490

JW01二氧化碳传感器实战:5分钟搞定Arduino环境监测系统(附完整代码)

本文详细介绍了如何使用JW01二氧化碳传感器与Arduino快速搭建环境监测系统。通过简单的硬件连接和完整的代码示例,读者可以在5分钟内实现CO2浓度实时监测,并了解数据解析、常见问题解决及进阶应用扩展。JW01传感器的高精度和易用性使其成为创客和嵌入式开发者的理想选择。

kite3的博客 383

linux mmap 内存,linux内存操作--ioremap和mmap学习笔记

最近做一些相关的视频输出,对于保留framebuffer内存使用情况不是很清楚,现在找了一些资料整理出,准备使用。if (希望看到使用) goto 用法;对于一个系统来讲,会有非常多的外设,那么这些外设的管理都是通过CPU完毕。那么CPU在这个过程中是怎样找到外设的呢?虽然在一个系统中会有诸多的外设,在每一个外设的接口电路中会有多个port。可是假设系统可以每一个port都被赋予一个详细的地...

weixin_32942557的博客 372

Android中的Service:Binder,Messenger,AIDL(2)

前言前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等。在这一篇博文里有一些需要前一篇铺垫的东西,建议没有看过前一篇博文的同学先去看一下前一篇: Android中的Service:默默的奉献者 (1) 。但是在前一篇博文中也有一些遗漏的东西——主要是关于bindService()这一块的具体细节。由于这

lypeer的专栏 5万+

【Linux】mmap与ioremap

4、如果要操作设备的物理地址,有两种办法,一种是使用ioreamap(),然后用户调用read,write,ioctrl系统调用去访问那块物理地址,这里涉及到了。2、ioreamap()使用在内核里,将设备所在的物理地址映射到内核虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。3、mmap()用在用户空间,将将设备所在的物理地址映射到用户虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。,一次是用户空间到内核空间的拷贝,一次是内核空间到物理地址的拷贝;1、两者都是内存映射的函数。

W__winter的博客 2346

特性阻抗 – SI/PI 世界碰撞的地方

除了谐振零点和峰值外,在一定频率下,传输线的阻抗看起来像远端开路时的电容器的阻抗,也看起来像远端短路时电感的阻抗。如果随后的制造变化将测得的阻抗推到 -10% 容差的低端(例如 44 欧姆)的测量区域内,那么如果在初始下降时测量,则真正的特性阻抗将在 42 欧姆时降低 5%,并且超出规格。这意味着,当我们测量红色或蓝色图的峰和相邻谷之间的中间阻抗时,它是该频率下传输线的特性阻抗。图 7 远端开路时(红色常亮)与远端短路时(蓝色常亮)的电感和电容抗阻抗与频率的关系(上图)和传输线的阻抗与频率(下图)的对比。

jkh920184196的博客 962

MCAL配置之CAN模块及源码分析

该文章详细解析了Autosar中MCAL配置里的CAN模块,详细分析了重要的配置选项,并对CAN的发送和接收函数进行了剖析。

u013624141的博客 1419

ioremap和mmap区别

ioremap和mmap都是 Linux 操作系统中用于内存映射的函数,但它们在用途和工作方式上有一些区别。

java_newstu的博客 1075

【低轨】Starlink星链-Ku波段OFDM信号同步机制与PNT应用潜力

本文深入解析了Starlink星链Ku波段OFDM信号的同步机制及其在定位、导航与授时(PNT)领域的应用潜力。研究发现,其信号帧内嵌的同步序列具有相位恒定特性,支持超长相干积分,可在极低信噪比下实现高精度伪距测量,为利用低轨卫星通信信号实现高精度PNT服务提供了新的技术路径。

weixin_29250403的博客 730

arm64的ioremap_linux 内存映射-ioremap和mmap函数

最近开始学习Linux驱动程序,将内存映射和ioremap,mmap函数相关资料进行了整理一,内存映射对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中...

weixin_42291186的博客 784

硬件基础(4):(7)ADC电压采集:软件校准(标定、拟合)

在实际项目中,**软件端校准**可以有效弥补硬件方面(分压电阻误差、放大器失调、参考源误差等)带来的系统性偏差,从而提高 ADC 测量精度。下面是一个常见的**多点实测校准**流程与思路,个人感觉传感器标定的原理也只这样。

FCZlll的博客 6244

uniapp(全端兼容) - 最新详细实现接入腾讯视频播放器功能插件,uniapp全平台端(小程序/H5网页/App/nvu)调用引入并使用腾讯视频播放组件完整全流程(详细示例源码,一键复制开箱即用)

uniapp腾讯视频,uniapp微信小程序腾讯视频,uniapp小程序接入腾讯视频详细示例教程源码,uniapp怎么在微信小程序平台使用腾讯视频插件,在uni-app中使用腾讯视频插件播放视频,uniapp调用腾讯视频,uniapp引入腾讯视频插件,uniapp小程序中引入腾讯视频无法播放,uniapp微信小程序平台引入腾讯视频播放不了黑屏,在uniapp开发的微信小程序中使用腾讯视频,uniapp如何引入腾讯视频插件播放视频,uni-app小程序平台引入腾讯视频插件播放腾讯视频,uniapp 小程序接入

✅ 精选推荐文章 1万+

ioremap、 mmap

一、映射方式 几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: a – I/O 映射方式(I/O-mapped) 典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元。 b – 内存映射方式(Memory-mapped) RISC指令系

xiupong的博客 1028

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

内存映射:mmap与ioremap

  对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。   进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB为内核空间。   1.不管是在用户空间还是在内核...

MM_man的博客 1511

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

linux 内存映射-ioremap和mmap函数

最近开始学习Linux驱动程序,将内存映射和ioremap,mmap函数相关资料进行了整理 一,内存映射     对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。  进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OF...

weixin_33916256的博客 490

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: error: conflicting type qualifiers for 'xxxxx'
下一篇: source insight实用技巧
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值