本文copy自http://www.biosren.com/viewthread.php?tid=3807&highlight=handle,只是因为BISO联盟论坛关掉,不想这样的好文章就此丢失,因此特copy自我的博客里面!
一个人到医院去做健康检查 ,这件事情可以理解成一个handle ,
概念A:
1, Handle 为完成某项任务的集,
2,handle 只是无行为能力
如果要检查就要去各个普通的科室如去验血,测身高,测血压,测体重,另外还会给一张检验结果表。验血,测身高等等可以理解成各个protocol ,它是用来完成健康检查的一部分(也就是功能部份)另外检验结果表也是protocol的一部份,这个相当于EFI中的private data ,不同的人用同一个测量仪器, 测量出不同的结果
概念B:
1,protocol,是功能和数据的集合
2,handle 的行为必须通过protocol 完成
3,同一个protocol 作用于不同的handle 会有不同的结果
如果需要完成所有健康检查,就需要到各个科室去,另外一张体检表中不能同时有两个测身高这样的protocol, 否则就不知道用哪一个了测了,一个handle 下会挂很多个protocol ,有时也会有多个人去医院检查,也就是有多个handle
结论:
1, 一个handle 下会挂很多个protocol
2,一个protocol可以安装到多个handle 中去
3,一个handle 下不能挂两个同名的protocol
去体检时,医生会根据体验者的有性别,年龄做不同的体检。
性别,年龄相当于我们的devicepath, EFI中的devicepath 最常见的就是function number ,device number如acpi(pnp0a03,0)pci(1c|0)
当然还有更细的,如isa 下面挂的path :
acpi (pnp0a03,0) pci(1c|0)/ACPIPNP0a05,0)/ACPI(PNP0303,0)
PNP0a03代表pci host
Pnp0a05代表 isa device
PNP0303代表keyboard
这里在shell 里面用dh –d –b 看得比较清楚
根据性别,年龄 ,医生大概就知道体检者要去哪些科室,如妇产科,男性专科,这些专门处理某类人群的检验,医生先要根据性别,年龄去判断是哪个特殊科室,是进妇产科还是男性专科
概念C:
devicepath 用来读取某些device 的地址,
Devicepath protocol not required for all device handle ,it is only required for device handle that represent physical device in the system ,handle for virtural device will not contain a device path protocol,Device path for console devices and boot option
如:pcirootbridgeio devpath (acpi (PNP0a03 ,0)
child controllers: child [13F] (acpi (pnp0a03,0) pci(1c|0)
概念D:
DriverBinding image 这个特殊的科室可以认为是一个标准的DriverBinding , 一般的科室可以认为是一般的driver image ,driverbinding 有support ,start ,stop , EFI程序判断和医生类似,医生根据 性别年龄,和这些科室,一个一个的对,判断体检者进哪个科室,EFI 程序根据support 判断这支driver 是否可以在这个handle 上run 起来,很多时候它会根据当前controller 的device path 来判断,如PS2的处理程序,它就需要判断controllerhandle是不是ACPI(PNP0303), EFI中有一个非常重要的函数ConnectController, 这个函数就是用来处理controller 和 image是否相关。也就是image 和controller 的对应关系,不是所有的image 都适合某个driver ,这就像看病一样,一个男人能上妇产科吗,如果相关,这个image就可以在这个controller 上start ,如果不可以就不start ,接着这个controller 查询下一个image 是否和它相关,而这个动作在现实生活中充当了医生的角色。如果有个人男性,医生就不会让他查妇产科,也就是说这个科室对他不support 了。也就是说connectcontroller功能上等于医生确认医人上哪个科室
概念 E:
简单的controller handle 就是我们用RU 能实实在在的看到的controller , 而这些controller 都是host bridge 的child controller ,host bridge 都是这些controller 的parents controller, 而parents controller 很多protocol会遗传给child controller ,所谓的遗传就是把father 上的protocol 也安装在child protocol上面,当然前面我们提到的acpi (pnp0a03,0) pci(1c|0)/ACPIPNP0a05,0)/ACPI(PNP0303,0)
这也是一个controller handle 的path ,它的关系是
acpi (pnp0a03,0) 第一级 bus host
acpi (pnp0a03,0) pci(1c|0)/第二级 isa bus
acpi (pnp0a03,0) pci(1c|0)/ACPIPNP0a05,0 第三级isa kbc
acpi (pnp0a03,0) pci(1c|0)/ACPIPNP0a05,0)/ACPI(PNP0303,0) 第四级keyboard
每一个下一级都是上一级创建的
Connect device 也就是这样一级一级的创建的,
A,bus host controller 和driver systempcibusdxe(phoenix code base support 上了 ) start 创建了isa bus ,
B,isa bus controller 和driver systempciisabusdxe (support 上了) start 产生了isakbc device controller 和superio device controller ,
C,isakbc controller 和driver systemisakbcdxe support 上了start后创建了keyboard device handle D. keyboard device handle和driver systemps2keyboarddxe support 上了,start
概念 F:
handle 只能通过bus driver 和image 创造,bus driver 在执行时会产生很多childhandle ,image 在载入进会创建image handle , EFI中把image 也当成了一个handle