Educational Operating System

Overview

MikanOS

MikanOS はレガシーフリーなアーキテクチャ(UEFI BIOS、Intel 64 モード)で動作する教育用オペレーティングシステムです。

ファイル構成

  • MikanLoaderPkg
    • UEFI アプリとして構成したブートローダ
  • kernel
    • MikanOS のカーネル
  • resource/nihongo.ttf
    • IPA ゴシックのフォントファイル
  • IPA_Font_License_Agreement_v1.0.txt
    • IPA フォントのライセンス文書

教科書

MikanOS の作り方を説明した教科書があります。 ゼロからのOS自作入門

スクリーンショット

「ゼロからのOS自作入門」の最終章を終えたときの姿 30章後の姿

開発への参加

MikanOS への機能追加、バグ修正の提案は Pull Request にてお願いします。

実装が伴わない「単なる要望」は基本的に受け付けません。 実装をきちんと作ってから Pull Request を提出してください。

もし、実装したいけど力が不足して実装できない、という場合はお気軽に Issues でご連絡ください。 実装ができるようになるように、できるだけご協力いたします。

Comments
  • Panther PointチップセットにおけるxHCIサポート

    Panther PointチップセットにおけるxHCIサポート

    MikanOSのUSBドライバは現時点でUSBハブに対応していない。

    物理端子としてルートハブポートが露出している機種ならうまく動くが,そうでない機種もあるようだ。 例えばAcer Aspire E1-572-A54Dという機種はxHCIを積んでいるが,ルートハブポートは直接は露出しておらず, ノートパソコン内蔵のUSBハブを経由する構造になってしまっている。

    そのような機種でMikanOSを使うためにはUSBハブに対応する必要がある。

    enhancement 
    opened by uchan-nos 21
  • ExitBootServicesの仕様による問題

    ExitBootServicesの仕様による問題

    小さい問題ですが、ExitBootServicesのあとはSystemTable->ConOutがNULLになるっぽいです。(原文:On success, several fields of the EFI System Table should be set to NULL. These include ConsoleInHandle, ConIn, ConsoleOutHandle, ConOut, StandardErrorHandle, StdErr, and BootServicesTable. 221ページ 4行目) そのため https://github.com/uchan-nos/mikanos/blob/59251b6d0eb76f6e21b164cae91eb28cdad55a8e/MikanLoaderPkg/Main.c#L434 の部分のPrintは表示されません。 ExitBootServicesより先に実行させたほうがいいかと思われます。

    bug 
    opened by HonokaNo 8
  • 簡易テキストエディタを追加

    簡易テキストエディタを追加

    簡易テキストエディタアプリケーション tedit を追加します。

    • 編集するファイル名をコマンドラインで指定して起動する
      • ファイル名を指定しなくても起動はできるが、保存はできなくなる
    • Ctrl+S で上書き保存
    • 編集後保存せずに閉じようとすると、確認ダイアログを表示する
      • マウス左クリックまたはAlt+(選択肢の頭文字)で選択

    (例えば)以下には対応していません。

    • 別名保存
    • テキストのコピペ
    • 検索・置換
    • 横スクロール
    opened by mikecat 6
  • fwriteで作成したある程度の大きさのファイルをcatすると止まる

    fwriteで作成したある程度の大きさのファイルをcatすると止まる

    std::vector でメモリを確保して fwrite でファイルに出力するアプリケーションを作りました。

    https://github.com/mikecat/mikanos/blob/a3bd848bd27b9be017a028e15b29040ab89fa757/apps/fwrite/fwrite.cpp

    これである程度の大きさのファイルを作り、その内容をcatで出力しようとすると、動作が止まりました。

    mikanos-fwrite-cat-fail-20220729

    opened by mikecat 5
  • 機能追加:ブートメニューを追加

    機能追加:ブートメニューを追加

    この機能によるメリット

    UEFIで遊ぶ余地ができる他、ブートプロセスで行っているメモリマップ取得をブートメニュー上に移植を行えば、メモリマップ取得を任意で行うことができるようになる可能性。RuntimeServiceの機能を使えば、そこからシャットダウン、再起動を行うことができる可能性が出て来ると考えています。

    詳細

    機能

    現在MikanOSブートメニューとUEFIのサポート情報などを表示する画面を実装してあります。対応する数字のキーを押すことでメニューの機能が実行されます。

    ロゴに関して

    ジェネレーターなどを使うとライセンスなどの影響が出ることを考慮し、テキストエディタで自作しました。

    右下の余白に関して

    ここにはMikanOSのアイコンなどを作成し、おけると思い隙間を作っております。

    watchdogタイマの無効化

    bootmenuを表示する関数内で無効化を行っています。

    opened by No000 5
  • 長さがわかっているデータの出力にPrintToFD関数を使わないようにする

    長さがわかっているデータの出力にPrintToFD関数を使わないようにする

    fix #39

    以下のコマンドにおいて、長さがわかっているデータの出力に PrintToFD 関数を使わないようにします。

    • cat
    • usbtest

    これにより、以下の効果が得られます。

    • PrintToFD 関数の脆弱性 (vsprintf 関数によるバッファオーバーラン) の影響を受けず、長いデータを出力できる
    • 0x00 のバイトを含むデータでも出力できる
    opened by mikecat 4
  • マンデルブロ集合描画アプリの追加

    マンデルブロ集合描画アプリの追加

    マンデルブロ集合描画アプリ mandel

    mandel コマンドでマンデルブロ集合が描画されたウィンドウを表示するだけのアプリです。

    マンデルブロ集合は、計算の規則自体はシンプルであるにも関わらず視覚的に楽しい数学的対象の一例です。そのため、本アプリは規模としては小さいながらもシンプルに美しいという良さがあります。

    また、このアプリは「ゼロからのOS自作入門」における22章終了時点までのMikanOSの機能で動作します。同書籍の学習者が学習中に自作アプリを作るときのヒントになる可能性もあります。

    mandel アプリのスクリーンショット

    opened by PickledChair 3
  • replace github-fork-progress.png

    replace github-fork-progress.png

    how-to-send-pull-request.mdに下記の記載がありましたので、プルリクで画像をお送りいたします。 画像サイズはスクリーンショットのままですので、適宜、変更いただければと思います。

    「どなたか、mikanos リポジトリに関して本記事の手順を実行し、スクリーンショットを提供していただけませんか?」

    opened by sudabon 3
  • タイポの修正、ログ文言の修正、エラーコードの並び順誤りの修正、printf-like関数の呼び出し誤りの修正

    タイポの修正、ログ文言の修正、エラーコードの並び順誤りの修正、printf-like関数の呼び出し誤りの修正

    表題の通り、細かな修正を含んでいます。 それぞれ個別の pull req を作成した方が良いということでしたら分割しますのでお申し付けください。

    printf-like 関数については、 __attribute__((format(printf, ..))) によりコンパイル時に誤りを検出できるようにしています。 非標準機能ですが本書では clang/clang++ 8+ を利用することを前提としているため利用して問題ないと考えました。

    opened by gifnksm 3
  • day03_b での FreePool におけるimplicit declaration error

    day03_b での FreePool におけるimplicit declaration error

    実行環境

    • Ubuntu 20.04

    生じた問題

    day03_b の写経をしていたところ、ビルドしたときに

    /home/yudai/edk2/MikanLoaderPkg/Main.c:150:3: error: implicit declaration of function 'FreePool' is i
    nvalid in C99 [-Werror,-Wimplicit-function-declaration]                                              
      FreePool(gop_handles);                                                                             
      ^                                                                                                  
    1 error generated.    
    

    というエラーが生じてビルドできませんでした。これはosbook_day03_b タグの Main.c 内の

    https://github.com/uchan-nos/mikanos/blob/3d021f27e474ceb1d3f15b0185955b5d67ff7be0/MikanLoaderPkg/Main.c#L131

    で生じていました。

    解決方法

    とりあえず、私の環境では該当部分を

    gBS->FreePool(gop_handles);
    

    に変更したことでビルドは通り、QEMU で実行したときの挙動も書籍のようになったのですが、この対処法は正しいでしょうか?

    opened by Hayashi-Yudai 3
  • tviewをLLVM 10でビルドするとページフォルトが発生する

    tviewをLLVM 10でビルドするとページフォルトが発生する

    MikanOSのビルドはLLVM 7(llvm-7, lld-7, clang-7)で動作確認しているが, ふとした思いでtviewアプリをLLVM 10でビルドしたらカーネル側でページフォルトが起きることが分かった。

    カーネルをLLVM 7,tviewをLLVM 10でビルドし,QEMUで起動させ,tview jpn.txt を実行するとページフォルトが発生する。例外時の RIP は 0x14efb4 であった。その周辺の逆アセンブル結果は次。

      14efac:       4c 8b 6e 70             mov    r13,QWORD PTR [rsi+0x70]
      14efb0:       4c 8b 76 78             mov    r14,QWORD PTR [rsi+0x78]
      14efb4:       48 0f c3 47 40          movnti QWORD PTR [rdi+0x40],rax
      14efb9:       4c 0f c3 47 48          movnti QWORD PTR [rdi+0x48],r8
      14efbe:       4c 0f c3 4f 50          movnti QWORD PTR [rdi+0x50],r9
    

    例外が起きたのは movnti 命令。例外が起きたときのスクリーンショットは下図。

    Screenshot from 2020-11-18 09-49-43

    bug 
    opened by uchan-nos 3
  • Port::Reset() の実行時にレジスタ port_reset_change をクリアする

    Port::Reset() の実行時にレジスタ port_reset_change をクリアする

    Bmax B2S での検証において、port_reset_change が1の状態で ResetPort() を実行すると、 PortStatusChangeEvent が発生せず、初期化プロセスが止まってしまうことがありました。 この事象が発生すると、addressing_port による制御の影響で他のデバイスの初期化もできなくなってしまいます。

    そこで、Port::Reset() において port_reset_change もクリアすることで、 PortStatusChangeEvent が発生するようにし、この事象を回避するようにしました。

    修正前 (事象の影響でUSBの初期化が止まり、挿している起動用のUSBメモリを認識できていない)

    Screenshot 2022-09-23 01-18-37

    修正後 (事象を回避し、起動用のUSBメモリを認識できている)

    Screenshot 2022-09-23 01-19-59

    opened by mikecat 0
  • 新規ファイルの作成時に当該ファイルのDirectoryEntryをゼロクリアする

    新規ファイルの作成時に当該ファイルのDirectoryEntryをゼロクリアする

    実機での動作検証において、新しいファイルに書き込む際に #PF が出て動作が止まる現象が発生しました。

    Screenshot 2022-09-19 15-05-48

    検証の結果、この時クラスタ 0xffff0000 に書き込もうとしていることがわかりました。 これは、削除済みエントリに first_cluster_high に 0xffff が書き込まれているものが存在し、これを初期化せずに利用するため FirstCluster() の上位が 0xffff になることが原因であると考えられます。

    mikanos-directory-20220920

    よって、ファイルの作成時に確保したディレクトリエントリをゼロクリアすることで、意図しないクラスタに書き込まないようにします。

    opened by mikecat 0
  • USB CDCの挙動の改善

    USB CDCの挙動の改善

    USB CDCの挙動を改善し、 usbtest コマンドで公式のArduino UNOのUSB-シリアル変換を通じたシリアル通信ができるようにします。

    通信相手 (Arduino) のスケッチ
    void setup() {
      pinMode(13, OUTPUT);
      digitalWrite(13, LOW);
      Serial.begin(9600);
    }
    
    bool isHigh = false;
    
    void loop() {
      int c = Serial.read();
      if (c >= 0) {
        Serial.write((c + 1) % 256);
        isHigh = !isHigh;
        digitalWrite(13, isHigh ? HIGH : LOW);
      }
    }
    
    • ~~ConfigurationDescriptorReader::Next() が次のディスクリプタではなく今のディスクリプタを返すようにします。~~
      • ~~変更前は、コンフィグレーションディスクリプタが読み飛ばされていました。~~
        ~~ここにはインターフェイスディスクリプタの個数などがあり、将来役立つかもしれません。~~
    • 3引数の NewClassDriver() において、エンドポイントディスクリプタのみをエンドポイントとして数えるようにします。
      • ファンクショナルディスクリプタを数えないようにし、エンドポイントディスクリプタを規定数読み込んでからループを抜けるようにします。
        確実にエンドポイントの情報を得られるようになり、またファンクショナルディスクリプタの情報も得られるようになります。
    • CDCDriver::SetLineCoding() において、 if_data ではなく if_comminterface_number を用いるようにします。
      • Bmax B2Sと公式のArduino UNOの組み合わせにおいて、 setup_data.index1 を入れるとStall Errorとなってしまいましたが、 0 を入れるとうまく動きそうでした。
        if_comminterface_number0 で辻褄が合うので、採用しました。
        本当に適切かはわかりません。
    • 初期化時に通信設定を取得し、ボーレートが0の場合は適当に設定を行うようにします。
      • 初期状態ではシリアル通信が動作しませんでしたが、 setbaud コマンドを実行すると動作するようになりました。
        パケットキャプチャの結果を見ると、最初はGET LINE CODINGの結果が全て0となっていました。
        そこで、初期化時に通信設定を取得し、ボーレートが0の場合は設定を行うようにすることで、明示的に setbaud コマンドを実行しなくても9600bpsで通信できるようにしました。
    • 受信を送信とは独立に行い、受信完了時に次の受信を行うようにします。
      • 変更前は、送信時に受信も1回行うようになっていました。
        送信しないと受信できないというのは不自然だと考え、MikanOSがHIDではどのように受信しているのかを調べたところ、受信完了時に次の受信を行っているようでした。
        そこで、CDCでも同様に受信完了時に次の受信を行うようにしました。
    • usbtest コマンドが、送信した長さ分受信するまで受信するようにします。
      • 受信完了のログを出力するとうまく動くようでしたが、ログを出力しないと数文字しか受信できませんでした。
        これは、変更前の usbtest コマンドは正の長さのデータを1回受信できたら受信を打ち切る仕様になっているためであると考えられます。
        さらに、次の usbtest コマンドの実行時に前の usbtest コマンドで受信したかったデータが読み込まれ、不自然な挙動となりました。
        そこで、送信した長さ分受信するまで受信する仕様にすることで、これを改善しました。
    opened by mikecat 3
  • アプリケーションの終了に SyscallExit() ではなく exit() を使う

    アプリケーションの終了に SyscallExit() ではなく exit() を使う

    この修正前は、以下の問題が発生していました。

    • hex2bin において、6バイトのファイルの16進ダンプが出力されない
    • hex2bin において、 61 62 63 をバイナリに変換した結果が0バイトになる
    • cp において、NIGHT.BMP が最後までコピーできない
    • grepsortmore において、改行文字が無い1行のファイルを入力すると結果が出力されない

    これらは、最後に改行を出力しないため、内部のバッファに入ったままのデータを出力しないままアプリケーションが終了してしまうためであると考えられます。 main() 関数から戻った後、 SyscallExit() のかわりに exit() を用いて終了することで、改善するようです。

    opened by mikecat 0
Releases(v1.0)
  • v1.0(Aug 18, 2022)

    長らく v1.0 のリリースを放置していましたが、細かいバグが修正され、簡易テキストエディタが導入されたのを期にリリースしました。

    OS という性質上、バージョン番号は敢えて Semantic Versioning を採用していません。 バージョン番号の上げ方は、当面は感覚的に上げていくつもりです。

    mikanos_otegaru_pack-v1.0.zip は MikanOS お手軽パック v1.0 です。MikanOS の開発環境を用意することなしに Windows 上で MikanOS v1.0 を試せます。開発環境の用意が面倒だけど MikanOS を試しに使ってみたいという方は是非ご利用ください。

    Source code(tar.gz)
    Source code(zip)
    mikanos_distrib-v1.0.tar.gz(15.54 MB)
    mikanos_otegaru_pack-v1.0.zip(53.57 MB)
  • v1.0rc5(Oct 28, 2020)

    Intel Panther Pointチップセット(2012年リリース)に搭載されているUSBホストコントローラーに対応しました。 このチップセットにはEHCIとxHCIの2つのUSBホストコントローラーが搭載されており,初期化時にEHCIからxHCIへの切り替え処理をしないとEHCIモードでの動作となります。 今回のリリースでxHCIへの切り替え処理を追加したため,当時の機種でUSBマウスとキーボードが動作するようになります。

    mikanos_distrib-v1.0rc5.tar.gz をダウンロードして展開すると,MikanOS を試すのに必要なファイル群と USB メモリへのインストールスクリプトが手に入ります。

    Source code(tar.gz)
    Source code(zip)
    mikanos_distrib-v1.0rc5.tar.gz(14.83 MB)
  • v1.0rc4(Aug 8, 2020)

  • v1.0rc3(May 6, 2020)

    • USBドライバ用メモリプールの容量を1MiBに増加させました。(元は128KiB)
    • USBドライバ用のメモリプールの確保をカーネル本体のメモリマネージャを使うようにしました。

    -logdebug バージョンはデバッグメッセージを多めに出す用にしてあります。 USB ドライバ等が上手く動かないときに参考になる可能性があります。

    Source code(tar.gz)
    Source code(zip)
    mikanos_distrib-v1.0rc3-logdebug.tar.gz(14.83 MB)
    mikanos_distrib-v1.0rc3.tar.gz(14.83 MB)
  • v1.0rc2(Apr 30, 2020)

  • v1.0-rc1(Apr 30, 2020)

    MikanOS 1.0 リリースに向けた候補バージョンのリリースです。

    mikanos_distrib-v1.0rc1.tar.gz として,手軽に試せるビルド済みファイルを作ってみました。 ダウンロードして展開すると,MikanOS を試すのに必要なファイル群と USB メモリへのインストールスクリプトが手に入ります。

    Source code(tar.gz)
    Source code(zip)
    mikanos_distrib-v1.0rc1.tar.gz(7.30 MB)
  • osbook_day24a(Feb 15, 2020)

  • debugging-low-layer(Jan 6, 2020)

    OS自作技術ステップアップ問題集の付録向けリリースです。ディスクイメージmikanos.imgは適宜最新版に差し替えて起動可能です。

    起動方法

    $ qemu-system-x86_64 -m 1G \
        -drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
        -drive if=pflash,format=raw,file=OVMF_VARS.fd \
        -drive if=ide,index=0,media=disk,format=raw,file=mikanos.img \
        -device nec-usb-xhci,id=xhci -device usb-mouse -device usb-kbd
    

    OVMF_CODE.fd と OVMF_VARS.fd は APT で ovmf パッケージをインストールすると /usr/share/OVMF 以下に配置されます。OVMF_VARS.fd は書き込み権限が必要ですからコピーしてから使います。

    $ sudo apt install ovmf
    $ cp /usr/share/OVMF/OVMF_VARS.fd ./
    $ qemu-system-x86_64 -m 1G ...
    

    もちろん EDK II を使って自分でビルドした OVMF を使っても大丈夫です。

    Source code(tar.gz)
    Source code(zip)
    mikanos.img(80.00 MB)
    screenshot.png(10.95 KB)
Owner
Kota UCHIDA
Cybozu Labs, Inc. / Hobby OS developer
Kota UCHIDA
An operating system, but it only plays Tetris.

TETRIS-OS: An operating system that only plays Tetris. Video with an explanation of the development process. Features: It's Tetris. 32-bit (x86) Fully

null 3.5k Jul 13, 2021
Step by step, learn to develop an operating system on RISC-V

This course is used to teach and demonstrate how to write a simple operating system kernel for the RISC-V platform from scratch.

null 353 Nov 22, 2022
A unix operating system written from scratch in c++

A unix operating system made from scratch using c++

pranaOS 141 Oct 14, 2022
Tutorial: Writing a "bare metal" operating system for Raspberry Pi 4

Tutorial: Writing a "bare metal" operating system for Raspberry Pi 4

Adam Greenwood-Byrne 2.5k Nov 24, 2022
This repository is a summary of the basic knowledge of recruiting job seekers and beginners in the direction of C/C++ technology, including language, program library, data structure, algorithm, system, network, link loading library, interview experience, recruitment, recommendation, etc.

?? C/C++ 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。This repository is a summary of the basic knowledge of recruiting job seekers and beginners in the direction of C/C++ technology, including language, program library, data structure, algorithm, system, network, link loading library, interview experience, recruitment, recommendation, etc.

huihut 26.6k Nov 17, 2022
System Programming 2021 Spring

sp-labs System Programming Labs 2021 Spring Repo 文件说明 lab: 实验指导书 & 题目。 answer_template: 提供对应 lab 的参考作答模板。建议将图片放至对应的img/文件夹下,使用 Markdown 编写,最后通过 Typora

null 42 Nov 18, 2022
Background Music, a macOS audio utility: automatically pause your music, set individual apps' volumes and record system audio.

Background Music macOS audio utility Overview Auto-pause music Application volume Recording system audio Download Build and Install Uninstall Troubles

Kyle Neideck 12.5k Nov 21, 2022
Hello, I created a real banking system with creating each customer a private file.

bankingsystem Hello, I created a real banking system for my school project with creating each customer a private file. Your Transaction Code is your l

Byrsh 2 Dec 21, 2021
Unox is an educational unix-like operating system. #JustForFun

Unox Unox is a x86_64 unix-like operating system written in c and assembly for learn about operating systems. Roadmap Write bootloader and linker Writ

Hasan Kashi 21 Sep 4, 2022
KePOS is a 64-bit operating system. Design and implement your own operating system

KePOS is a 64-bit operating system. The purpose of this system is to combine the theoretical knowledge and practice of the operating system, and to deepen the understanding of the operating system.

null 65 Nov 9, 2022
GCC/gcov code coverage data extraction from the actual embedded system, without requiring a file system, or an operating system, or standard C libraries.

GCC/gcov code coverage data extraction from the actual embedded system, without requiring a file system, or an operating system, or standard C libraries.

NASA Jet Propulsion Laboratory 98 Nov 18, 2022
Dining philosophers problem is a problem created by Edsger Wybe Dijkstra in 1965 to explain the deadlock state of an operating system, which is traditionally commonly introduced in lectures on operating systems

42-philosophers Dining philosophers problem is a problem created by Edsger Wybe Dijkstra in 1965 to explain the deadlock state of an operating system,

Lavrenova Maria 30 Nov 7, 2022
Operating system project - implementing scheduling algorithms and some system calls for XV6 OS

About XV6 xv6 is a modern reimplementation of Sixth Edition Unix in ANSI C for multiprocessor x86 and RISC-V systems.

Amirhossein Rajabpour 22 Oct 24, 2022
Operating system project - implementing scheduling algorithms and some system calls for XV6 OS

About XV6 xv6 is a modern reimplementation of Sixth Edition Unix in ANSI C for multiprocessor x86 and RISC-V systems. It was created for pedagogical p

Amirhossein Rajabpour 22 Oct 24, 2022
Implementation of System V shared memory (a type of inter process communication) in xv6 operating system.

NOTE: we have stopped maintaining the x86 version of xv6, and switched our efforts to the RISC-V version (https://github.com/mit-pdos/xv6-riscv.git)

Viraj Jadhav 5 Feb 21, 2022
Hobbyist Operating System targeting x86_64 systems. Includes userspace, Virtual File System, An InitFS (tarfs), Lua port, easy porting, a decent LibC and LibM, and a shell that supports: piping, file redirection, and more.

SynnixOS Epic Hobby OS targeting x86_64 CPUs, it includes some hacked together functionality for most essential OSs although, with interactivity via Q

RaidTheWeb 42 Oct 28, 2022
Minimal Linux Live (MLL) is a tiny educational Linux distribution, which is designed to be built from scratch by using a collection of automated shell scripts. Minimal Linux Live offers a core environment with just the Linux kernel, GNU C library, and Busybox userland utilities.

Minimal Linux Live (MLL) is a tiny educational Linux distribution, which is designed to be built from scratch by using a collection of automated shell scripts. Minimal Linux Live offers a core environment with just the Linux kernel, GNU C library, and Busybox userland utilities.

John Davidson 1.3k Nov 11, 2022
Collection of various algorithms in mathematics, machine learning, computer science, physics, etc implemented in C for educational purposes.

The Algorithms - C # {#mainpage} Overview The repository is a collection of open-source implementation of a variety of algorithms implemented in C and

The Algorithms 15k Nov 25, 2022
Custom WebSocket implementation in C for educational and recreational purposes.

C WebSockets WARNING! The library is in an active development state and is not even alpha yet. Use it at your own risk. Nothing is documented, anythin

Tsoding 17 May 25, 2022