新的I / O内存访问机制

用于PCI总线(以及其他)的最合理的当前卡向总线提供一个或多个I / O存储器区域。通过访问这些区域,处理器可以与外设进行通信并使事情发生。查看/ proc / iomem将显示已在给定系统上注册的I / O内存区域。


广告


要使用I / O内存区域,驱动程序应该将该区域与ioremap()的调用进行映射。 ioremap()的返回值是一个魔术cookie,可以传递给一组访问函数(名称为readb()或writel()),以实际将数据移入或移出I / O内存。在一些体系结构(特别是x86)上,I / O内存真正映射到内核的内存空间,所以这些访问函数变成了一个简单的指针解引用。其他体系结构需要更复杂的操作。
这个计划存在一些长期存在的问题。为x86架构编写的驱动程序经常被称为仅直接取消引用I / O内存地址,而不是使用访问函数。这种方法适用于x86,但在其他体系结构上可以打破。其他驱动程序知道I / O内存地址不是实际指针,将它们存储在整数变量中;直到他们遇到一个物理地址空间不符合32位的系统。而且,在任何情况下,readb()和朋友都不执行类型检查,从而无法捕获可能在编译时发现的错误。


2.6.9内核将包含一系列旨在改进内核如何与I / O内存配合工作的更改。其中第一个是用于标记指向I / O存储器的指针的新__iomem注释。这些注释与__user标记非常相似,只是它们引用了不同的地址空间。与__user一样,__iomem标记在内核代码中担任文档角色;它被编译器忽略。然而,当用稀疏检查代码时,开发人员会看到由代码组成的全新警告,这些警告将正常指针与__iomem指针混合在一起,或者将那些指针取消引用。


下一步是添加一组明确需要指针参数的访问器函数。这些功能是:


 


    unsigned int ioread8(void __iomem * addr);
    unsigned int ioread16(void __iomem * addr);
    unsigned int ioread32(void __iomem * addr);
    void iowrite8(u8值,void __iomem * addr);
    void iowrite16(u16 value,void __iomem * addr);
    void iowrite32(u32 value,void __iomem * addr);
默认情况下,这些函数只是readb()和朋友的包装器。但是,参数的显式指针类型将生成警告,如果驱动程序传入整数类型。


这些操作有“字符串”版本:


 


    extern void ioread8_rep(void __iomem * port,void * buf,
                            无符号长计数);
当然,所有其他变体也被定义。


实际上这些功能还有另外一个转折点。某些驱动程序必须能够使用I / O内存或I / O端口,具体取决于体系结构和设备。在这两种情况下,一些这样的驱动程序已经花了相当长的时间来尝试避免重复代码。使用新的访问器,发现它需要使用x86风格端口的驱动程序可以调用:


 


    void __iomem * ioport_map(unsigned long port,unsigned int count);
返回值将是一个cookie,它允许映射端口被视为I / O内存;像ioread8()这样的函数会自动执行正确的操作。对于PCI设备,有一项新功能:


 


    void __iomem * pci_iomap(struct pci_dev * dev,int base,
                            unsigned long maxlen);
对于此功能,基地可以是端口号或I / O存储地址,并且正确的事情将完成。


从2.6.9-rc2开始,新接口中没有树中用户。随着补丁合并和内核管理员开始工作,这可能会很快发生变化。有关新I / O存储器接口的更多信息及其背后的动机,请参阅Linus的这一解释。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值