# HG changeset patch # User taiki # Date 1361176346 -32400 # Node ID 55787899ba94a97a01a25b13f990daf773b9478c # Parent e6344b6dcc8801e571e839f12f59960defbf4cc6 improve diff -r e6344b6dcc88 -r 55787899ba94 pre-thesis/Makefile --- a/pre-thesis/Makefile Mon Feb 18 15:03:32 2013 +0900 +++ b/pre-thesis/Makefile Mon Feb 18 17:32:26 2013 +0900 @@ -1,7 +1,8 @@ TARGET=thesis LATEX=platex -BIBTEX=jbibtex +#BIBTEX=jbibtex +BIBTEX=pbibtex DVIPDF=dvipdfmx -p a4 EBB=ebb #You need setting "-l" option if You think You get a landscape PDF diff -r e6344b6dcc88 -r 55787899ba94 pre-thesis/thesis.tex --- a/pre-thesis/thesis.tex Mon Feb 18 15:03:32 2013 +0900 +++ b/pre-thesis/thesis.tex Mon Feb 18 17:32:26 2013 +0900 @@ -25,7 +25,8 @@ \thispagestyle{fancy} \section{OSの起動方法} - +UEFI は OS とファームウェアの中間に位置する、インターフェース仕様である。CPU に依存せず、64bit で OS を立ち上げることができる。ELILO は、この UEFI 上で Linux をブートすることのできるブートローダである。\\ +UEFI 上では、OS のブートローダは UEFI のアプリケーションとして動作する。つまり、ELILO は UEFI アプリケーションの一つである。ELILO から直接カーネルを起動することができれば、ロードの手順を踏むことなくよりシンプルなカーネルを実装することができる。\\ % UEFIとは何か。何のために導入されたものなのか? % elilo とは何か、 UEFI との関係は? @@ -38,31 +39,38 @@ % ローダーなしに kernel を書く -しかし、このロードの過程を飛ばして ELILO 上にカーネルを書くことにより、煩雑なロードの操作をなくし、高速に起動するカーネルが実装可能だと考えられる。そこで、ELILO へのマイクロカーネルの実装を行った。 +よって本研究では、ELILO 上に直接、煩雑なロードの過程がない、高速に起動するマイクロカーネルを実装を行う。 + \section{UEFI} -PC のハードウェア制御のための, OS とファームウェアのインターフェース仕様である。古い BIOS インターフェースに置き換わるものとして策定された。図\ref{fig:uefi}のような構成になっている。 IA-32 から起動した場合は IA-32 に対応した OS のみ、x86-64 から起動した場合は、x86-64 に対応した OS のみが使用可能である。ブート前の環境では、メモリへのアクセス制限がある BIOS に比べ、 UEFI は 64 ビットの UEFI ではロングモードも可能であり、ブート前の環境で 64 ビットアドレッシングの全てのメモリに直接アクセスが可能となっている。 +PC のハードウェア制御のための, OS とファームウェアのインターフェース仕様である。古い BIOS インターフェースに置き換わるものとして策定された。図\ref{fig:uefi}のような構成になっている。 \begin{figure}[h] \begin{center} -\includegraphics[scale=0.8]{./pic/uefi_swstack.pdf} +\includegraphics[scale=0.5]{./pic/uefi_swstack.pdf} \end{center} \caption{UEFI} \label{fig:uefi} \end{figure} -%\section{GUIDパーティションテーブル(GPT)}\label{section:gpt} -%記憶媒体上のパーティションテーブルの記憶に関する標準規格である。この規格でフォーマットされた記憶媒体から、UEFI 用のアプリケーションを起動することができる。BIOS と異なり、2TB 以上のハードディスクからブートすることが可能になっている。 +\subsection{gnu-efi}\label{section:gnuefi} +UEFI アプリケーションを開発するためのライブラリである。ラッパーを使用して UEFI の命令を使いやすい形にしている。 -\section{gnu-efi}\label{section:gnuefi} -UEFI アプリケーションを開発するためのライブラリである。ラッパーを使用して UEFI の命令を使いやすい形にしている。 +\section{UEFI によるアプリケーションの作成方法}\label{section:howto} +UEFI ではブートローダやデバイスドライバは、UEFI 用のアプリケーションとして動作する。\\ +UEFI 用のアプリケーションを作成するには、Linux 上で gnu-efi をインストールする。次に、gnu-efi に付属しているリンカスクリプトとオブジェクトファイルをリンクする。これで、gnu-efi のライブラリを使用することができる。 +最後に、作成したプログラムを objcopy を使い、Linux の実行形式 ELF から、UEFI に>使われている実行形式の PE+ という形式に変換する。これで、UEFI アプリケーションを作成することができる。\\ +作成したプログラムが、PC を起動すると自動的に開始できるようにするためには、 UEFI に対応したパーティションにフォーマットしたディスクに、\/EFI\/BOOT\/boot(archtecture).efi というように配置する。 + \section{ELILO}\label{section:elilo} UEFI から、Linux をブートするためのブートローダである。ライブラリに gnu-efi を使用している。LILO 設定ファイルの記述などを、LILO を元にしている。 -\subsection{ELILO の設定}\label{section:elilo} -UEFI は、ブートするためのディスクを GPT でフォーマットする必要がある。ELILO を make すると、PE+ という実行ファイルが作成される。これは UEFI 上で実行可能な、UEFI アプリケーションの実行形式である。UEFI は、起動時に呼び出す UEFI アプリケーションの位置が決まっており、そこに PE+ の実行形式を配置することで、自動的にそのアプリケーションを起動することが可能となる。 +\subsection{ELILO の設定}\label{section:confelilo} +ELILO を使うためには、Linux にインストールした gnu-efi を、UEFI アプリケーションの作成方法に従い Makefile を書き換え、make する。出来上がった ELILO の実行ファイルを、boot(archtecture).efi に変更し、UEFI が自動的に読み込む /EFI/BOOT へ配置し、PC を起動することで ELILO を使うことができる。 \subsection{デバッグ手法}\label{section:debug} -UEFI はファームウェアであり、BIOS と同じくユーザプログラムのようにデバッグするのは難しい。そのため、特殊なデバッグ方法が必要になる。今回は、VMware Fusion 5 を使用した。VMware Fusion 5 はデフォルトで BIOS から起動するという仕様になっているが、UEFI から起動するように設定を変更することができる。\\ +UEFI はファームウェアであり、BIOS と同じくユーザプログラムのようにデバッグするのは難しい。そのため、特殊なデバッグ方法が必要になる。今回は、VMware Fusion 5 を使用した。VMware Fusion 5 は UEFI から起動するように設定を変更することができる。\\ +本研究の環境では、開発用の Linux と、デバッグ用の VM の2つに分けて開発を行った。 + \section {ページング}\label{section:paging} -カーネルには、メモリ管理のためのページング機構が備わっている。ページングとは、記憶装置をページと呼ばれる小さな単位に分割して割り当てを行うアルゴリズムである。物理メモリ及び、仮想メモリ空間を一定のサイズのページと呼ばれる単位を分割して管理する。x86 では、ページングを行うために必要な設定がある。\\ +カーネルには、メモリ管理のためのページング機構が備わっている。ページングとは、記憶装置をページと呼ばれる小さな単位に分割して割り当てを行うアルゴリズムである。物理メモリ及び、仮想メモリ空間を一定のサイズのページと呼ばれる単位を分割して管理する。\\ % UEFI アプリケーションの作り方 % boot loader のインストール方法 @@ -78,47 +86,50 @@ % LDT/GDT を設定して % ljmp で、実行する - - \begin{figure}[h] \begin{center} \includegraphics[scale=0.4]{./pic/paging_structure.pdf} \end{center} \caption{IA-32e Paging} -\label{paging_structure} +\label{fig:paging_structure} \end{figure} % ページングを開始する手順 -\subsection {ページングの有効}\label{section:enable} -Intel 64 には、IA-32e というページングの方式を持っている。その方式を有効にするためには、下記のレジスタのビットを有効、つまり 1 にセットする必要がある。\\ +\subsection {ページングを開始する手順}\label{section:enable} +ページングを開始するには、実メモリを取得し、 ページテーブルを作成し、CR3 にページテーブルのアドレスを格納する。ページングを開始するためには、下記のレジスタのビットを有効、つまり 1 にセットする必要がある。\\ \begin{table}[h] \begin{tabular}{l|l|l} \hline register & flag name & bit number \\ \hline \hline - cr0 & Paging & 31 \\ \hline - cr4 & Physical Address Extension & 5 \\ \hline + cr0 &Paging & 31 \\ \hline + cr4 &Physical Address Extension & 5 \\ \hline IA32\_EFER & LME & 8 \\ \hline \end{tabular} \end{table} -\subsection {CR3 レジスタ}\label{section:cr3register} -Intel 64 の、8 つあるコントロールレジスタの一つである。CR3 レジスタは、PML4 の先頭のアドレスを指し、ページテーブルを参照するときは CR3 に格納されているアドレスを指標にする。 +\subsection {使用されるページテーブル}\label{section:pml4} +Page map level 4(PML4) と、Page directory pointer table(PDPT) を使用する。PML4 は、PDPT へのアドレスと、メモリ管理に関する情報を持つテーブルである。\\ +PDPT は 1 GByte に分割された物理メモリのページの、先頭のアドレスを指す。 -\subsection {The page map level 4(PML4)}\label{section:pml4} -PML4 は、Page directory pointer table へのアドレスと、メモリ管理に関する情報を持つテーブルである。CR3 が PML4 へのポインタを持つ。 +\subsection {CR3 レジスタ}\label{section:cr3register} +CR3 レジスタは、PML4 の先頭のアドレスを指し、ページテーブルを参照するときは CR3 に格納されているアドレスを指標にする。 + +\section {セグメンテーション}\label{section:segmentation} +カーネルが持っている、メモリを管理するための機構である。ページングの設定したのち、セグメント方式でメモリ位置を参照するにはセグメントを識別する値と、セグメント内のオフセットを指定する。\\ +ljmp 命令で、メモリ上のプログラムを実行する。 -\subsection {Page directory pointer table(PDPT)}\label{section:pdpt} -PDPT は 1 GByte に分割されたページの、先頭のアドレスを指す。 +\subsection{Discriptor Table} +セグメンテーションの機構を使用するために Discriptor Table を設定する。Discriptor Table は、メモリへのアドレスと、そのアドレスが指し示すメモリ内のデータの属性を持ったテーブルである。アクセスするメモリ領域を限定する。セグメントセレクタによって選択され、ページングによって参照される。Global Discriptor Table(GDT) と Local Discriptor Table(IDT) を設定する必要がある。 -\section{まとめと今後の課題} +\section{今後の課題}  以上のことを前提とし、今後は CbC による UEFI 上でマイクロカーネルを作成する。\\ - Intel 64 上でのコードセグメント・データセグメントと、本研究室が提案するコードセグメントとデータセグメントによる設計手法がどう合うかを検証し、x86 上に実装することが今後の目標となる。\\ - 新しいインターフェースである EFI で起動できるよう実装する。 データセグメントはメモリ管理の機能に相当する. 開発での malloc や free を排除するための新しい機能である. メモリへの不正アクセスや, 煩雑なメモリの取得, 解放という操作を消去することが可能になる. \\ - 最終的な目標としては, OS の内部でメモリの取得と, 実行する命令や操作されたデータの検証が可能になることである. そうすることにより開発者の手間を軽減でき, OS やその上に実装されているアプリケーションが落ちることを無くすことができる. + セグメンテーションによるコードセグメント・データセグメントと、本研究室が提案するコードセグメント・データセグメントによる設計手法がどう合うかを検証し、ELILO 上に実装することが今後の課題である。\\ + ページングとセグメンテーションにより、コードセグメントとデータセグメントのアクセスするメモリ領域を限定することができる。\\ + 最終的な目標としては、 OS の内部でメモリの取得と、実行する命令や操作されたデータの検証が可能になることである。そうすることにより開発者の手間を軽減でき、 OS やその上に実装されているアプリケーションが落ちることを無くすことができる。 -\nocite{intel_cpu, Xv6, comarchi, oskernel, linux, UEFI} +\nocite{intel_cpu, comarchi, linux, UEFI} \thispagestyle{fancy} \bibliographystyle{junsrt} -\bibliography{os,book} +\bibliography{os} \end{document}