历史上的今天
返回首页

历史上的今天

今天是:2025年01月17日(星期五)

正在发生

2019年01月17日 | 2416开发记录十二:ioremap

2019-01-17 来源:eefocus

对于一个系统来讲,会有很多的外设,那么这些外设的管理都是通过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等操作,以便应用程序对其进行操作。


推荐阅读

史海拾趣

Accelink Technologies Co Ltd公司的发展小趣事

Accelink Technologies Co Ltd是一家中国领先的光通信器件和子系统供应商,以下是该公司发展的五个相关故事:

  1. 公司成立和起步阶段: Accelink Technologies Co Ltd成立于2001年,总部位于中国安徽省合肥市。公司最初专注于光通信领域的研发和生产,致力于提供高性能的光通信器件和解决方案。起步阶段,公司的产品主要包括光纤光栅、光纤耦合器、光开关等。

  2. 技术创新和产品拓展: 随着市场需求的增长和技术进步,Accelink不断进行技术创新,并逐步拓展产品线。公司推出了包括光模块、光收发器、光放大器等在内的多种光通信子系统产品,为客户提供了更全面的解决方案。

  3. 市场扩张和国际合作: Accelink积极拓展国内外市场,并与全球各地的客户建立了合作关系。公司的产品被广泛应用于光网络建设、数据中心、无线通信等领域,赢得了国内外客户的认可。同时,Accelink还与国际知名光通信企业展开合作,共同推动技术创新和市场发展。

  4. 持续投入研发和创新: Accelink不断加大研发投入,致力于技术创新和产品升级。公司设立了研发中心,拥有一支技术精湛的团队,致力于开发新产品和解决方案,满足客户不断变化的需求。同时,Accelink还与国内外高校和研究机构合作,共同推动光通信技术的发展。

  5. 未来发展展望: Accelink将继续致力于光通信技术的研发和应用,不断推出更先进、更可靠的产品和解决方案,满足客户在光网络建设和数据传输方面的需求。公司将加强国际市场拓展,拓展海外业务版图,同时不断提升自身的技术实力和市场竞争力,为光通信行业的发展做出更大的贡献。

Devar Inc公司的发展小趣事

可穿戴设备市场近年来持续增长,Devar Inc公司也积极布局这一领域。公司研发了一系列具有创新性的可穿戴设备,如智能手环、智能眼镜等。这些设备不仅具备健康监测、运动记录等基本功能,还集成了Devar的AI技术,能够为用户提供更加个性化的服务。例如,智能手环可以根据用户的运动习惯和健康数据,为用户提供定制化的运动计划和健康建议。

Epistar Corp公司的发展小趣事

随着LED技术的不断发展,Epistar开始将目光投向国际市场。公司积极参与各类国际展会和论坛,展示其先进的LED产品和技术实力。同时,Epistar还加强了与国际知名企业的合作,共同开发新产品,拓宽销售渠道。这些努力使Epistar的品牌知名度和市场份额不断提升,公司逐渐在国际LED市场上崭露头角。

Broadcom(博通)公司的发展小趣事

博通在有线和无线通信半导体领域一直保持着技术创新的领先地位。公司不断投入研发,推出了一系列具有竞争力的产品,包括宽带通信芯片、无线局域网芯片组等。这些产品的成功应用,不仅提升了博通的市场地位,也为整个电子行业的发展做出了重要贡献。

EPSON公司的发展小趣事

EPSON公司,原名精工爱普生,成立于1942年,最初以制造手表起家。然而,随着技术的不断进步和市场需求的变化,EPSON逐渐将业务扩展到电子领域。在创始人及其团队的带领下,EPSON凭借其卓越的技术创新能力,成功研发出了一系列具有划时代意义的电子产品,如世界上第一台微型打印机和喷墨打印机,奠定了其在电子行业的领先地位。

CANOPUS公司的发展小趣事

随着业务的不断拓展,CANOPUS开始专注于鼓的制造研究。在1984年,公司推出了其标志性产品——整木掏空榉木军鼓。这款鼓的独特之处在于其鼓腔是由整个树干挖空处理而成,导角也做了特有的设计。这一创新使得CANOPUS的鼓在音质和外观上都与众不同,迅速在市场上获得了认可。

问答坊 | AI 解惑

关于ADC0804的差分输入的问题

我要用到ADC0804的差分输入端测电压,VIN+输入正电压,VIN- 输入负电压,我的理解是输出端的测量电压应该是(VIN+)-(VIN-),但是结果却不是这样的,所以我向问一下:ADC0804的VIN-端能识别负电压吗? 如果能,在测量差分输入的信号时,程序是不是 ...…

查看全部问答>

CPU电源设计与系统稳定的关系大吗?

一个嵌入式处理系统中,电源的设计与系统稳定性关系大吗? 系统莫名其妙死机,会不会跟电源设计有关系。如果有关系可能是哪些因素呢。谢谢。…

查看全部问答>

讨论下热电偶测温差的问题

讨论下用热电偶测温差的问题,有的书上介绍可以用热电偶反向串联变送器测温差,我的问提是  热电偶反向串联不是线性的,变送器处理的mv值是不等的.例如100度温差,在500度与400度时是4.058mv,而1000度与900度是3.98mv;变送器如何处理????????…

查看全部问答>

LCDj显示不同宽度ASC字符

我们在LCD上显示字符,当然是希望每个字符的 长 X 高 是相同点阵的方框字,取相应字模时,偏移量也好计算,但是像office word里,它有些字体单个字符的宽度不一样的,例如M 和I ,它是基于何种思想来处理不现宽度的字符送到LCD显示的? 难到一个字节的ASC ...…

查看全部问答>

SD卡驱动问题

目前我在TI的TMS320VC5509A上做一个项目,需要驱动SD卡。5509上自带有SD卡控制器。通过配置应该就能正常使用。 可是现在我遇到的问题是,不能连续进行SD卡读写。比如先读SD卡(查询),接着又写,在写时写命令返回的response不对。只有在读完后加 ...…

查看全部问答>

求教:关于PE文件的导入符号

正在研究 PE 文件的格式,但是对导入表的结构和用法不太明白。 已经能够从PE文件分析出导入表中的,但是不知道怎么解析系统创建的 调转表和调转地址。 我的代码里调用一个系统函数的时候,反汇编(ARM芯片)得到 ;处理参数等 0001287C EB00033 ...…

查看全部问答>

请教各位高手如何在片子里做浮点数除法???

如题,最近做一个东西,需要用到除法运算,但是在IAR编译环境下simulate调试模式下尝试编译了一下,发现比如:如果做3/1024   这样的运算后的结果只能保留除法运算后的整数部分。大家有遇到过相似问题的吗??怎样解决呢?? …

查看全部问答>

STM32串口中断下,接收到的数据如何存入数组中,指点一二论坛的兄弟姐妹

我是想通过串口中断接收到数据验证自己设置的账号密码是否能通过,包括修改密码等操作,但是卡到了现在,麻烦大家帮帮忙 谢谢!…

查看全部问答>

Linux内核的特征

    Linux是个人计算机和工作站上的Unix类操作系统。但是,它绝不是简化的Unix。相反,Linux是强有力和具有创新意义的Unix类操作系统。它不仅继承了Unix的特征,而且在许多方面超过了Unix。作为Unix类操作系统,Linux内核具有下列基本特 ...…

查看全部问答>