view paper/chapter/chapter4.tex @ 15:82407e7fefd9

fix
author okud
date Sun, 14 Feb 2021 15:40:34 +0900
parents 101c076a190b
children c977b5f82b9f
line wrap: on
line source

\chapter{UEFI}


\section{UEFI}
UEFI\cite{uefi}とは、Unified Extensible Firmware Interfaceの略で
OSとプラットフォームファームウェアの間のソフトウェアインタフェースを定義する仕様である。
1990年代半ばにIntelによってBIOSに変わるEFI仕様が開発された。
2005年にIntel、AMD、Apple、Microsoftなどの企業からなるUnified EFI Forumという業界団体のもとUEFIが開発された。
UEFIは単なるインタフェースの仕様であるため、特定のプロセッサに依存しない。
以前までのBIOSと異なり、近代的なソフトウェア開発手法を用いることが推奨されていて、C言語などで実装ができる。


\section{BIOSとUEFI}
UEFIはBIOSの後継として開発されたがBIOSと大きな違いがいくつかある。
BIOSとUEFIの違いは表\ref{tb:biso_uefi}である。
\begin{table}[H]
  \begin{center}
    \caption{BIOSとUEFIの違い}
    \begin{tabular}{|c|c|c|c|} \hline
	   & BIOS & UEFI(32bit) & UEFI(64bit)\\ \hline
    CPU & 16bit & 32bit & 64bit \\ \hline
	メモリ空間 & 1MB & 4GB & 256TB\\ \hline
    BOOT & MBR & GPT & GPT \\ \hline
    デバイス規格 & PS/2 & USB & USB \\ \hline
    \end{tabular}
	\label{tb:biso_uefi}
  \end{center}
\end{table}
\subsection{CPU}
BIOSは、40年近く前から存在しているので、16bitCPU前提のアーキテクチャであるため16bitで起動する。
また、CPUリアルモードでないとBIOSから起動できない。
さらに、CPUのアーキテクチャに依存し、アーキテクチャごとに設定しなければならない。
しかし、UEFIは、32bit、64bitの両方を起動できる。起動も64bitモードで可能。
また、CPUのアーキテクチャに依存しない。

\subsection{メモリ空間}
16bitCPUのメモリのアドレス空間は2の16乗で64KBであった。
つまり、16bitBIOSでは、64KBの16倍である1MBまでしか使えない。
UEFIでは、32bitなら2の32乗bitで4GB、64bitなら2の64乗bitで16EBまでメモリを潤沢に使える。
これにより、セキュリティを含めたシステム機能の強化が可能になった。

\subsection{BOOT}
BIOSとUEFIでは、BOOT方式が違う。
BIOSは、ディスク先頭の512バイトにBootLoaderとパーティーションテーブル(MBR)が格納されていて
第一セクタの512バイトがメモリにコピーされ、そこにジャンプする。
そして、そのBootLoaderが起動する。BootLoaderがカーネルとディスクイメージをメモリにロードし、
カーネルが初期化処理をする。その後OSが起動される。
UEFIは、UEFIファームウェアがロードされ、起動に必要なハードウェアを初期化する。
次にファームウェアがBootマネージャのデータを読み込みどのUEFI Applicationをどこから起動するか決定する。
ファームウェアのブートマネージャのブートエントリに定義されているように UEFI Application をファームウェアが起動する。
起動しらUEFI Applicationが他のApplicationやカーネルとBootLoaderを起動する。

\subsection{デバイス}
マウスやキーボードなどのデバイスの規格がBIOSとUEFIで変わる。
BIOSはUSBが発明される前から存在しているのでデバイス規格はPS/2を使用していた。
PS/2は端子を通じてキーボードとマウスがキーボードコントローラに接続され、CPUからI/Oバス経由でキーボードコントローラとやりとりをする。
しかし、PS/2ではマウスとキーボードしか接続できないため、汎用性の高いUSBが主流になってきた。
だが、USBに対応していないデバイスも存在したため、USBキーボードをPS/2キーボードに見せかけるエミュレータ機能が存在した。
一方、UEFIではUSBが主流なため、デバイスの規格は基本的にUSBであることが多い。

\section{UEFI Application}
 UEFIの内部構造は図\ref{uefiapps}になっている。
赤い点線で囲まれている部分がUEFIのApplicationの部分になる。
UEFI Boot Managreがロード、実行するプログラムのことをUEFI Applicationと呼ぶ。
UEFI仕様に適合するUEFI実装はEFI Byte Codeを含んでいるため全てのプロセッサ、アーキテクチャと互換性がある。
つまりUEFI Applicationにも互換性がある。
また、UEFI ApplicationはC言語で記述することが可能なので、個人で開発することが可能である。
UEFI Applicationはefiという拡張子でC言語で書かれたコードをコンパイルするとUEFI Applicationになる。
UEFI OS LoaderはUEFI Applicationの一種であり、これを使えばbootloaderも開発が可能になる。

\begin{figure}[H]
    \begin{center}
        \includegraphics[width=150mm]{fig/uefiapp.png}
    \end{center}
    \caption{UEFI Application}
    \label{uefiapps}
\end{figure}

\section{UEFI 開発環境}
 UEFIを開発するにあたって使われる開発環境が2つ存在する。
 Intelのtianocore EDK2\cite{edk2}とGNU-efi\cite{gnu}である。
Tianocoreは、独自のビルドシステムをもつ大規模で複雑な環境で、
CrossCompilerとしてGCC、MinGW、Microsoft Visual C++などが使用できる。
UEFI Application のコンパイルだけでなくBIOS ROMにフラッシュするUEFIファームウェアのコンパイルにも利用できる。
 Gnu-efiは、システムのネイティブGCCでUEFIアプリケーションをコンパイルするためのライブラリとヘッダのセットである。
UEFI ファームウェアのコンパイルには使用できない。UEFI Applicationをリンクするためのライブラリがいくつかあり、
UEFI Applicationの開発に特化している。

\section{Raspberry Pi上のUEFI}

\section{QEMU 上の UEFI}