免费注册 查看新帖 |

Chinaunix

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

inb、outb ? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-06 21:05 |只看该作者 |倒序浏览
最近一直在想I/O端口与I/O内存的区别,还是不太清晰。希望各位能发表看法。另外,在ARM平台上,驱动编程中,是不是就不存在I/O端口这一说了,将外设资源的物理地址经ioremap映射成内核地址后,再通过readb、writeb。。。访问,那inb、outb。。又用在什么场合下?

论坛徽章:
0
2 [报告]
发表于 2007-03-06 23:09 |只看该作者
你还是看intel的手册吧,那不是内核发明的,至少i386是这样。
我的理解是,方式不同,结果相同。操作的i/o资源也是相同的。

论坛徽章:
0
3 [报告]
发表于 2007-03-07 08:36 |只看该作者
inb, outb基本上是X86专用的了吧,

论坛徽章:
0
4 [报告]
发表于 2007-03-07 09:53 |只看该作者
关于IO ports和IO memory

        在IA32 Manuals-Basic Architecture中, 对于IO有二种寻址方式:1, IO Port(IO Address Space); 2,
Memory-Mapped IO.

        1) IO Port方式.
        使用体系结构相关的in/out指令来访问IO端口,并且能够保证每一条指令都在下一条之前完成,也就是in/out
指令是自然有序的。 一共有2^16(64K)个单独的8-bit端口,编号从0到FFFFH(其中从0F8H到0FFH被保留),任意两个连续
的8bit端口可以被看做是一个16bit端口,同样,任意4个连续的8bit端口可以被看做是一个32bit端口。

        2) IO Address Space方式.
        可以使用任意的mov、and、or等指令来访问,就象访问主存一样。

        对于Linux内核来说,若想访问io ports,需要request_region来分配io ports, 返回之后的struct resource
就包含了start和end,在此之间的区域可以用in/out指令来访问。 /proc/ioports记录了目前已分配的所有IO端口。
        对memory-mapped io来说,需要request_mem_region来分配IO内存(也就是外设的寄存器或者存储体),它也是
返回一个struct resource结构,其中有start和end字段,可以用来作为ioremap函数的参数。 对request_mem_region分配
的IO内存进行了ioremap之后,就可以在程序中象访问普通内存区那样来访问它们了。
        IO Ports和IO Momory之间的转换,可以用ioport_map/ioport_unmap来实现。

        这些内容可以参考LDD3第9章来理解。

论坛徽章:
0
5 [报告]
发表于 2007-03-07 19:47 |只看该作者
多谢各位的答复。请教版主:request_region中参数的地址是一个物理地址的区间,在request_region后,驱动中用inb、outb时,inb的参数就是这些物理地址吗?我在以往的驱动中,访问ARM内部的寄存器时,都用的是inb/outb、inw/outw、。。。,它的参数是内核映射后的虚拟地址。最后,问一句,我是搞linux驱动的,好像不应该在这个内核版块发帖子是吧,呵呵

论坛徽章:
0
6 [报告]
发表于 2007-03-07 19:48 |只看该作者
多谢各位的答复。请教版主:request_region中参数的地址是一个物理地址的区间,在request_region后,驱动中用inb、outb时,inb的参数就是这些物理地址吗?我在以往的驱动中,访问ARM内部的寄存器时,都用的是inb/outb、inw/outw、。。。,它的参数是内核映射后的虚拟地址。最后,问一句,我是搞linux驱动的,好像不应该在这个内核版块发帖子是吧,呵呵

论坛徽章:
0
7 [报告]
发表于 2007-03-08 11:12 |只看该作者

回复 #6 马二 的帖子

arm不懂,说说x86.  io port用的是IO Address Space, 不是虚拟地址,准确的说也不能算物理地址, 应该是叫总线地址, 即CPU在外围总线上所看到的地址。 有些体系结构, 总线地址和物理地址是不同的, 但对于x86体系结构来说, 可以说总线地址就是一种物理地址。 只不过别的物理地址是位于主存MEmory中,而这个是位于外部设备中。

论坛徽章:
0
8 [报告]
发表于 2007-03-08 20:19 |只看该作者

回复 #6 马二 的帖子

i386有两个地址空间,一个是内存,一个是io port
al*斑竹等所说的in/out是i386访问io port空间的专用汇编指令

ARM是io和内存统一编址的,楼主所说的inb等我的理解应该只是一个内核中的一个宏定义而已,用它们来读写io口

论坛徽章:
0
9 [报告]
发表于 2007-03-09 10:45 |只看该作者
原帖由 xw009 于 2007-3-8 20:19 发表于 8楼  
i386有两个地址空间,一个是内存,一个是io port
al*斑竹等所说的in/out是i386访问io port空间的专用汇编指令

ARM是io和内存统一编址的,楼主所说的inb等我的理解应该只是一个内核中的一个宏定义而已,用它 ...



没看过, 猜测也是这样,
可能只是一个转换的封装函数或宏.
跟X86的IO内存的读写函数也是一样.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP