- 论坛徽章:
- 0
|
2可用积分
void *ioport_map( unsigned long port, unsigned int count );
通过这个函数,可以把port开始的count个连续端口重映射为一段“内存空间”。然后就可以在其返回的地址上象访问I/O内存一样访问这几个I/O端口。当不需要这种映射时,需要调用下面的函数来撤消:
void iport_unmap(void *addr);
浏览2.6内核的源代码,我们不难发现,这种所谓的映射其实是“假”的。下面是这两个函数的实现,及一些相关数据:
#define PIO_OFFSET 0x10000UL
#define PIO_MASK 0x0ffffUL
#define PIO_RESERVED 0x40000UL
void __iomem *ioport_map(unsigned long port, unsigned int nr)
{
if (port > PIO_MASK)
return NULL;
return (void __iomem *) (unsigned long) (port + PIO_OFFSET);
}
void ioport_unmap(void __iomem *addr)
{
/* Nothing to do */
}
它只是简单地把I/O端口号加上PIO_OFFSET(64K),作为一个“假”的内存地址返回,而unmap则什么也不做。之所以这样做,是基于这样一个事实:真正的I/O内存地址经过映射成为虚拟地址后,由于是在内核空间,其值肯定大于3G。而port+PIO_OFFSET不会大于128K
==============================================
上面解釋的原因很不明白, 為甚麼肯定大於3g
。。。 |
最佳答案
查看完整内容
http://hi.baidu.com/xiaopanghome/blog/item/cdbd858fe8f5abfa513d92bc.html可以参考该文
|