気になったことのあれこれ。この広告は、90日以上更新していないブログに表示しています。memory概要xv6のコードリーティングを通してUnixの動作を追う。今回はCPUの起動からカーネルの起動直前までを見ていく。Unixのマルチプロセッサx86システムへの再実装である。xv6はMITにおけるオペレーティングシステムエンジニアリング(6.828)コースにて、教育を目的として使われている。https://ja.wikipedia.org/wiki/Xv6ソースコードは以下。コード内にも多くのコメントが記述されており非常に理解し易くなっている。https://github.com/mit-pdos/xv6-public全体の流れ起動処理は以下のような流れで行われる。Table)のロードCPUのプロテクトモードへの移行bootmain()を呼び出す()bootmain.c0x10000にカーネル(セクタ"1"から始まる4KB)を読み込むELFフォーマットであるか確認ELFヘッダの情報を元に各プログラムヘッダをハードディスクから読み込むELF(カーネル)のエントリポイントを呼び出す。CPUののセットアップ起動後はbootasm.Sから始まり、当該ファイルがブートセクタとして0x7000に読み込まれる。bootasm.Sでは主に前述した以下の処理を行う。Table)のロードCPUのプロテクトモードへの移行bootmain()を呼び出す()実際のコードは以下。CPUを起動後、32bitのプロテクトモードに遷移しC言語のコードに飛ぶ。%ip=7c00でCPUのリアルモードから実行を開始する。デフォルトでクリアされている。リアルモードから抜ける。jmp)を用いて%cs及び%eipをリロードし、32bitのプロテクトモードへの移行が完了する。スタックポインタを設定しCのコードにとぶ。コードセグメント(実行及び読み込み可能)。データセグメント(書き込み可能)。(4バイト)ここまでの処理でCPUはプロテクトモードへの移行やアドレスバスの制限解除を完了しており、セグメンテーションも使用可能な状態になっている。次に行うカーネルイメージのロードはbootmain()関数が行っており、C言語でbootmain.cに記述されている。カーネルイメージのロード以下のような流れで処理を行う。0x10000にカーネル(セクタ"1"から始まる4KB)を読み込むELFフォーマットであるか確認ELFヘッダの情報を元に各プログラムヘッダをハードディスクから読み込むELF(カーネル)のエントリポイントを呼び出す。カーネルイメージをメモリに展開するための処理を行うのがbootmain()関数で、以下のように定義されている。これはブートブロックの一部でbootmain()関数のを呼び出すbootasm.Sから続いている。bootasm.Sはプロセッサを32bitのプロテクトモードへの切り替える。entry.Sへ}bootmain()関数ではカーネルをディスクから読み込み、ELFフォーマットであるかを確認した後、他のセグメントもロードし、最後にそのロードしたELFヘッダに記載のあるエントリポイントにジャンプする。実際にディスクからデータを読み込むreadseg()関数は以下のように定義されており、オフセットやカウンタから実際の終点アドレスなどを求める処理となっていることがわかる。オフセット("offset")で指定したセクタから"count"バイト分のデータを読み込み、指定の物理アドレス"pa"に書き込む。指定したよりも大きなデータの読み込みが発生する。データの終端アドレス。offset(LBA)で指定したセクタから読み込んだデータを"pa"アドレスに展開する}上記から実際にカーネルのコードをメモリ上に展開しているのはreadsect()関数だとわかる。当該関数は以下のように定義されている。SECTSIZE/4);}readsect()関数では実際にI/Oポートからコマンドを送信しデータを指定の位置に読み込むような処理を行う。上記で命令の送受信が可能になるまで待機する関数であるwaitdisk()は以下のように定義されている。命令の送受信が可能どうか。0x40);}waitdisk()関数では命令の送受信が可能であるかどうかをステータスレジスタの値を参照することで確認している。xv6のコードリーティングを通してUnixの動作を追う。»Profile低レイヤ好きのソフトウェアエンジニア。(1)はてなブログをはじめよう!k--onishiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。