免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2668 | 回复: 3
打印 上一主题 下一主题

一段話不解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-03 20:10 |只看该作者 |倒序浏览
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可以参考该文

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
2 [报告]
发表于 2007-02-03 20:10 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2007-02-03 22:45 |只看该作者
--

内核空间虚拟地址段:3G/1G 划分。3G 给用户空间,1G 内核空间。

--

论坛徽章:
0
4 [报告]
发表于 2007-02-26 16:16 |只看该作者
内核地址是从3G以后开始的,所以说在内核地址空间的话它的地址肯定大于3G
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP