📘

QEMUで動かすXinu開発

2024/11/29に公開

最初に

この記事では、『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の対応関係は下記構造体で定義されます
https://github.com/yutaka-m/learning-xinu/blob/main/shell/shell.c#L10-L33

Shellコマンドのコードは下記に配置されてます
https://github.com/yutaka-m/learning-xinu/tree/main/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