2007年3月3日 星期六

freebsd 的 driver 架構

freebsd 的 driver 架構稱作 NEWBUS, 將driver 的階層關係抽象化、OO化,以簡化跨平台時程式的差異,及對硬體存取的繁複。缺點就是因為抽象化抽出了很多東西,一開始看會有點看不懂來龍去脈,就如同在使用 OOPL 和 framework 時的感覺。

抽象過的界面描述是寫在 foo_if.m 檔裡頭。 device driver 的基本界面在 /sys/kern/device_if.m 。 Bus 的界面在 /sys/kern/bus_if.m 裡。這些 .m 檔在 build 時會經由 awk script /sys/tools/makeobjops.awk 編譯成 foo_if.[ch]。繼承 bus 的 pci, isa 等還各有自己的子界面。

device_if.m 定義了 device 的基本界面。基本界面共有八個,probe, identify, attach, detach, shutdown, suspend, resume, quiesce。
  1. probe: 偵測符合某個 driver 的硬體是否存在。
  2. identify: 強制設定某個硬體為存在在系統上。這通常是給較老舊的 ISA 界面硬體使用,因為它不像 PCI 或是 ISA pnp 等較新的標準有偵測硬體的標準功能可以使用,通常都是直接定義在固定的 mem 或 I/O 位址上。使用 identify 直接告訴 parent bus, "你別管那麼多,我說有就是有,照作就是了。"
  3. attach: 將 driver 和硬體綁起來。同時間一個硬體上只能有一個 driver 使用它。
  4. detach: 解除 driver 和硬體的關係。
  5. shutdown: 關機時執行
  6. suspend: 休眠
  7. resume: 從休眠中回復
  8. quiesce: 停止 driver 的功能。
Driver 的功能由這幾個界面延伸出來,完成基本的功能。

bus_if.m 包含了 system buses 上上下下的交互作用,所以界面要比 device 複雜一點:

((待續))

References:
Chapter 14 Newbus of FreeBSD Architecture Handbook

1 則留言:

  1. Hi~Mr. Li,

    您好,不知道小弟是否有此榮幸向您請益與FreeBSD Device Driver相關之課題?

    Best regards,

    Benjamin Joseph Chen
    E-Mail&MSN: bjchentc@gmail.com

    回覆刪除