自作OS

30日OSのブートイメージをQemuのCUIで動かすnographicオプションの使い方

自作OSをCUIで動かしたい時に使うQemuのnographicオプションについてまとめます。

今回動かすバイナリは、30日OSの1日目で作成する、何もしないブートイメージです。

30日OSの書籍と異なる点として、30日OSを執筆された方の自作ツールではなく、汎用アセンブラのNASMを利用しています。
バイナリについては本記事では触れませんので、よければこちらをご覧いただければと思います。

プログラミングの基礎からはじめて、30日後にはウィンドウシステムを有する32bitマルチタスクOSをフルスクラッチで作り上げるという入門書。

QemuをCUIで動かす

結論から書きますが、以下のコマンドでブートイメージをQemuのCUI実行することができました。

qemu-system-x86_64 -drive file=boot.img,format=raw -nographic

おそらくこれがQemuのCUIでバイナリを実行する際のミニマムなオプションかと思います。

それぞれのオプションの意味は以下のとおりです。

-drive: 
    ファイルをドライブイメージとして使用するためのオプション
    必須の引数として、[file=file]をとる

    [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]
    [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]
    [,snapshot=on|off][,rerror=ignore|stop|report]
    [,werror=ignore|stop|report|enospc][,id=name][,aio=threads|native]
    [,readonly=on|off][,copy-on-read=on|off]
    [,discard=ignore|unmap][,detect-zeroes=on|off|unmap]
    [[,bps=b]|[[,bps_rd=r][,bps_wr=w]]]
    [[,iops=i]|[[,iops_rd=r][,iops_wr=w]]]
    [[,bps_max=bm]|[[,bps_rd_max=rm][,bps_wr_max=wm]]]
    [[,iops_max=im]|[[,iops_rd_max=irm][,iops_wr_max=iwm]]]
    [[,iops_size=is]]
    [[,group=g]]

-nographic:
    GUIを無効にして、シリアルI/Oをコンソールにリダイレクトする

上記のとおり、-driveオプションは、NASMで作成したブートイメージ(boot.img)をドライブイメージに指定するためのオプションです。

fileとformatは、この-driveオプションの引数になります。

-drive file=boot.img,format=raw

-driveオプションに必須の引数は[file=file]のみですが、今回はformat=rawの指定も入れています。
format=rawの指定がなくとも、CUIでQemuを起動することはできますが、次のような警告が出力されます。

WARNING:

Image format was not specified for '/haribote/boot.img' and probing guessed raw.
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be .
Specify the 'raw' format explicitly to remove the restrictions.

次に、-nographicオプションですが、これがCUIでQemuを起動するためのオプションです。
ヘルプに記載のとおり、シリアルI/O(デバイス間で通信されるデータ)をコンソールにリダイレクトしてくれます。

これを実行すると、画像のように、コンソール上でboot.imgが起動します。

QemuのCUI停止する

QemuのCUIが起動できたら、元のコンソールに戻ります。
コンソールに戻るには、次のコマンドを「連続して」入力します。

Ctrl + A
X

「Ctrl + A」を押したら、キーを離して「X」を入力してください。
これでQemuが停止します。

まとめ

CUIで起動テストできると、作業がちょっとスムーズになった気がします。
WSL上のDockerでそのまま動作確認ができるのがうれしい。

ちなみに上記の動作確認は以下のDockerイメージ上で行いました。
参考までに。

FROM python:3.8
ENV PYTHONUNBUFFERED 1

ENV TZ=Asia/Tokyo

RUN mkdir -p /haribote
ENV HOME=/haribote
WORKDIR $HOME

RUN useradd ubuntu
RUN dpkg --add-architecture i386
RUN apt update && apt upgrade -y

# デバッグ、開発用のツール
RUN apt install vim unzip zip gdb ltrace strace -y

# コンパイル用のツール
RUN apt install mtools nasm build-essential g++ make -y

# Qemu
RUN apt install qemu qemu-system-x86 qemu-utils qemu-system-arm -y

COMMENT

メールアドレスが公開されることはありません。