view pre-thesis/thesis.tex @ 2:55787899ba94

improve
author taiki <taiki@cr.ie.u-ryukyu.ac.jp>
date Mon, 18 Feb 2013 17:32:26 +0900
parents e6344b6dcc88
children 461fddf1e6a1
line wrap: on
line source

\documentclass[twocolumn,twoside,9.5pt]{jarticle}
\usepackage[dvipdfm]{graphicx}
\usepackage{picins}
\usepackage{fancyhdr}
\pagestyle{fancy}
\lhead{\parpic{\includegraphics[height=1zw,clip,keepaspectratio]{pic/emblem-bitmap.eps}}琉球大学主催 工学部情報工学科 卒業研究発表会}
\rhead{}
\cfoot{}

\setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}}
\setlength{\headheight}{0mm}
\setlength{\headsep}{5mm}
\setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}}
\setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}}
\setlength{\textwidth}{181mm}
\setlength{\textheight}{261mm}
\setlength{\footskip}{0mm}
\pagestyle{empty}

\begin{document}
\title{ELILO へのカーネルの実装}
\author{095767E 平良 太貴 {}{} 指導教員 : 河野 真治}
\date{}
\maketitle
\thispagestyle{fancy}

\section{OSの起動方法}
UEFI は OS とファームウェアの中間に位置する、インターフェース仕様である。CPU に依存せず、64bit で OS を立ち上げることができる。ELILO は、この UEFI 上で Linux をブートすることのできるブートローダである。\\
UEFI 上では、OS のブートローダは UEFI のアプリケーションとして動作する。つまり、ELILO は UEFI アプリケーションの一つである。ELILO から直接カーネルを起動することができれば、ロードの手順を踏むことなくよりシンプルなカーネルを実装することができる。\\
% UEFIとは何か。何のために導入されたものなのか?

% elilo とは何か、 UEFI との関係は?


% 近年、BIOS への置き換えを目的としている UEFI という新しいファームウェアが注目され始めてきている。UEFI は既存の BIOS に比べ、いくつかの利点がある。そのため、UEFI から起動できる OS は、BIOS で起動できる OS よりも利点を得られる。\\
% UEFI 上ではブートローダは EFI アプリケーションで定義され、通常は EFI アプリケーションから、ELF などの実行ファイルをロードする。ELILO もそういった仕組みである。

% 自分たちのやろうとしていることは何か

% ローダーなしに kernel を書く

よって本研究では、ELILO 上に直接、煩雑なロードの過程がない、高速に起動するマイクロカーネルを実装を行う。

\section{UEFI}
PC のハードウェア制御のための, OS とファームウェアのインターフェース仕様である。古い BIOS インターフェースに置き換わるものとして策定された。図\ref{fig:uefi}のような構成になっている。 

\begin{figure}[h]
\begin{center}
\includegraphics[scale=0.5]{./pic/uefi_swstack.pdf}
\end{center}
\caption{UEFI}
\label{fig:uefi}
\end{figure}

\subsection{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: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つに分けて開発を行った。

\section {ページング}\label{section:paging}
カーネルには、メモリ管理のためのページング機構が備わっている。ページングとは、記憶装置をページと呼ばれる小さな単位に分割して割り当てを行うアルゴリズムである。物理メモリ及び、仮想メモリ空間を一定のサイズのページと呼ばれる単位を分割して管理する。\\

% UEFI  アプリケーションの作り方
% boot loader のインストール方法

% code segment と data segment を実装するのに Paging/Segment tation が必要

% page table の説明
%  3段階の page table

% 実メモリを取得して
% page table を作成して
% CR3 に page table へのアドレスを格納して
% LDT/GDT を設定して
% ljmp で、実行する

\begin{figure}[h]
\begin{center}
\includegraphics[scale=0.4]{./pic/paging_structure.pdf}
\end{center}
\caption{IA-32e Paging}
\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{今後の課題}
 以上のことを前提とし、今後は CbC による UEFI 上でマイクロカーネルを作成する。\\
 セグメンテーションによるコードセグメント・データセグメントと、本研究室が提案するコードセグメント・データセグメントによる設計手法がどう合うかを検証し、ELILO 上に実装することが今後の課題である。\\
 ページングとセグメンテーションにより、コードセグメントとデータセグメントのアクセスするメモリ領域を限定することができる。\\
 最終的な目標としては、 OS の内部でメモリの取得と、実行する命令や操作されたデータの検証が可能になることである。そうすることにより開発者の手間を軽減でき、 OS やその上に実装されているアプリケーションが落ちることを無くすことができる。

\nocite{intel_cpu, comarchi, linux, UEFI}
\thispagestyle{fancy}

\bibliographystyle{junsrt}
\bibliography{os}

\end{document}