求购冷库门合页:IO端口和IO内存
IO端口和IO内存
Good02xaut@hotmail.com
在驱动程序编写过程中,很少会注意到IO Port和IO Mem的区别。虽然使用一些不符合规范的代码可以达到最终目的,这是极其不推荐使用的。
结合下图,我们彻底讲述IO端口和IO内存以及内存之间的关系。主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。
1. CPU是i386架构的情况
在i386系列的处理中,内存和外部IO是独立编址,也是独立寻址的。MEM的内存空间是32位可以寻址到4G,IO空间是16位可以寻址到64K。
在Linux内核中,访问外设上的IO Port必须通过IO Port的寻址方式。而访问IO Mem就比较罗嗦,外部MEM不能和主存一样访问,虽然大小上不相上下,可是外部MEM是没有在系统中注册的。访问外部IO MEM必须通过remap映射到内核的MEM空间后才能访问。
为了达到接口的同一性,内核提供了IO Port到IO Mem的映射函数。映射后IO Port就可以看作是IO Mem,按照IO Mem的访问方式即可。
2. CPU是ARM 或PPC架构的情况
在这一类的嵌入式处理器中,IO Port的寻址方式是采用内存映射,也就是IO bus就是Mem bus。系统的寻址能力如果是32位,IO Port+Mem(包括IO Mem)可以达到4G。
访问这类IO Port时,我们也可以用IO Port专用寻址方式。至于在对IO Port寻址时,内核是具体如何完成的,这个在内核移植时就已经完成。在这种架构的处理器中,仍然保持对IO Port的支持,完全是i386架构遗留下来的问题,在此不多讨论。而访问IO Mem的方式和i386一致。
注意:linux内核给我提供了完全对IO Port和IO Mem的支持,然而具体去看看driver目录下的驱动程序,很少按照这个规范去组织IO Port和IO Mem资源。对这二者访问最关键问题就是地址的定位,在C语言中,使用volatile 就可以实现。很多的代码访问IO Port中的寄存器时,就使用volatile关键字,虽然功能可以实现,我们还是不推荐使用。就像最简单的延时莫过于while,可是在多任务的系统中是坚决避免的!
- 上一篇:frame buffer device驱动程序第六篇
- 下一篇:frame buffer device驱动程序第七篇
- linux无线网卡驱动解析
- linux wireless LAN
- linux wireless LAN
- ethtool和网卡驱动
- linux网卡驱动的关键就是处理两个
- 网卡如何接收数据包
- 网卡如何发送数据包
- linux网卡驱动对网卡类型的依赖性
- 网卡分类总结
- 无线网卡分类
- 有线网卡的分类
- 分析skb和网卡驱动的关系
- linux网卡驱动好文
- DM9000驱动解析
- struct net_device结
- dummy网卡驱动解析
- 网卡和协议
- 工程师带你深入认识网卡
- 以太网PHY和MAC
- 熟悉内核文档结构,解读内核第一步。N
- 熟悉内核文档结构,解读内核第一步。N
- 重新回归
- 无设备节点驱动程序
- linux下I2C驱动(七)
- linux下I2C驱动(六)