マルチコア

base version : v0.1.0

マルチコアにはLocal APICが切っても切れない関係にあるので、Local APICの解説をしつつ、マルチコアの初期化について解説していく。

基本的にはMultiProcessor SpecificationやIntel Software Developer’s Manualを参考にしながらの実装となる。(→参考資料

また、マルチコアの初期化はxv6のコードも大変参考になる。

マルチコア初期化の流れ

  1. APIC情報を取得
  2. BSP(最初に起動したプロセッサ)のLocal APICを初期化
  3. BSPがAP(BSPによって叩き起こされるプロセッサ)を叩き起こす
  4. APは16bitモードで起きるので、64bit modeに遷移させてあげる
  5. 各APごとにLocal APICを初期化

APICとは

Advanced Programmable Interrupt Controller、つまり、「めっちゃすごい割り込みコントローラー」。

マルチコア対応その他の目的でPICの機能向上版みたいなモノが必要になったため、作られた。

APICは、Local APICとIOAPICの二種類あるが、IOAPICはハードウェア割り込みをどのコアに割り振るかをコントロールしている。Local APICは各コアに対して存在し、IOAPICからやってきた割り込みを管理したり、プロセッサ間通信を担ったりする。今回の主役はこちら。

APIC情報の取得から初期化

APIC(Local APIC/IOAPIC)に関する情報はACPI(→ACPICA)が取得してくれるので、その情報を元に初期設定を行う。それを行っているのが、ApicCtrl::Setup

次に、BSPの初期化をApicCtrl::BootBspが行う。やっているのはLocal APICの初期化。

APの起動

BSPはApicCtrl::StartAPsを実行して、APを起動する。

APは立ち上がるとApicCtrl::_startedを1にセットするので、BSPはそれが確認できるまで待機、確認出来次第次のAPを立ち上げる。こうすることで、1つ1つ順番に立ち上げる事ができる。

APの16bit modeでの始動、からの64bit modeへ

BSPはアドレス0x8000から起動するようにAPに対して通知する。boot/bootap.Sのコードはリンカスクリプトにより0x8000に配置される前提でリンクされているが、実際の0x8000には置かれていないので、ApicCtrl::StartAPsがコピーする。

bootap.Sでは、ページテーブルやgdtの設定等をした上でプロテクトモードを飛ばして一気にIA-32e compatibility modeに遷移する。トランポリンコードを挟み、64bit modeに移行した後は、Cの関数に処理を任せる。(参考:64bit mode

APの初期化

APの初期化はApicCtrl::BootAPが行うが、実際はApicCtrl::_startedを立てた上で、ただLocal APICを初期化しているだけに過ぎない。BSPの時と同じである。

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中