📘
QEMUで動かすXinu開発
最初に
この記事では、『Xinuオペレーティングシステムデザイン 改訂2版』を読むにあたり、最初の一歩になる動作するビルド環境を作成することをサポートすることを目的としています
Xinuの公式ページから取得できる x86 version アーカイブを元にQEMUで動作しない部分をコメントアウトだけおこなった https://github.com/yutaka-m/learning-xinu を利用します
(Network周りをコメントアウトしただけなので、公式アーカイブを利用しても良いと思います)
XinuのShellを起動
Xinu OS の動作の雰囲気をつかむために、qemu-system-i386で起動する方法を記述します
途中の成果物として、ビルド環境の docker image xinu-qemu-system-i386 を作成しています
Mac
用意するツール
- git
- Docker Desktop
Xinu Shell
$ git clone git@github.com:yutaka-m/learning-xinu.git
$ cd learning-xinu
$ docker build -t xinu-qemu-system-i386 .
$ docker run -it xinu-qemu-system-i386 sh
$ qemu-system-i386 -m 16 -kernel build/compile/xinu.elf -nographic -append "console=ttyS0"
実行結果
➜ ~ git clone git@github.com:yutaka-m/learning-xinu.git
Cloning into 'learning-xinu'...
remote: Enumerating objects: 4473, done.
remote: Counting objects: 100% (686/686), done.
remote: Compressing objects: 100% (474/474), done.
remote: Total 4473 (delta 214), reused 674 (delta 210), pack-reused 3787 (from 1)
Receiving objects: 100% (4473/4473), 45.19 MiB | 9.26 MiB/s, done.
Resolving deltas: 100% (1910/1910), done.
➜ ~ cd learning-xinu
➜ learning-xinu git:(main) docker build -t xinu-qemu-system-i386 .
[+] Building 92.0s (14/14) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 463B 0.0s
=> [internal] load metadata for docker.io/i386/ubuntu:latest 1.8s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/9] FROM docker.io/i386/ubuntu:latest@sha256:3e6b4be46d13e13127671a6f2bb848aec9125d6a389d012b2469721b89073b94 0.0s
=> [internal] load build context 0.5s
=> => transferring context: 49.06MB 0.5s
=> CACHED [2/9] RUN apt-get update -qq 0.0s
=> CACHED [3/9] RUN apt-get install -y automake build-essential vim less git bison gawk flex wget curl qemu-system-i386 0.0s
=> CACHED [4/9] RUN mkdir -p /srv/tftp/ 0.0s
=> CACHED [5/9] RUN mkdir -p /build/ 0.0s
=> [6/9] COPY / /build/ 0.3s
=> [7/9] RUN apt purge -y texinfo gcc-7 7.1s
=> [8/9] RUN apt install -y gcc-4.8 && ln -sf /usr/bin/gcc-4.8 /usr/bin/gcc && hash -r 11.7s
=> [9/9] RUN cd /build/compile && make 70.4s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:dcda388ab35bad9b5c38cc86d055523e0ee70300f437947b9eea34565f36f38d 0.0s
=> => naming to docker.io/library/xinu-qemu-system-i386 0.0s
➜ learning-xinu git:(main) docker run -it xinu-qemu-system-i386 sh
WARNING: The requested image's platform (linux/386) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
# qemu-system-i386 -m 16 -kernel build/compile/xinu.elf -nographic -append "console=ttyS0"
Xinu for Vbox -- version #90 () Thu Nov 28 15:44:55 UTC 2024
4550648 bytes of free memory. Free list:
[0x00145000 to 0x0009FFF7]
[0x00100000 to 0x005FBFFF]
115177 bytes of Xinu code.
[0x00100000 to 0x0011C1E8]
148520 bytes of data.
[0x0011FEA0 to 0x001442C7]
------------------------------------------
__ __ _____ _ _ _ _
\ \ / / |__ __| | \ | | | | | |
\ \/ / | | | \| | | | | |
/ /\ \ _| |_ | \ | | | | |
/ / \ \ | | | | \ | \ -- /
-- -- ----- - - ----
------------------------------------------
Welcome to Xinu!
xsh $
Windows
用意するツール
- wsl Ubuntu 24.04
- git
- Docker
Xinu Shell
$ git clone https://github.com/yutaka-m/learning-xinu.git
$ cd learning-xinu/
$ sudo docker build -t xinu-qemu-system-i386 .
$ sudo docker run -it xinu-qemu-system-i386 sh
$ qemu-system-i386 -m 16 -kernel build/compile/xinu.elf -nographic -append "console=ttyS0"
実行結果
yutaka-m@DESKTOP-OJKPE1K:~/learning-xinu$ sudo docker run -it xinu-qemu-system-i386 sh
# qemu-system-i386 -m 16 -kernel build/compile/xinu.elf -nographic -append "console=ttyS0"
Xinu for Vbox -- version #90 () Sun Nov 24 15:50:47 UTC 2024
4550648 bytes of free memory. Free list:
[0x00145000 to 0x0009FFF7]
[0x00100000 to 0x005FBFFF]
115177 bytes of Xinu code.
[0x00100000 to 0x0011C1E8]
148520 bytes of data.
[0x0011FEA0 to 0x001442C7]
------------------------------------------
__ __ _____ _ _ _ _
\ \ / / |__ __| | \ | | | | | |
\ \/ / | | | \| | | | | |
/ /\ \ _| |_ | \ | | | | |
/ / \ \ | | | | \ | \ -- /
-- -- ----- - - ----
------------------------------------------
Welcome to Xinu!
xsh $
XinuのShellコマンドを実行
とても重要なことなので先に書きます
Shellを抜ける時は、 Ctrl + a , c で終了できます
Shellコマンドとmethodの対応関係は下記構造体で定義されます
Shellコマンドのコードは下記に配置されてます
実行例
xsh $ echo hoge
hoge
xsh $ sleep 2
xsh $
xsh $ uptime
Xinu has been up 54 second(s)
Xinuをビルド
xinu.elfをビルドする方法は、とてもシンプルです
先に作成した、ビルド環境の docker image xinu-qemu-system-i386 を起動してビルドします
$ sudo docker run -it xinu-qemu-system-i386 sh
$ cd /build/compile
$ make
$ qemu-system-i386 -m 16 -kernel xinu.elf -nographic -append "console=ttyS0"
実行例
# cd /build/compile
# make
Rebuilding the .defs file
Loading object files to produce GRUB bootable xinu
Copying xinu.elf to xinu.boot in the TFTP directory.
# ls -la xinu.elf
-rwxr-xr-x 1 root root 158852 Nov 28 16:50 xinu.elf
# date
Thu Nov 28 16:50:45 UTC 2024
# qemu-system-i386 -m 16 -kernel xinu.elf -nographic -append "console=ttyS0"
おわりに
Xinu のShell起動方法とコマンド実行例、ビルド方法を記述しました
応用すれば、動かしながらコードの変更をおためしできると思います
引き続きXinuをお楽しみください!
Discussion