关于驱动的一些问题
2014-04-17 21:50
211 查看
ioremap:这个函数是用来将I/O内存资源的物理地址映射到核心虚地址空间(3GB-4GB)中。
iounmap函数用于取消ioremap()所做的映射。 void * ioremap(physaddr,size);physaddr:物理起始地址,size,映射多大。
几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据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内存"资源。
CPU通常并没有为这些已知的外设I/O内存资源的物理地址预定义虚拟地址范围,驱动程序并不能直接通过物理地址访问I/O内存资源,而必须将它们映射到核心虚地址空间内(通过页表),然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些I/O内存资源。
iounmap函数用于取消ioremap()所做的映射。 void * ioremap(physaddr,size);physaddr:物理起始地址,size,映射多大。
几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据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内存"资源。
CPU通常并没有为这些已知的外设I/O内存资源的物理地址预定义虚拟地址范围,驱动程序并不能直接通过物理地址访问I/O内存资源,而必须将它们映射到核心虚地址空间内(通过页表),然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些I/O内存资源。
相关文章推荐
- 关于PHP5.6连接SQL Server 2008 R2数据库驱动及一些问题
- 关于64位 Ubuntu 13.04 安装Android Studio的一些问题及ADB驱动配置
- 一些关于ARM驱动的问题 make menuconfig && implicit declaration of function
- OpenWrt MT7620N SoC关于ralink无线驱动的一些问题
- 关于AM3359写裸跑驱动的一些小问题
- 关于学习编程中会遇到的一些小问题
- 关于Unity项目中创建项目遇到的一些问题
- centos6.8下编译安装amp碰到的一些关于依赖包的问题
- 关于NopCommerce里的一些主要问题的解答
- 关于 STM32 UART4 的一些小问题
- 关于jquery的ajax队列的一些问题
- 关于SWFUpload的一些问题
- (K&R小结第1篇)1.5 中关于getchar,Ctrl+Z,EOF的一些问题讨论
- 关于子类和父类加载时一些问题
- 关于 VM Linux操作系统使用 360随身wifi的驱动安装问题
- 关于http 表单编码的一些问题。
- 关于Red5的一些问题
- 关于**订单缴费windows服务项目过程中遇到的一些问题和反思
- EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:关于接口调用常见的一些问题(401 Unauthorized)
- 关于easyUI的一些常规问题总结