一、什么是IO内存
一般我们的外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器、数据寄存器三大类。外设的寄存器通常被连续编址,并且根据CPU的体系架构不同CPU对I0端口的编制方式有两种:
。IO映射方式(IO-mapped):比较典型的有X86处理器为外设专门实现了一个单独的地址空间,称为“I0端口空间”或者“IO地址空间”,此时CPU可以通过专门的指令(比如X86的IN和OUT) 来访问这个“IO端口空间”
。内存映射方式 (memory-mapped): RISC指令系统的CPU一般只实现一个物理地址空间,外设10端口成为内存的一部分。此时CPU可以访问外设的10端口,就像访问自己的内存一样方便,不必再设置专门的指今来访问。在驱动开发过程中一般使用内存映射方式。
外设的SFR(特殊功能寄存器) 编址与内存的编址是同一个地址空间,叫做I0内存。这个I0关键字,其实就是配置寄存器。
原因:
Linux 内核运行后,开启了 MMU(内存管理单元),所以不能直接访问 CPU 的物理地址,也就是说,不能直接使用物理地址访问系统的 IO 内存。必须将物理地址转换为虚拟地址,内核通过虚拟地址来访问系统的 IO 内存。
有MMU的芯片: x86、ARM9以上的CPU
无MMU的芯片:单片机、ARM Cortex-M系列
IO内存的使用方法
回顾裸机控灯:
分析硬件
控制灯的GPIO引脚(GPIOE13)
GPIO的寄存器
通过S5P6818芯片手册找到该寄存器的配置方法控制GPIO的状态
问题: