ioremap和mmap区别

mmap和ioremmap解析 addr:如果addr为NULL,内核会自动选择一个起始地址作为映射的起点。如果addr不为NULL,则内核会尝试将映射放置在指定的起始地址处。如果指定的地址无效或与已有映射冲突,则mmap()调用会失败。通常情况下,最常用的做法是将addr设置为NULL,由内核选择一个适当的地址。length:length参数指定要映射的长度,可以是文件的长度或者是页的整数倍。对于文件映射,length一般为文件大小。对齐到页面大小可以获得最佳性能,因为页面是内存管理的最小单位。prot: 阅读详情

ioremap和mmap区别

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

一、区别

  1. ioremap:
    • ioremap 是 Linux 内核中的一个函数,用于将设备内存(通常是外设的内存)映射到内核的虚拟地址空间。
    • 它主要用于硬件设备的内存访问,特别是当这些设备不支持常规的内存访问方法时。
    • ioremap 通常用于驱动程序开发,因为它允许内核代码直接访问硬件设备的内存。
    • 这个函数不涉及用户空间,因此它不适用于用户级应用程序。
  2. mmap:
    • mmap 是一个系统调用,既可以在用户空间也可以在内核空间使用。
    • 它用于将文件或其他对象(如设备文件)映射到进程的虚拟地址空间,从而允许进程像访问普通内存一样访问这些对象。
    • mmap 常用于提高文件访问的效率,因为它允许操作系统使用内存分页机制来优化文件的读取和写入操作。
    • 用户级应用程序可以通过 mmap 系统调用将文件映射到内存中,以便进行高效的文件操作。

主要区别:

  • 使用场景:ioremap 主要用于内核空间中的硬件设备内存访问,而 mmap 既可以用于内核空间也可以用于用户空间,用于文件或其他对象的内存映射。
  • 目的:ioremap 用于将设备内存映射到内核地址空间,而 mmap 用于将文件或其他对象映射到进程的地址空间。
  • 用户空间访问:ioremap 不适用于用户空间,而 mmap 可以在用户空间中使用。
  • 性能优化:mmap 可以利用内存分页机制来提高文件访问的效率,而 ioremap 则主要用于直接访问硬件设备的内存。

二、函数原型

  1. ioremap

    void * ioremap(unsigned long phys_addr, size_t size);

    参数:

    • phys_addr:要映射的起始的物理 I/O 地址。
    • size:要映射的空间的大小。

    返回值:

    • 返回一个指向内核虚拟地址的指针,通常位于内核虚拟内存空间的高端部分(3GB-4GB)。

    使用 iounmap 函数来释放:void iounmap(void * addr);

  2. mmap

    void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

    参数:

    • addr:指定映射到进程地址空间的地址。如果为 NULL,内核将选择映射区域的地址。
    • length:映射区域的长度。
    • prot:映射区域的保护方式,可以是以下几种方式的组合:PROT_EXEC(可执行)、PROT_READ(可读)、PROT_WRITE(可写)、PROT_NONE(不可访问)。
    • flags:控制映射区域的特性,常用的标志有:MAP_SHARED(对映射区域的修改会反映到文件上)、MAP_PRIVATE(私有的copy-on-write映射)、MAP_ANONYMOUS(匿名映射,不与任何文件关联)等。
    • fd:文件描述符,表示要映射的文件。
    • offset:文件中映射的起始位置,通常为文件大小的整数倍。

    返回值:

    • 调用成功时返回指向映射区域的指针
    • 失败时返回 -1 并设置 errno 以指示错误类型。

    使用munmap 函数来释放:int munmap(void *addr, size_t length);

ioremap()的原理及意义 ioremap()的原理及意义,介绍了内存映射原理 立即下载

相关推荐

别再为FPGA程序裸奔发愁了!手把手教你用Quartus和AES256给Altera芯片上把‘锁’

本文详细介绍了如何为Altera/Intel FPGA芯片(如Cyclone系列)构建可靠的AES256加密体系,涵盖密钥类型选择、Quartus实操到JTAG链路验证的全流程。通过硬件级AES256引擎实现配置流解密,确保FPGA程序的安全保护,适用于工业控制器等高安全需求场景。

weixin_28309571的博客 389

【Linux】mmap与ioremap

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

W__winter的博客 2346

利用CANoe和CAPL实现高效CAN网关设计与仿真

本文详细介绍了如何利用CANoe和CAPL进行高效CAN网关的设计与仿真。通过搭建仿真工程、导入DBC数据库、编写CAPL脚本等步骤,手把手指导读者构建一个连接不同CAN网络的网关模型,实现报文的监听、转发与信号处理,从而在硬件开发前验证逻辑,提升汽车电子开发效率与可靠性。

weixin_29164091的博客 294

ioremap和mmap的区别

2.用户访问设备,最终其实涉及的用户和硬件,而read,write,ioctl本身会牵扯到内核,所以这些函数涉及2次的数据拷贝,用户要直接去访问硬件设备,只需要将硬件设备的物理地址信息映射到用户的虚拟地址空间即可,一旦完毕,不会在牵扯到内核空间,以后用户直接访问用户的虚拟地址就是在访问设备硬件,由2次的数据拷贝的转换为一次的数据拷贝。间的数据拷贝,如果设备拷贝的数据量比较小,那么read,write,ioctl的两次数据拷贝的过程对系统的影响几乎可以忽略不计,如果设备的数据量非常大,例如显卡(独立),...

HoshinoGenLIAO的博客 1785

智能驾驶小白必看:MEB低速紧急制动系统的工作原理与传感器配置详解

本文深入解析了MEB低速紧急制动系统的工作原理与传感器配置。该系统作为智能驾驶的关键安全冗余,专为应对停车场、拥堵路段等复杂低速场景设计。文章详细拆解了其如何通过超声波雷达、环视摄像头等传感器融合感知环境,并基于碰撞时间(TTC)等模型进行风险评估与分级制动,最终实现主动防碰撞,是智能驾驶技术实用化的重要体现。

c2d3e4f的博客 1131

Anaconda报错no qt platform plugin could be initialized

今天因为在anaconda中安装了一个新包,安装成功后运行python 程序报错:no qt platform plugin could be initialized。 1.安装Anaconda3-4.2.0-Windows-x86_64,对应python版本为3.5.2,scikit learn版本是0.17。因为要用Isolation Forest算法,只有0.18以上版本scikit learn才包含此算法,所以想更新scikit learn。 conda install scikit-lear

zhang1806618的博客 1万+

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

linux mmap&ioremap

human!的专栏 3558

ST-LINK调试STM32H743必看:CubeMX工程中缺失的这行代码导致程序跑飞

本文深入剖析了使用ST-LINK调试STM32H743时,因CubeMX工程中缺失电源电压档位配置代码而导致程序跑飞或出现“Can not access memory”错误的问题。文章解释了H7系列电源与时钟耦合的核心原理,提供了具体的代码修复方案和系统化的调试排查思路,帮助开发者从根本上解决这一常见调试困境。

weixin_29191669的博客 281

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

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

qq_41781462的博客 968

AutoSAR系列讲解(实践篇)9.5-通信的数据映射

讲解了AppL中的数据与通信中的Signal的一个映射操作

雪云飞星的博客 1万+

ShengBTE热导计算:利用ShengBTE计算热导显示NAN的原因是什么?算出的热导不随平均声子自由程变化

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 963

浅谈mmap()和ioremap()的用法与区别

浅谈mmap()和ioremap()的用法与区别 一、mmap() mmap()函数是用来将设备内存线性地址映射到用户地址空间。 (1)首先映射基地址,再通过偏移地址寻址; (2)unsigned char *map_cru_base=(unsigned char * )mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, dev_fd...

heianzhiye333的博客 455

uniapp中使用canvas生成海报,并下载保存到手机相册

如下图,是在H5中,canvas生成后的效果,首先说明,H5不支持返回图片的临时路径,不能用于保存,APP端生成成功后,会返回图片的临时路径用来保存到相册。本地测试,用的网络图片,没有出现跨域的问题,APP端也正常显示。 完整代码:可以将整个代码复制到你得uniapp项目中直接运行。代码中做了详细的注册,关于API的用法,这里只标注的简单的提示,具体还是参考 官方链接uniapp-canvas吧 <template> <view class="demo"> <c.

sunluyi的博客 3万+

Linux中的mmap和ioremap的区别

linux中的ioremap和mmap都是用于linux内存映射的函数,但它们的作用和使用场景有所不同。

想坐在电脑前吹空调 855

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ioremap mmap 分析

ioremap void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) phys_addr:要映射的起始的IO地址; size:要映射的空间的大小; flags:要映射的IO空间的和权限有关的标志; 功能: 将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问; 实现:对要映...

KKLY520的博客 1768

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ioremap_nocache函数说明

NAME ioremap_nocache - 把内存映射到CPU空间   SYNOPSIS void __iomem * ioremap_nocache (unsigned long phys_addr, unsigned longsize);   ARGUMENTS phys_addr 要映射的物理地址  size 要映射资源的大小  DESCRIPTION ioremap_

wxie的Linux人生 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ioremap_nocache函数

ioremap_nocache函数 注解ioremap_nocache ioremap_nocache 把内存映射到CPU空间 void __iomem * ioremap_nocache (unsigned long phys_addr, unsigned long size); phys_addr要映射的物理地址 size要映射资源的大小 调用ioremap_n

paopao200327的专栏 1153

Linux 内核学习 3a - 如何查看虚拟内存和物理内存,以及虚拟内存和物理内存之间转换

映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,相反,内核空间对这段区域的修改也直接反映用户空间。最长见的操作就是文件(在Linux下设备也被看做文件)的操作,可以将某文件映射至内存(进程空间),如此可以把对文件的操作转为对内存的操作,以此避免更多的lseek()与read()、write()操作,这点对于大文件或者频繁访问的文件而言尤其受益。系统调用去访问那块物理地址,这里涉及到了两次拷贝,一次是用户空间到内核空间的拷贝,一次是内核空间到物理地址的拷贝;length:要映射的内存区域的大小。

weixin_46734801的博客 1229

ioremap_nocache

ioremap_nocache函数 注解ioremap_nocache ioremap_nocache 把内存映射到CPU空间   void __iomem * ioremap_nocache (unsigned long phys_addr, unsigned long size);   phys_addr要映射的物理地址 size要映射资源的大小  调用ioremap_nocac

Rain的专栏 822

ioremap 与 mmap【转】

转自:http://blog.youkuaiyun.com/junllee/article/details/7415732 内存映射    对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。  进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间。用户空间地址分布从0到3GB(PA...

weixin_33701564的博客 111

ioremap 与 mmap

内存映射 对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。   进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB为内核空间,如下图:   内核空间中,从3G到vmalloc_start这段地址是物理内存映射区域(该区域中包含了内核镜像、物理页框表mem_ma..

zz460833359的博客 349

linux内存映射(二)

一. IO映射介绍 设备驱动程序要直接访问外设或其接口卡上的物理电路,这部分通常都是以寄存器的形式出现。外设寄存器也称为I/O端口,通常包括:控制寄存器、状态寄存器和数据寄存器三大类。根据访问外设寄存器的不同方式,可以把CPU分成两大类。一类CPU(如ARM,Power PC等)把这些寄存器看作内存的一部分,寄存器参与内存统一编址,访问寄存器就通过访问一般的内存指令进行,所以,这种CPU没有专门用...

卢平光的博客 2174

Linux下内存空间分配、物理地址与虚拟地址映射

mmap函数用于将一个文件或者其它对象映射进内存,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。

2888

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

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

newnewman 914
上一篇: modprobe: ERROR: could not insert ‘hello‘: Exec format error
下一篇: mmap映射实战举例
彦祖学嵌入
博客等级 码龄4年 91粉丝 26原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值