ACPICA

base version : v0.1.0

 

ACPI

ACPIは一般的に電源制御にまつわる規格と見なされていると思うのだが、電源管理に加え、ハードウェア情報を提供してくれる、素晴らしい規格である。各種I/Oデバイスのベースアドレスは大体ACPIから取ってこれると言っても過言ではない。

だが、ACPIはあまりのも巨大で複雑なため、OSに実装する際はACPICAを組み込むのが良い。ACPIテーブルを舐めるだけなら自力で探索する事もできるのだが、それだけでは取得できない情報(PCIの割り込み配線とか)もあるので、フルスクラッチはやめた方が良い。ただし、ACPICAを組み込むと、ものすごい数のファイルをコンパイルする事になり、コンパイル時間が大幅に伸びる。「なんか大規模システムを開発している感じでカッコいい」とでも思って耐えるしかない。

参考:OSDev.org:ACPICA

 

ACPICA組み込み

OS非依存になるよう実装されているため、比較的組み込みは用意である。

必要となるファイルはこの通り(→kernel/acpica/Makefile#L1)多いが、ソースコードの改変の必要はない。ただし、幾つか関数を定義してあげる必要がある。(→kernel/acpica/include/platform/acraph.hkernel/acpica/os_specific/service_layers/osraph.cc

また、標準ライブラリ関数も使っているので、各種定義する必要がある。

 

AcpiCtrl

ACPICAのC++ラッパーとして、Raph KernelではAcpiCtrlが定義されている。→kernel/raph_acpi.h

まず、仮想メモリ等が初期化される前に、AcpiCtrl::Setup(→kernel/raph_acpi.cc#L46)を呼び出す。これはACPICAを途中まで初期化し、テーブルを参照できるようにしている。本来であれば最初からきちんとACPICAを初期化したいのだが、仮想メモリを初期化する前にハードウェア情報が必要になる事があるので、先んじてAcpiCtrl::Setupを呼び出す必要がある。

仮想メモリが初期化された後に、AcpiCtrl::SetupAcpica(→kernel/raph_acpi.cc#L80)を呼び出す事で、ACPICAを完全に初期化する事ができる。これによってACPICAが提供する全ての関数が使えるようになる。(逆に、ACPIのテーブル参照以上の操作を行う関数はAcpiCtrl::SetupAcpicaよりも前に呼んではいけない)

 

シャットダウン、リセット

ACPIが使えるようになると、やはり電源操作をしたくなるものである。

ACPICAが関数を提供してくれているので、それを呼び出せば良い。(→kernel/raph_acpi.cc#L93kernel/raph_acpi.cc#L105

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中