俄罗斯多想活着回来:IO端口和IO内存

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 00:47:11

IO端口和IO内存

Good02xaut@hotmail.com

在驱动程序编写过程中,很少会注意到IO PortIO Mem的区别。虽然使用一些不符合规范的代码可以达到最终目的,这是极其不推荐使用的。

结合下图,我们彻底讲述IO端口和IO内存以及内存之间的关系。主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。

1.         CPUi386架构的情况

i386系列的处理中,内存和外部IO是独立编址,也是独立寻址的。MEM的内存空间是32位可以寻址到4GIO空间是16位可以寻址到64K

Linux内核中,访问外设上的IO Port必须通过IO Port的寻址方式。而访问IO Mem就比较罗嗦,外部MEM不能和主存一样访问,虽然大小上不相上下,可是外部MEM是没有在系统中注册的。访问外部IO MEM必须通过remap映射到内核的MEM空间后才能访问。

为了达到接口的同一性,内核提供了IO PortIO Mem的映射函数。映射后IO Port就可以看作是IO Mem,按照IO Mem的访问方式即可。

2.         CPUARM PPC架构的情况

在这一类的嵌入式处理器中,IO Port的寻址方式是采用内存映射,也就是IO bus就是Mem bus。系统的寻址能力如果是32位,IO PortMem(包括IO Mem)可以达到4G

访问这类IO Port时,我们也可以用IO Port专用寻址方式。至于在对IO Port寻址时,内核是具体如何完成的,这个在内核移植时就已经完成。在这种架构的处理器中,仍然保持对IO Port的支持,完全是i386架构遗留下来的问题,在此不多讨论。而访问IO Mem的方式和i386一致。

 

注意linux内核给我提供了完全对IO PortIO Mem的支持,然而具体去看看driver目录下的驱动程序,很少按照这个规范去组织IO PortIO Mem资源。对这二者访问最关键问题就是地址的定位,在C语言中,使用volatile 就可以实现。很多的代码访问IO Port中的寄存器时,就使用volatile关键字,虽然功能可以实现,我们还是不推荐使用。就像最简单的延时莫过于while,可是在多任务的系统中是坚决避免的!

阅读全文(2750) | 回复(1) |反映问题 | 引用通告(8) | 编辑
  • 上一篇: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驱动(六)