Chinaunix

标题: inb、outb ? [打印本页]

作者: 马二    时间: 2007-03-06 21:05
标题: inb、outb ?
最近一直在想I/O端口与I/O内存的区别,还是不太清晰。希望各位能发表看法。另外,在ARM平台上,驱动编程中,是不是就不存在I/O端口这一说了,将外设资源的物理地址经ioremap映射成内核地址后,再通过readb、writeb。。。访问,那inb、outb。。又用在什么场合下?
作者: 12013396    时间: 2007-03-06 23:09
你还是看intel的手册吧,那不是内核发明的,至少i386是这样。
我的理解是,方式不同,结果相同。操作的i/o资源也是相同的。
作者: R.wen    时间: 2007-03-07 08:36
inb, outb基本上是X86专用的了吧,
作者: albcamus    时间: 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章来理解。
作者: 马二    时间: 2007-03-07 19:47
多谢各位的答复。请教版主:request_region中参数的地址是一个物理地址的区间,在request_region后,驱动中用inb、outb时,inb的参数就是这些物理地址吗?我在以往的驱动中,访问ARM内部的寄存器时,都用的是inb/outb、inw/outw、。。。,它的参数是内核映射后的虚拟地址。最后,问一句,我是搞linux驱动的,好像不应该在这个内核版块发帖子是吧,呵呵
作者: 马二    时间: 2007-03-07 19:48
多谢各位的答复。请教版主:request_region中参数的地址是一个物理地址的区间,在request_region后,驱动中用inb、outb时,inb的参数就是这些物理地址吗?我在以往的驱动中,访问ARM内部的寄存器时,都用的是inb/outb、inw/outw、。。。,它的参数是内核映射后的虚拟地址。最后,问一句,我是搞linux驱动的,好像不应该在这个内核版块发帖子是吧,呵呵
作者: albcamus    时间: 2007-03-08 11:12
标题: 回复 #6 马二 的帖子
arm不懂,说说x86.  io port用的是IO Address Space, 不是虚拟地址,准确的说也不能算物理地址, 应该是叫总线地址, 即CPU在外围总线上所看到的地址。 有些体系结构, 总线地址和物理地址是不同的, 但对于x86体系结构来说, 可以说总线地址就是一种物理地址。 只不过别的物理地址是位于主存MEmory中,而这个是位于外部设备中。
作者: xw009    时间: 2007-03-08 20:19
标题: 回复 #6 马二 的帖子
i386有两个地址空间,一个是内存,一个是io port
al*斑竹等所说的in/out是i386访问io port空间的专用汇编指令

ARM是io和内存统一编址的,楼主所说的inb等我的理解应该只是一个内核中的一个宏定义而已,用它们来读写io口
作者: R.wen    时间: 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内存的读写函数也是一样.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2