找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 14714|回复: 2

device tree的搭建过程[转载]--驱动开发网tiamo

[复制链接]
发表于 2007-12-4 15:05:08 | 显示全部楼层 |阅读模式
来自驱动开发网 tiamo: http://bbs.driverdevelop.com/htm_data/87/0407/72674.html
# b- s2 K$ x: L+ @% @+ I/ Q9 P* P7 M9 o3 O( N" D# i
大家都应该知道
5 A, T( f+ y& i! B$ ^/ ewindows下面的驱动模型是分层的.大家构成一个树状结构. 8 r) o' c: v* e9 Q. \8 F! f
那你知道这个结构是怎么搭建起来的么? ' a* B  s. o5 g
你会说是一个一个设备枚举出来的,
2 }7 M0 }9 @' ]* S6 P' Y2 h那你又能说说具体是怎么枚举出来的么?系统是怎么知道有一个设备存在的?系统又是怎么知道这个设备需要什么样子的资源? # c3 {+ j* h; y6 p% d5 q  ?
你也许会说这个是由bus driver来完成的,说得没错 ! C. w8 j5 V2 p
但是你知道bus driver是怎么完成得么?
$ A5 n  b8 p& M3 ]7 V; P2 \也许你会说是跟每个bus相关的,确实也是这样 4 D" ^, w' n' U8 @0 B- `
但是你能说出你自己正在使用的计算机里面的那个device tree是怎么出来的么?pci总线是怎么完成设备枚举的?
3 Y3 x* c; v# a4 v: ^# L" R( u$ t0 @' o) C2 N
如果你能回答上面的这些问题,那到次打住,放松心情,有兴趣的话就继续看看,指导指导小弟我,看看下面的这些文字有什么错误没有..在下不盛感激. ( c$ J# ?$ @6 W( ]/ N2 E* Z8 l+ X6 v4 x

4 s" J5 ?" j* A如果你还对这些东西基本不了解,那也不用往下看了.
6 Z) A8 z. d1 t  j. ]
# V: R0 {9 T: W6 {7 H如果你对这个有一些模模糊糊的认识,又想知道具体是怎么回事情,那看下去吧,我的文字就是为你准备的,跟我共同进步吧..
5 R# c) d' F( c$ I% r! N; K) j% T$ ?# {; m
废话这么多...正题开始...   @2 A9 C& t# p8 x3 w  \
4 X( n- m0 O$ E% e& y- b
首先,我觉得只是看文字是没有太大用的,你应该放一个softice, device tree在手边,一般看文章一般动手看看自己的系统,加深理解,还有一个要推荐的东西就是intel作了带源代码的asl编译器,到google上或者到intel网站上一搜索就出来了.不是要用它的asl编译器,而是要用它里面附带的一个aml反编译工具.当然如果你有你主板bios的源代码,这个工具就不需要了.附带的说一句,它的源代码有些小bug,有一点程序设计能力加上对windows注册表有一定了解的人就能轻松搞定,这个就靠你自己搞定了.
2 D2 |, q7 X8 x4 g6 w+ R1 v6 @. W: R: v7 L/ G( T
先打开device tree看看你自己计算机上面的那个tree是个什么样子的.注意,是切换到pnp view的状态,不是driver view的状态
1 h/ |6 |3 Q+ C' ?* @* p( L
6 M+ X% i5 s4 O) u9 D在最上面呢.是一个标记有enum的一个device,它属于pnpmanager这个driver,看看windows的源代码就知道这个driver是ntoskrnl在启动的时候创建的一个buildin driver.它呢..有好多的pdo附加到上面,这些pdo就是它所枚举出来的pdo.
7 j. d1 M  U0 r' ~  c& ^2 v: _2 n
8 H2 i& }; A; D1 a3 t, }首先你要知道的就是这些pdo是怎么来的?其实他们是从注册表里面读出来的,这个部分有源代码的.他们都是通过读取 0 J8 s* E5 {/ l2 S+ D6 h" f
LOCAL|MACHINE_SYSTEM|CurrentControlSet|Enum|Root|下面的key来一一生成的,这些pdo叫做madeup pdo,那这些key又是怎么来的呢?这些key是你在安装driver的时候就写到注册表里面的.   \! f9 _9 {4 @/ Q

/ t! A8 m  n3 t2 N# E这些pdo呢.你会看到有些并没有attach一个fdo,有些却有fdo.这个区别在什么地方呢.仔细看看就会发现那些没有attach fdo的key下面都有一个叫Legacy的设置成1的value.你也许要问这个lagacy是怎么来的?这个是在安装的时候生成的,它表示这个驱动是一个nt式的或者是一个filter
) x+ F& P, k' F5 N! E3 y3 O' M9 E2 |! s2 s
这些东西留给你慢慢研究了,我们看今天的主角,最上面的那个叫device|0000001的pdo,有一个fdo attach到上面,它是整个pnp系统的root fdo,它属于driver ACPI_HAL,这个driver也是一个buildin driver,它是由hal.dll创建的,这个driver具体是起的什么作用,是不是不管使用不使用acpi都会存在的呢?这些问题因为我也只有这一个电脑没有办法试,就不知道了.
$ G& o& J7 m$ l3 h' V  [! n
" `/ d; V" v. p6 ~. k. @这个fdo有枚举出了一个pdo,这个pdo的device id 是PNP0C08这个id表示了acpi本身(可查看acpi的specification),这个pdo还占用了一个中断资源,它是SCI中断线,这个数据的获取是通过acpi的fadt完成的.略过这个步骤继续下去.
1 g, w+ ?  n6 G- r, J5 O( J- I- N' k
新枚举出来的pdo,attach到上面的fdo来自acpi驱动,这个fdo其实不仅仅是一个fdo,有很多本来该它下面的pdo完成的功能都由它来完成了,所以,它也算是一个pdo.
6 P' `3 r5 t, M) e5 G/ Q" h
; W+ d$ q3 z. {7 S好,进入今天的关键部分了,fdo创建好了,发送IRP_MN_START到fdo, fdo开始初始化acpi系统,读取acpi table,解释其内容搭建acpi 的 namespace.预先创建好很多device的extension,然后枚举出那些应该由它直接管理的pdo. ! D' C9 l$ w, d2 e0 Q: x

1 r9 o' L* [4 I# K8 L话这样讲得很简单.其实是很复杂的.暂时打断下流程,说说与acpi有关的几个话题. . F6 ]' H( C# _% W! _

' U; l0 ^3 W; ?  m! W9 N5 Racpi提供了一种方便的资源配置与电源管理解决方案,它用一种脚本语言来描述主板上的设备所占用的资源(内存,端口,中断),以及完成电源管理所需要进行的操作(比如读某个端口,写某个端口).脚本的解释由操作系统完成,这样通过加入一个中间缓冲层来达到os与bios的隔离,bios不用在意自己的代码运行在real mode,或者是protect mode,os也不用为了运行bios的代码切换到real mode(在apm中有部分就是这样完成的). - F- a0 U; E2 T5 P

. U! _2 s$ B( p" b. I这种bios用来描述的脚本语言就是asl跟aml,asl是一个源代码,aml是一个编译出来的中间代码,os解释的就是aml,
- C6 R* r/ d7 n6 F
6 R  R1 |% s4 [bios程序员在写bios的时候会准备这些个aml,然后把他们放到一个数据结构里面(RSDT)作为一个数据模块加入到bios里面,os在启动的时候,在一个恰当的时间获取到这个数据结构,这样完成bios与os之间的衔接. * V( S! g' O& d
6 u5 q' F  y  H. b. v0 h* Y3 T5 `0 X
很显然asl是跟每个主板相关的,这个部分也是主板bios开发中最麻烦的部分,上面intel的那个工具能还原你主板的asl代码,建议看看,不算复杂(脚本语言都这样),然后找找你主板南桥北桥芯片的data sheet看看,也许你会有所领悟的哦..
2 C0 ^4 o) z- E6 n: _$ K8 U1 B0 m) r0 u
bios程序员在作bios的时候就用asl描述好了主板上的设备都要使用些什么样子的资源,怎样去分配这些资源.接下来os的任务就简单的,解释执行aml代码就能获取到这些信息. ( j- h; K  E* N( P( A7 d+ q1 Q
; W$ P3 C% N' z2 ^/ C) C) l: l) O
所以acpi创建的fdo的QueryBusRelations跟QueryResource跟QueryResourceRequirement都是读取aml代码解释执行而已.
# B* ^+ v) H2 H4 r' v) k2 ^+ \9 A! O3 B
只有几个aml描述的device(|_SB.|下面device)是属于acpi直接管辖的pdo,acpi也只暂时的创建了这些pdo,然后交给os继续枚举它创建的device,其他的诸如cpu(|_SB.|_PR.|),fixedbutton(FADT描述)等等的fdo就不多说了,如果你使用的pci总线,那么就会有一个|_SB.|PCI0|的device在aml的描述中出现,acpi枚举到它,os给它attach它的fdo,由pci.sys提供. . E0 x+ ^2 z: [- K

/ h& r. [" a$ Q6 M; w. z然后os继续枚举,这次的重点转移到pci上面了,这里就跟acpi的关系少很多了,pci有自己的获取资源,配置资源,枚举设备的方式,你应该要知道这些是用pci config space来完成的. 9 X1 L2 Q/ p8 E- r
9 O2 K! X# u2 I. ^2 V6 H6 \
pci开始枚举每个bus上的每个device,为每个device的每个function创建一个pdo,继续的bridge device继续为它的bus 枚举pdo,在这个过程中完成bus number的动态配置,这些信息可以参考(pci 跟 pci-to-pci bridge 的specification),对于每个pdo,pci通过读取它的base address register 的值来完成resource requirements的获取. " Z# n4 d! z  n* U4 I! a
0 w- Z8 ^0 }0 C) d6 @
这里又会有acpi用武的地方,IRP_MN_QUERYRELAIONS(bus)会发送到fdo,fdo会把这个irp传递给pdo,正常情况下pdo会直接complete这个irp,但是acpi创建的pdo却不是这样,它会查找acpi namespace,为新枚举出来的pdo插入合适的bus filter device,这个filter device用来电源管理以及在quire resource的时候加入一些resource,这里只是在当主板bios的aml里面有描述到新创建出来的pdo的描述的时候才会发生,这个部分你可以看看你的bios的asl代码,对比看看device tree的结构,看看acpi究竟在什么地方插入了bus filter device,来理解这种按需创建的原则. $ q/ {1 S( g. ]/ y* Q( G0 }$ N; r
' u/ r2 U/ l# ^! W
再往上,os为这些新创建出来的pdo attach合适的fdo,fdo继续枚举自己的pdo,这里注意一点,如果你的pdo在bios里面有描述,那么fdo与pdo之间是有一个bus filter的.加载的fdo开始枚举自己的pdo,这个irp同样又发送给了bus filter,嘿.这个bus filter又会查找acpi namespace适当的加入某些 bus filter,用这种一层一层的方式完成filter的透明加入过程.
1 l7 }1 m- n0 l7 r( S3 j" F' ^
! C6 e3 s  j0 D) S; i, h以上便是整个的枚举流程.
& j5 b6 x3 r8 q6 A7 u: G% C9 X. \全部都是属于文字的描述.不知道大家看明白了没有. 0 V& l! b3 m) w0 o2 [0 a

. j% h" M2 a1 k# M如果你想更近一步的更加详细的了解具体的过程
7 s7 J, T& p; \- _- B你可以用ida反编译acpi.sys跟pci.sys,花点时间了解下流程
' R1 f9 F+ G- b7 }. M在这个过程中acpi跟pci的符号表也是很重要的 ' k7 ]9 |& B; X
在ntoskrnl的符号表里面能找到pci使用的大部分类型信息 & m/ E3 L2 H' @
而acpi本身的符号表里面能找到acpi使用的几乎全部的类型信息
# t0 B( z) b% j8 j7 `* S2 g这两个类型信息在帮助我理解acpi跟pci.sys的反汇编代码方面起了天大的作用,一点都不夸张.
- O, H6 D7 }1 `; Z4 G; [9 N/ C2 p5 l
当然softice跟win2000的源代码更是必不可少的东西. ! B: f) _% I$ h+ X9 z8 @! i6 ]$ D- I

) r" _" r: n6 c. J$ O6 f9 m主板的data sheet跟asl代码也是非常重要的. 5 i6 \7 a0 U" h2 E6 r

- q! l  {! D9 j+ w# y3 X当然xxx spec更是不能少.....
# ]8 F, R" e* g, ^4 @- r4 p) S4 g! r
长期困扰我的大问题终于在今天有个比较满意的答案了 ' B6 O' a7 w: \2 g- U
大家跟我一起高兴吧.......
7 U% o' H; d! ^) u! Z, k' A1 _. u6 O7 v2 S7 w5 g0 N* S
p.s.斜杠会给过滤掉,所以我换成|了
发表于 2007-12-6 10:51:28 | 显示全部楼层
好文。
  y8 [- R: N9 s! |写驱动的、最好都能明白。
回复

使用道具 举报

发表于 2007-12-6 18:10:18 | 显示全部楼层
明白了。
/ k: x) I0 K* k& b原来什么本质多差不多。
6 x2 ]/ }0 U3 l, h5 H3 M嘿。。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-3-15 05:23 , Processed in 0.906941 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表