OSを自作してみる1 ~Linuxで自作OSを作る環境を構築する~



前々からOSを自作してみたいと思ったので備忘録も兼ねてOS自作の記事を複数回に分けて書いてみる。(しばらく記事ネタに困らなそうだし ( ̄▽ ̄) )

ネット上で自作OSの作成に関する情報を検索するとよく「30日でできる!OS自作入門」という書籍の内容に沿って作成してるところが多い。
結構わかりやすく初心者向けに書かれている(たぶん自作OSに精通している人はわかりやすい)この書籍だが、残念なことにWindows上で開発を前提としている。
Linux上で開発したい人向けの情報がなかなかわかりやすい記事などが見つからなかったのでここでその開発環境等をそろえるまでの過程を記事にしてみようと思う。
記念すべき第1回目は、異なるアーキテクチャで動作するOSを生成する為にクロスコンパイラの導入をやっていく。

OS : CentOS7 64bit(仮想マシン上で動作)
CPU : i7 4770K 2コア割り当て
RAM : 8GB
HDD : 200GB割り当て
使用言語 : C言語、GAS(AT&T記法を採用)

今回この記事を作成するにあたってこちらサイトを参考にさせてもらった。http://wiki.osdev.org/GCC_Cross-Compiler
(まぁ、ほとんどやり方一緒なんだけどね…)
今後もこのサイトを参考に作っていこうと思う。

まずは32ビットOS(i686-elf)の開発を想定してクロスコンパイラを導入していく。

1. 下記パッケージをyumでインストールする。その前にyumのアップデートかけといたほうがエラーなくスムーズに進む。
(因みにカレントディレクトリはrootのホームディレクトリ)

# yum -y update
# yum -y install libgcc.i686 glibc-devel.i686 perl wget gcc gcc-c++ glibc bzip2

2. ソースをダウンロードするディレクトリを作成し、移動。

# mkdir src
# cd src

3. 下記のパッケージをダウンロードしていく。

# wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2
# wget https://ftp.gnu.org/gnu/texinfo/texinfo-6.3.tar.gz
# wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.gz
# wget https://www.gnu.org/software/xorriso/xorriso-1.4.6.tar.gz

4. GNU Texinfoをビルド

# tar xvf texinfo-6.3.tar.gz
# cd texinfo-6.3
# ./configure
# make
# make install
# cd ../

5. 無事完了したら以下を追加する。

# export PREFIX=$HOME/opt/cross
# export TARGET=i686-elf
# export PATH=$PREFIX/bin:$PATH

6. binutilsをビルドしてインストール。

# tar xvf binutils-2.27.tar.gz
# mkdir build-binutils
# cd build-binutils
# ../binutils-2.27/configure –target=$TARGET –prefix=$PREFIX –with-sysroot –disable-nls –disable-werror
# make
# make install
# cd ../

7. GNU GCCををビルドしてインストールする。-jの所は自分の環境に合わせて設定する。

# tar xvf gcc-6.3.0.tar.bz2
# cd gcc-6.3.0/
# contrib/download_prerequisites
# cd ../
# mkdir build-gcc
# cd build-gcc
# ../gcc-6.3.0/configure –target=$TARGET –prefix=$PREFIX –disable-nls –enable-languages=c,c++ –without-headers
# make -j4 all-gcc
# make -j4 all-target-libgcc

※ちなみに僕はここでエラーで止まってしまった。


checking for i686-elf-gcc… /root/src/build-gcc/./gcc/xgcc -B/root/src/build-gcc/./gcc/ -B/root/opt/cross/i686-elf/bin/ -B/root/opt/cross/i686-elf/lib/ -isystem /root/opt/cross/i686-elf/include -isystem /root/opt/cross/i686-elf/sys-include
checking for suffix of object files… configure: error: in /root/src/build-gcc/i686-elf/libgcc':
configure: error: cannot compute suffix of object files: cannot compile
See
config.log’ for more details.

config.logを調べたところ “libisl.so.15″っていうのが足りなかったらしい

configure:3462: /root/src/build-gcc/./gcc/xgcc -B/root/src/build-gcc/./gcc/ -B/root/opt/cross/i686-elf/bin/ -B/root/opt/cross/i686-elf/lib/ -isystem /root/opt/cross/i686-elf/include -isystem /root/opt/cross/i686-elf/sys-include -o conftest -g -O2 conftest.c >&5
/root/src/build-gcc/./gcc/cc1: error while loading shared libraries: libisl.so.15: cannot open shared object file: No such file or directory

とりあえず、これが存在するのかを調べてみる。結論から言うとファイルは存在した。

# find / -name libisl.so.15 -print
/usr/local/lib/libisl.so.15

ライブラリが見えてない可能性があるので、以下を実行。

# export LD_LIBRARY_PATH=/usr/local/lib

再度以下のコマンドを実行したら成功した。よかった。。。

# make -j4 all-target-libgcc

8. make istallを実行する

# make install-gcc
# make install-target-libgcc
# cd ../

9. xorrisoをビルドする。

# tar xvf xorriso-1.4.6.tar.gz
# cd xorriso-1.4.6
# ./configure
# make
# make install

10. つぎにコマンドのパスを通す。
しかし、このまま再起動してしまうと消えてしまうため、/etc/profileに追加する。

11. 以下のコマンドを実行して正しく結果が帰ってきたら成功。

# i686-elf-gcc –version
i686-elf-gcc (GCC) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ちなみにこのコンパイラでは普通のCファイルをコンパイルすることができない。(#include<stdio.h>とか書いてたらそこでエラーになるハズ)
これはCやC++の実行環境には “ホスト環境” と “フリースタンディング環境” と呼ばれる概念があるためである。

“ホスト環境”
OSの制御下でプログラムが実行される環境で、Cの標準ライブラリやランタイムを使用することができ、プログラムにOSの機能の一部を組み込むことができる。

“フリースタンディング環境”
OSに依存しない開発環境。そのためCの標準ライブラリ等を使用できないため、自分で用意する必要がある。OSに依存しない開発ができるのでクロスコンパイラで開発する環境はこれ。

これで開発環境を整えることができた。
次回は32bitOSを作成して、文字を出力させるまでやっていこうと思う。

Leave a Reply

Your email address will not be published. Required fields are marked *