2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

自作OSをブラウザ上で動かしてみた。

Posted at

はじめに

この記事は自作OS Advent Calendar 2022の24日目の記事として書かれています。

低レイヤーや自作OSに興味をもっているcotoro89と申します。

今回、v86を使い私が自作しているOS(Mv6)をブラウザ上で動かしたので簡単にご紹介します。

ブラウザだけで自作OSを動かせれば、自作OSに興味を持った方が手軽に試せるのでは?というのが、今回取り組んだ背景です。

もしも要望があれば、どこかで動作するイメージを公開したいと思います。

動作イメージ

まずは具体的な動きを動画でご覧ください。

ブラウザで該当URLにアクセスした後、BIOS起動、OS起動を経て、シェル上でpsコマンドを実行した結果(2つのプロセスを確認)までを録画したものです。キーボードやコンソールも再現されており、この範疇では非常にエミュレーション精度が高いように見えます。

boot.gif

利用の流れ

v86はWebAssemblyによるx86エミュレータです。このためWebAssemblyが実行できるWebブラウザ上でv86を動かすことで、Linuxといった32bit環境のOSを稼働させることができます。

利用までの大きな流れは以下の通りです。

  1. v86をビルドする。
  2. 起動させたいディスクイメージ(今回はfd image)をフォルダに配置する。
  3. htmlファイル(v86 apiを用いて自作OSの情報を渡す)を配置する。
  4. httpサーバーを起動させる。
  5. URL(http://localhost:8000)にブラウザでアクセスする。

たったこれだけで、自作OSをブラウザ上で動かせるのは大変手軽と言えると思えます。

html(osdev.html)

なお、利用したhtml(osdev.html)を参考までに掲載します。
非常に簡単なAPI記述でx86エミュレーションを利用できるため、他にも応用範囲が広いように思えます。

osdev.html
<!doctype html>
<title>Basic Emulator</title>

<script src="../build/libv86.js"></script>
<script>
        "use strict";

        window.onload = function()
        {
            var emulator = window.emulator = new V86Starter({
                    wasm_path: "../build/v86.wasm",
                    memory_size: 256 * 1024 * 1024,
                    vga_memory_size: 2 * 1024 * 1024,
                    screen_container: document.getElementById("screen_container"),
                    bios: {
                        url: "../bios/seabios.bin",
                    },
                    vga_bios: {
                        url: "../bios/vgabios.bin",
                    },
                    fda: {
                        url: "../images/fatfdimg.img",
                    },
                    autostart: true,
                    acpi: true,
             });
        }
</script>

<!-- A minimal structure for the ScreenAdapter defined in browser/screen.js -->
<div id="screen_container">
    <div style="white-space: pre; font: 14px monospace; line-height: 14px"></div>
    <canvas style="display: none"></canvas>
</div>

Mv6

私が以下のコンセプトで開発中のOSです。
安全性を高める上で、開発言語はC++(Better Cとして利用)です。

  • UNIX(v6) like OS
  • セキュアかつ安全性が高い(開発言語で安全性を担保)

実装状況

現在はユーザ空間でアプリを動かすための実装を進めています。

  • マルチタスク
  • マルチコア(LAPIC)
  • MMU(Kerne/User空間の分離)
  • シェル
  • ユーザ空間
  • ファイルシステム

その他

参考にさせていただいたOSは以下のとおりです。
xv6は少ないコード量でマルチコア対応からファイルシステム等まで実装しており、OSを自作する上でとても参考になりました。

  • hariboteOS(「30日でできる! OS自作入門」)
  • xv6
  • MikanOS(ゼロからの OS 自作入門)
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?