- 论坛徽章:
- 0
|
设备的寄存器多种多样, 有的可以直接写, 有的只能间接写. 比如pci总线上的寄存器有三种种地址空间, configuration空间, io 空间,和 memory 空间. 物理地址和长度都是写在pci设备的configuration space 中. configuration space的东西需要通过间接的方式读取, 地址是bus:device:function的格式. pc机上通过in,out读取0xcf8 0xcfCf来访问. io空间的就要通过in, out, 加上device定义的偏移量. memory空间也是一样, 在配置空间里有关于它的基地址和长度. 基地址不是不变的, 而是由bios或者操作系统动态分配的, 所以手册里一般不会给出一个绝对的物理地址. 在实际访问的时候, 一般操作系统都为你作好了这些配置和地址的映射, 应该查找看看官方的获得这些参数的办法. 毕竟操作系统要同一管理这些资源. 如果没有的话, 一般io地址不需要做虚拟地址到物理地址的转换. 而mem的地址就必需要做转换. 所谓memory空间, 就是一类地址, 可以让普通的cpu指令, 如mov, add引起pci总线的访问, 从而读取寄存器. 这些指令一般都是要经过地址映射的, 原因就是虚地址的使用. linux的ioremap, 或者windows的MmMapIoSpace专门干这种事. 如果直接拿个物理地址访问的话, 要么pci返回错误的value要么cpu throw access violation. 有的时候还有一种logical address的, 它站在physical address和虚地址之间, 它的一个优点是一些古老的设备, 只能在低地址dma的, 现在可以dma到那遥远的高地址了内存了. |
|