免费注册 查看新帖 |

Chinaunix

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

MMU是如何转换IO端口地址的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-19 10:27 |只看该作者 |倒序浏览
内核一般通过IO_P2V来实现IO端口物理地址到虚拟地址之间的转换,通常是加上一个虚拟基址来完成转换,不像内存的物理地址,需要通过二级页表转换。MMU是怎样区分这两种地址的转换方式的?在内核代码的何处体现?请高手指点,谢谢。

论坛徽章:
0
2 [报告]
发表于 2012-03-19 10:38 |只看该作者
我不是太清楚Linux的这个机制.

如果由我来设计, 无非就是这样 .

一般的分配页面的函数, 是不需要指定物理内存的位置的.

而要做IO地址映射的话, 就把地址传递给系统, 让系统指定分配哪一段的物理内存而已.

也就是说, 应该有这么一个函数, 允许用户指定物理内存的起始点和范围.

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
3 [报告]
发表于 2012-03-19 11:00 |只看该作者
回复 1# frank529
区分地址是内存单元还是外设,在x86上,这些信息是在系统启动的时候,由PCI获取的。

   

论坛徽章:
0
4 [报告]
发表于 2012-03-19 16:37 |只看该作者
回复 2# MJK2012

可以猜测内核在用MMU处理IO地址时绕开了页表处理,做了简单的映射。只是想知道具体在什么地方处理的?
   

论坛徽章:
0
5 [报告]
发表于 2012-03-19 16:41 |只看该作者
回复 3# 瀚海书香


    处理器在区分开内存地址和IO地址之后,是怎样绕开页表对IO地址映射的呢?

论坛徽章:
0
6 [报告]
发表于 2012-03-19 16:52 |只看该作者
回复 4# frank529


这个我不清楚Linux的实际做法哦.

只能告诉你我所知道的.

在Intel的系统启动的时候,

BIOS会向内存注入一个PCI configuration space

http://en.wikipedia.org/wiki/PCI_Configuration_Space

这个表描述了主板里所有的PCI设备.

而这个配置表, 包括了这些设备需要分配的内存.

所以Windows/Linux会根据这个表, 预先保留了物理地址空间.

论坛徽章:
0
7 [报告]
发表于 2012-03-19 16:55 |只看该作者
回复 4# frank529

其实我还是不太明白你到底要问的是什么问题.. :wink:

论坛徽章:
0
8 [报告]
发表于 2012-03-19 17:22 |只看该作者
回复 7# MJK2012


    找到了,mmu.c文件里有个iotable_init函数,实现了IO端口地址映射的初始化。具体代码没有深究,但应该不是绕开页表管理,而是在页表里事先建立了映射关系。顺便提一下,我看的是ARM的代码,它没有特定的IO地址空间。x86有特定的的地址空间,它既可以把IO地址映射到内存,也可以用IN和OUT指令直接访问,更灵活一些。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
9 [报告]
发表于 2012-03-19 21:57 |只看该作者
一般是驱动初始化的时候把自己感兴趣的区间ioremap吧。ARM上最后访问肯定是绕不过MMU,而且这些区别映射时还得做特别设置,比如不能prefetch不能cache之类的。

另外,我感觉LZ问的是,内核把虚拟地址转换为物理地址时,为什么有时只是减去一个常量,有时却去查页表?

MIPS有些物理地址段不经过cache,也不经过MMU。把外设安在这里应该舒服很多。

现在用memory-mapped IO应该是趋势了。我以前以这是从“有独立的IO地址空间”演化而来的,其实70年代DEC的机器就是memory-mapped IO了。

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
10 [报告]
发表于 2012-03-20 08:06 |只看该作者
回复 8# frank529
io端口的地址一般是静态map的,在machine descriptor里可以指定io端口到memory的map函数,将io的物理地址映射到memory

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP