作业:PCI Scan

masterkill 2008-10-08 02:41:13
【PCI略】
PCI:Peripheral Component Interconnect. PCI局部总线是复合地址和数据线的高性能32或64位总线,PCI局部总线标准的制定主要目的是为了实现将周边设备与处理器结合起来的总线结构,诸如highly integrated peripheral controller components, peripheral add-in cards, and processor/memory systems.
【PCI Device略】
每个PCI Device都有其unique BUS number, Device number& Function number, 称为PFA(PCI Function Address).
BUS number-----用于在选择系统中的256条总线的编码。
Device number-----用于在一个给定的BUS上确定32种Device的编码。
Function number-----用于在一个具有复合功能Device上选择8个可能功能的编码。
【PCI配置空间略】
SW accessing通过CONFIG_ADDRESS Register(at I/O 0cf8h-0cfbh)和CONFIG_DATA Register(at I/O address 0cfch-0cffh)。
端口0cf8h-0cfch:Configuration Address

端口0cfch-0cffh:Configuration Data

【PCI Access略】
有了以上所说的BUS number, Device number& Function number,我们就可以进行访问了。
*Example1:Show出Intel Bridge(0,1f,0)的Vendor ID
Configuration address应该是8000f800h
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
mov eax, 8000f800h
mov dx, 0cf8h
out dx, eax
mov dx, 0cfch
in eax, dx
到这里我们可以通过DEBUG32看到,ax的value已经变为8086。
*Example2: Write USB (0, 6, 0) PCI register 43h bit1 = 1
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
mov eax, 80003040h
mov dx, 0cf8h
out dx, eax
mov dx, 0cffh
in al,dx
or al,00000010b
out dx, al
注,IN/OUT用于I/O操作可理解为读/写,这里意即将address(80003040h)送到configuration address port(ocf8h),然后从configuration data port(ocfch+3)来存取data(al),当然,也可以选择用
mov dx, 0cfch
in eax, dx
不过需要将eax的value右移24个bit。
注:32-bit address(80003040h)中bit[1:0] = 00是configuration address决定的,故虽然要求存取的是43h,但还是必须写成40h,而要存取到43h,则从0cfch+3来完成(0cfch<->40h,0cfdh<->41h,0cfeh<->42h,0cffh<->43h),当然正如前面所说,也可以通过0cfch端口来读,但读出来是eax的value,需要右移24个bit取高8位。
【PCI Device的config register】
基本的PCI Device的config register可分成两个部分:
(1) header region(offset 00h-3fh)
(2) device specific region(offset 40h-ffh)
我们的PCI scan只涉及(1),(2)是由device厂商附加。

一般情况下,OS使用以下config register的内容来决定位改PCI Device加载何种driver.
(1) Vendor ID:供应商ID,该16位寄存器代表PCI Device的制造商,只读,烧入的内容是一个由PCI SIG分配给制造商的编号。如果系统读取该register的返回值不是ffffh,那么就证明在当前查找的PCI插槽上存在一个PCI Device,否则就视为不存在,故ffffh不能用来标识device。
(2) Device ID:设备ID,该16位value由device制造商自行定义,表示device的用途,它与Vendor ID一起向OS提供一个确定device所需driver的途径。
(3) Subsystem ID& Subsystem Vendor ID:子系统供应商ID和子系统ID,都由SIG进行管理,厂商从它那里获得一个唯一的标识。子系统ID由厂商自定。
这一对register的用途显而易见,如果我们使用了相同的PCI接口芯片,且供应商将Vendor ID和Device ID连线,那么两个不同功能的device必须有一种被区分开来的方法。利用这样两个register,OS可以区分使用同样接口芯片的不同device。
(4) Revision ID: 本版ID,共8个bit,表示device的版本号。
不说了,手软。

对了,为什么需要PCI Scan?因为BIOS POST过程中有个task便是PCI Scan......表示BIOS会扫描whole system,找出所有的PCI Device,然后进行initial,再build a linked list of PCI device.然后list中的每一个node都代表一个PCI Device,且有其characteristics......
After PCI Scan,有两件事完成了:
1,PCI Device initialization; Device configuration registers are correctly set......
2, One data structure is built to describe the PCI Devices in whole system(memory中)。
---Kernel code part

...全文
450 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunmoonxzit 2010-03-16
  • 打赏
  • 举报
回复
頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂頂
tomsheep 2009-12-15
  • 打赏
  • 举报
回复
mark
xtdumpling 2008-10-09
  • 打赏
  • 举报
回复
接分...
zuo53664640 2008-10-08
  • 打赏
  • 举报
回复
终于发现tc2.0 的用处了!!

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧