免费注册 查看新帖 |

Chinaunix

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

[硬件及驱动] 关于io_remap_pfn_range的疑惑~~ [复制链接]

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-25 21:27 |只看该作者 |倒序浏览
今天看《深入linux设备驱动程序内核机制》,其中说道:
在x86下 io_remap_pfn_range 的 定义如下
# define io_remap_pfn_range(vma, vaddr, pfn, size, prot)      \
                  remap_pfn_range(vma, vaddr, pfn, size, prot)

也就是说 io_remap_pfn_range 和 remap_pfn_range 实质是一样的。

我的疑惑是:
io 端口空间是用in out 指令来访问的。
io 内存空间 是用mov 这样的指令访问的。

假如说在两个地址空间中各存在一块区域,都用io_remap_pfn_range,remap_pfn_range映射到用户空间。
那么当访问是如何区分出来,用哪套指令访问呢?
也就是说如何区分虚拟地址映射的那个物理地址是来自io端口空间 还是 io内存空间?

不知道说清楚没有, 求解惑~~~

论坛徽章:
0
2 [报告]
发表于 2012-09-26 11:17 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
3 [报告]
发表于 2012-09-26 12:45 |只看该作者
回复 2# stephen_du


Thanks for your reply~~~

    这里io_remap_pfn_range 和 remap_pfn_range都是驱动程序中 用来实现 mmap系统调用。
所以说 ,确实是映射到用户空间,供用户访问的。

我现在了解的概念是,在x86 32 位:

io port空间是 64KB,在/proc/ioports可以看到用途分布,地址范围0x0 ~ 0xFFFF。
io mem空间是4GB, /proc/iomem包含RAM 和 外设内存,的地址范围0x0 ~ 0xFFFF FFFF ,其中显示的如下

firo@snow:~$ head /proc/iomem
00000000-0000ffff : reserved
00010000-0009c3ff : System RAM
0009c400-0009ffff : reserved
000a0000-000bffff : PCI Bus 0000:00
。。。(略去其他输出)
两个地址空间的地址有重合的部分呀~~
我不知道是巧合,还是为了不和io port 空间造成冲突。iomem的前64KB 是reserved的。。。。
在x86 32下面
我知道在ioremap操作后,在io mem空间的外设的物理地址,会被映射的内核的vmalloc区域,供内核访问。
而在io prot空间的外设的物理地址通过 ioprot_map映射的进程的用户空间,实际上是没有真正建立映射(见源码,没有建立也表项),仍然需要通过in out这些指令访问io port空间。
而io_remap_pfn_range 后是真正建立了映射(建立了页表项),映射到了一个虚拟地址,而现在要访问这个虚拟地址映射的那个外设的物理地址要通过MMU。

而《深入linux 设备驱动程序内核机制》的作者说了,之所以io_remap_pfn_range 和 remap_pfn_range 等价,是因为映射的核心是MMU,而对MMU来说,无需区分映射的目标地址类型。
为什么不需要区分,毕竟io port 和iomem地址空间,地址重合了呀~~~

在ARM 32位下,没有这个io port 空间。在统一的io mem空间中外设的物理地址都是唯一的,所以不或造成迷惑。

我感觉自己理解的不对。。。有不知道错在哪里了。




论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
4 [报告]
发表于 2012-09-26 13:30 |只看该作者
自己想了快两天了,蛋疼死了~~总结了一下。

又看了一边mmap系统调用的函数原型,发现这根本和io port 空间没关系呀。是我想多了~~

论坛徽章:
0
5 [报告]
发表于 2012-09-26 13:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
6 [报告]
发表于 2012-09-26 13:44 |只看该作者
回复 5# stephen_du


    嗯,非常感谢。

我自己在好好理解下~~~基础概念模糊呀~~呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP