Mercurial > hg > Papers > 2013 > taiki-thesis
changeset 3:461fddf1e6a1
improve article
author | taiki <taiki@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 18 Feb 2013 18:31:17 +0900 |
parents | 55787899ba94 |
children | 93afb9dc0401 |
files | pre-thesis/os.bib pre-thesis/thesis.tex |
diffstat | 2 files changed, 32 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/pre-thesis/os.bib Mon Feb 18 17:32:26 2013 +0900 +++ b/pre-thesis/os.bib Mon Feb 18 18:31:17 2013 +0900 @@ -1,7 +1,12 @@ -@manual{linux, +@misc{gnu-efi, +author = "", +title = "{gnu-efi}", +howpublished = "\url{http://sourceforge.net/projects/gnu-efi/}" +} +@misc{linux, author = "", title = "{The Linux Archives}", -howpublished = "{http://www.kernel.org}" +howpublished = "\url{http://www.kernel.org}" } @manual{intel_cpu,
--- a/pre-thesis/thesis.tex Mon Feb 18 17:32:26 2013 +0900 +++ b/pre-thesis/thesis.tex Mon Feb 18 18:31:17 2013 +0900 @@ -2,6 +2,7 @@ \usepackage[dvipdfm]{graphicx} \usepackage{picins} \usepackage{fancyhdr} +\usepackage{url} \pagestyle{fancy} \lhead{\parpic{\includegraphics[height=1zw,clip,keepaspectratio]{pic/emblem-bitmap.eps}}琉球大学主催 工学部情報工学科 卒業研究発表会} \rhead{} @@ -24,9 +25,9 @@ \maketitle \thispagestyle{fancy} -\section{OSの起動方法} +\section{はじめに} UEFI は OS とファームウェアの中間に位置する、インターフェース仕様である。CPU に依存せず、64bit で OS を立ち上げることができる。ELILO は、この UEFI 上で Linux をブートすることのできるブートローダである。\\ -UEFI 上では、OS のブートローダは UEFI のアプリケーションとして動作する。つまり、ELILO は UEFI アプリケーションの一つである。ELILO から直接カーネルを起動することができれば、ロードの手順を踏むことなくよりシンプルなカーネルを実装することができる。\\ +UEFI 上では、OS のブートローダは UEFI のアプリケーションとして動作する。つまり、ELILO は UEFI アプリケーションの一つである。UEFI のアプリケーションである ELILO から、実行形式をロードせずに直接カーネルを起動することができれば、ロードの手順を踏むことなくよりシンプルなカーネルを実装することができる。\\ % UEFIとは何か。何のために導入されたものなのか? % elilo とは何か、 UEFI との関係は? @@ -38,8 +39,7 @@ % 自分たちのやろうとしていることは何か % ローダーなしに kernel を書く - -よって本研究では、ELILO 上に直接、煩雑なロードの過程がない、高速に起動するマイクロカーネルを実装を行う。 +本研究では、ELILO 上に直接、煩雑なロードの過程がない、高速に起動するマイクロカーネルを実装を行う。 \section{UEFI} PC のハードウェア制御のための, OS とファームウェアのインターフェース仕様である。古い BIOS インターフェースに置き換わるものとして策定された。図\ref{fig:uefi}のような構成になっている。 @@ -58,25 +58,23 @@ \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 というように配置する。 +最後に、作成したプログラムを objcopy を使い、Linux の実行形式 ELF から、UEFI に>使われている実行形式の PE+ に変換する。これで、UEFI アプリケーションを作成することができる。\\ +作成したプログラムが、対象のディスクイメージを起動すると自動的に開始できるようにするためには、 UEFI に対応したパーティションとファイルシステムにフォーマットしたディスクに、/EFI/BOOT/boot(archtecture).efi というように配置する。 \section{ELILO}\label{section:elilo} UEFI から、Linux をブートするためのブートローダである。ライブラリに gnu-efi を使用している。LILO 設定ファイルの記述などを、LILO を元にしている。 \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 は UEFI から起動するように設定を変更することができる。\\ -本研究の環境では、開発用の Linux と、デバッグ用の VM の2つに分けて開発を行った。 +\subsection{UEFI アプリケーションの実行}\label{section:debug} +今回は、VMware Fusion 5 を使用した。VMware Fusion 5 は UEFI から起動するように設定を変更することができる。\\ +本研究の環境では、開発用の Linux と、デバッグ用の Linux の2つに分けて開発を行った。 \section {ページング}\label{section:paging} カーネルには、メモリ管理のためのページング機構が備わっている。ページングとは、記憶装置をページと呼ばれる小さな単位に分割して割り当てを行うアルゴリズムである。物理メモリ及び、仮想メモリ空間を一定のサイズのページと呼ばれる単位を分割して管理する。\\ - +ページングをすることにより、物理メモリ上で小さな領域を集めて一つの仮想メモリを確保することができ、プログラム側からメモリを管理する必要がなくなる。\\ % UEFI アプリケーションの作り方 % boot loader のインストール方法 - % code segment と data segment を実装するのに Paging/Segment tation が必要 - % page table の説明 % 3段階の page table @@ -86,6 +84,14 @@ % LDT/GDT を設定して % ljmp で、実行する +% ページングを開始する手順 +\subsection {ページングを開始する手順}\label{section:enable} +ページングを開始するには、実メモリを取得し、 ページテーブルを作成し、CR3 にページテーブルのアドレスを格納する。ページングを開始するためには、CR0 レジスタの 31b bit 目、CR4 レジスタの 5bit 目、IA32\_EFER の 8bit 目のレジスタのビットを有効、つまり 1 にセットする必要がある。 + +\subsection {使用されるページテーブル}\label{section:pml4} +Page map level 4(PML4) と、Page directory pointer table(PDPT) を使用する。図PML4 は、PDPT へのアドレスと、メモリ管理に関する情報を持つテーブルである。\\ +PDPT は 1 GByte に分割された物理メモリのページの、先頭のアドレスを指す。PDPT と PML4 の構成を、図\ref{fig:paging_structure}に示す。 + \begin{figure}[h] \begin{center} \includegraphics[scale=0.4]{./pic/paging_structure.pdf} @@ -94,41 +100,23 @@ \label{fig:paging_structure} \end{figure} -% ページングを開始する手順 -\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 - IA32\_EFER & LME & 8 \\ \hline - \end{tabular} -\end{table} - -\subsection {使用されるページテーブル}\label{section:pml4} -Page map level 4(PML4) と、Page directory pointer table(PDPT) を使用する。PML4 は、PDPT へのアドレスと、メモリ管理に関する情報を持つテーブルである。\\ -PDPT は 1 GByte に分割された物理メモリのページの、先頭のアドレスを指す。 - -\subsection {CR3 レジスタ}\label{section:cr3register} -CR3 レジスタは、PML4 の先頭のアドレスを指し、ページテーブルを参照するときは CR3 に格納されているアドレスを指標にする。 - \section {セグメンテーション}\label{section:segmentation} カーネルが持っている、メモリを管理するための機構である。ページングの設定したのち、セグメント方式でメモリ位置を参照するにはセグメントを識別する値と、セグメント内のオフセットを指定する。\\ ljmp 命令で、メモリ上のプログラムを実行する。 \subsection{Discriptor Table} セグメンテーションの機構を使用するために Discriptor Table を設定する。Discriptor Table は、メモリへのアドレスと、そのアドレスが指し示すメモリ内のデータの属性を持ったテーブルである。アクセスするメモリ領域を限定する。セグメントセレクタによって選択され、ページングによって参照される。Global Discriptor Table(GDT) と Local Discriptor Table(IDT) を設定する必要がある。 +\section{まとめ} +本稿では、UEFI へのアプリケーションの作成方法と ELILO の 設定、マイクロカーネルのページング、セグメンテーションによるメモリ管理の方式について述べた。\\ +マイクロカーネルの実装は、ページテーブルの初期化まで実装しており、ページングとセグメンテーションの実装を進める。 \section{今後の課題} - 以上のことを前提とし、今後は CbC による UEFI 上でマイクロカーネルを作成する。\\ + 今後は CbC による UEFI 上でマイクロカーネルを作成する。\\ セグメンテーションによるコードセグメント・データセグメントと、本研究室が提案するコードセグメント・データセグメントによる設計手法がどう合うかを検証し、ELILO 上に実装することが今後の課題である。\\ - ページングとセグメンテーションにより、コードセグメントとデータセグメントのアクセスするメモリ領域を限定することができる。\\ - 最終的な目標としては、 OS の内部でメモリの取得と、実行する命令や操作されたデータの検証が可能になることである。そうすることにより開発者の手間を軽減でき、 OS やその上に実装されているアプリケーションが落ちることを無くすことができる。 - -\nocite{intel_cpu, comarchi, linux, UEFI} + ページングとセグメンテーションにより、コードセグメントとデータセグメントのアクセスするメモリ領域を限定することができ、不正になメモリアクセスを防ぐことができる。\\ + OS の内部でメモリの取得と、実行する命令や操作されたデータの検証が可能になることである。そうすることにより開発者の手間を軽減でき、 OS やその上に実装されているアプリケーションが落ちることを無くすことができる。 +\nocite{intel_cpu, linux, UEFI, gnu-efi} \thispagestyle{fancy} - \bibliographystyle{junsrt} \bibliography{os}