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 でご連絡ください。 実装ができるようになるように、できるだけご協力いたします。

Issues
  • 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
  • 機能追加:ブートメニューを追加

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

    この機能によるメリット

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

    詳細

    機能

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

    ロゴに関して

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

    右下の余白に関して

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

    watchdogタイマの無効化

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

    opened by No000 5
  • マンデルブロ集合描画アプリの追加

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

    マンデルブロ集合描画アプリ 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
  • p.73 ld.lld 実行時に、undefined symbol のエラーが出力され、リンクに失敗する

    p.73 ld.lld 実行時に、undefined symbol のエラーが出力され、リンクに失敗する

    p.73 に記載があるように、カーネルファイルを作るためにコンパイルとリンクを実行しようとしました。 コンパイルは通ったように見えました。 特に success/failed などの出力はなかったですが、ls コマンドで確認すると main.o ファイルは作成されていました。 ただ、その後の ld.lld を本に記載のある通りに実行したところ、以下のようなエラーが出力されました。 何かリンクをする前に実行しておくべきことなどありますでしょうか。

    [email protected]:~/mikanos/kernel$ git checkout osbook_day03a
    HEAD is now at 45a0269 call kernel
    [email protected]:~/mikanos/kernel$ ls
    2          console.o  font.o          hankaku.bin  kernel.elf  libcxx_support.o  main.o            newlib_support.o  segment.o  terminal.o  window.o
    acpi.o     fat.o      frame_buffer.o  hankaku.o    keyboard.o  logger.o          memory_manager.o  paging.o          syscall.o  timer.o
    asmfunc.o  file.o     graphics.o      interrupt.o  layer.o     main.cpp          mouse.o           pci.o             task.o     usb
    [email protected]:~/mikanos/kernel$ clang++ -o2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone -fno-exceptions -fno-rtti -std=c++17 -c main.cpp
    [email protected]:~/mikanos/kernel$ ld.lld --entry KernelMain -z norelro --image-base 0x100000 --static -o kernel.elf main.o
    ld.lld: error: undefined symbol: vsprintf
    >>> referenced by main.cpp:48
    >>>               main.o:(printk(char const*, ...))
    
    ld.lld: error: undefined symbol: console
    >>> referenced by main.cpp:51
    >>>               main.o:(printk(char const*, ...))
    
    ld.lld: error: undefined symbol: Console::PutString(char const*)
    >>> referenced by main.cpp:51
    >>>               main.o:(printk(char const*, ...))
    
    ld.lld: error: undefined symbol: screen_config
    >>> referenced by memory:4710 (/home/myadmin/osbook/devenv/x86_64-elf/include/c++/v1/memory:4710)
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: layer_manager
    >>> referenced by main.cpp:61
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: LayerManager::NewLayer()
    >>> referenced by main.cpp:61
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: Layer::SetWindow(std::__1::shared_ptr<Window> const&)
    >>> referenced by main.cpp:62
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: Layer::SetDraggable(bool)
    >>> referenced by main.cpp:63
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: Layer::Move(Vector2D<int>)
    >>> referenced by main.cpp:64
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: Layer::ID() const
    >>> referenced by main.cpp:65
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: std::__1::__shared_weak_count::__release_weak()
    >>> referenced by memory:3587 (/home/myadmin/osbook/devenv/x86_64-elf/include/c++/v1/memory:3587)
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: layer_manager
    >>> referenced by main.cpp:67
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: LayerManager::UpDown(unsigned int, int)
    >>> referenced by main.cpp:67
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: std::__1::__shared_weak_count::__release_weak()
    >>> referenced by memory:3587 (/home/myadmin/osbook/devenv/x86_64-elf/include/c++/v1/memory:3587)
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: std::__1::__shared_weak_count::__release_weak()
    >>> referenced by memory:3587 (/home/myadmin/osbook/devenv/x86_64-elf/include/c++/v1/memory:3587)
    >>>               main.o:(InitializeMainWindow())
    
    ld.lld: error: undefined symbol: screen_config
    >>> referenced by memory:4710 (/home/myadmin/osbook/devenv/x86_64-elf/include/c++/v1/memory:4710)
    >>>               main.o:(InitializeTextWindow())
    
    ld.lld: error: undefined symbol: ToplevelWindow::InnerSize() const
    >>> referenced by main.cpp:78
    >>>               main.o:(InitializeTextWindow())
    
    ld.lld: error: undefined symbol: DrawTextbox(PixelWriter&, Vector2D<int>, Vector2D<int>)
    >>> referenced by main.cpp:78
    >>>               main.o:(InitializeTextWindow())
    
    ld.lld: error: undefined symbol: layer_manager
    >>> referenced by main.cpp:80
    >>>               main.o:(InitializeTextWindow())
    
    ld.lld: error: undefined symbol: LayerManager::NewLayer()
    >>> referenced by main.cpp:80
    >>>               main.o:(InitializeTextWindow())
    
    ld.lld: error: too many errors emitted, stopping now (use -error-limit=0 to see all errors)
    
    opened by techvaderJP 2
  • usb::HIDMouseDriver::default_observerに関数ポインタを代入する箇所で止まる

    usb::HIDMouseDriver::default_observerに関数ポインタを代入する箇所で止まる

    osbook_day06c の以下の箇所で処理が止まってしまいます。この行の前後にログを仕込むと、直前のログは出ますが直後のログは出ません。

    https://github.com/uchan-nos/mikanos/blob/osbook_day06c/kernel/main.cpp#L179

    gdbで接続してみたところ、C++の標準ライブラリの中でエラーが出ているようでした。

    (gdb)
    181       Log(kInfo, "test1\n");
    (gdb)
    182       usb::HIDMouseDriver::default_observer = MouseObserver;
    (gdb) step
    std::__1::function<void (signed char, signed char)>::operator=<void (&)(signed char, signed char), void>(void (&)(signed char, signed char)) (this=<optimized out>,
        __f=<optimized out>) at main.cpp:182
    182       usb::HIDMouseDriver::default_observer = MouseObserver;
    (gdb)
    std::__1::function<void (signed char, signed char)>::function<void (*)(signed char, signed char), void>(void (*)(signed char, signed char)) (this=<optimized out>, __f=<optimized out>)
        at main.cpp:182
    182       usb::HIDMouseDriver::default_observer = MouseObserver;
    (gdb)
    std::__1::__function::__value_func<void (signed char, signed char)>::__value_func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)> >(void (*&&)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>) (
        this=<optimized out>, __f=<optimized out>, __a=...) at main.cpp:182
    182       usb::HIDMouseDriver::default_observer = MouseObserver;
    (gdb)
    std::__1::__function::__func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>, void (signed char, signed char)>::__func(void (*&&)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>&&) (
        this=<optimized out>, __a=..., __f=<optimized out>)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1596
    1596            : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
    (gdb)
    std::__1::__function::__alloc_func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>, void (signed char, signed char)>::__alloc_func(void (*&&)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>&&) (
        this=<optimized out>, __f=<optimized out>, __a=...)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1596
    1596            : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
    (gdb)
    std::__1::__compressed_pair<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)> >::__compressed_pair<void (*&&)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>&&> (__first_args=...,
        __second_args=..., this=<optimized out>, __pc=...)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1596
    1596            : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
    (gdb)
    std::__1::__compressed_pair_elem<void (*)(signed char, signed char), 0, false>::__compressed_pair_elem<void (*&&)(signed char, signed char), 0ul> (__args=..., this=<optimized out>)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/memory:2156
    2156          : __value_(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {}
    (gdb)
    std::__1::__function::__value_func<void (signed char, signed char)>::__value_func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)> >(void (*&&)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>) (
        this=0x1010e8 <vtable for std::__1::__function::__func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>, void (signed char, signed char)>+16>, __f=<optimized out>, __a=...)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1710
    1710                    __f_ =
    (gdb)
    std::__1::function<void (signed char, signed char)>::operator=<void (&)(signed char, signed char), void>(void (&)(signed char, signed char)) (this=<optimized out>,
        __f=<optimized out>)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:2329
    2329        function(_VSTD::forward<_Fp>(__f)).swap(*this);
    (gdb)
    std::__1::__function::__value_func<void (signed char, signed char)>::swap(std::__1::__function::__value_func<void (signed char, signed char)>&) (this=0x3fea87e0, __f=...)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1805
    1805            if (&__f == this)
    (gdb)
    1807            if ((void*)__f_ == &__buf_ && (void*)__f.__f_ == &__f.__buf_)
    (gdb)
    1824                __f_->__clone(__as_base(&__f.__buf_));
    (gdb)
    std::__1::__function::__func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>, void (signed char, signed char)>::__clone(std::__1::__function::__base<void (signed char, signed char)>*) const (this=0x3fea87e0,
        __p=0x135f80 <usb::HIDMouseDriver::default_observer>)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1626
    1626        ::new (__p) __func(__f_.__target(), __f_.__allocator());
    (gdb)
    std::__1::__function::__func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>, void (signed char, signed char)>::__func(void (* const&)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)> const&) (
        this=0x135f80 <usb::HIDMouseDriver::default_observer>,
        [email protected]: 0x1030c0 <MouseObserver(signed char, signed char)>, __a=...)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1588
    1588            : __f_(__f, __a) {}
    (gdb)
    std::__1::__function::__alloc_func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>, void (signed char, signed char)>::__alloc_func(void (* const&)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)> const&) (this=0x135f88 <usb::HIDMouseDriver::default_observer+8>,
        [email protected]: 0x1030c0 <MouseObserver(signed char, signed char)>, __a=...)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1588
    1588            : __f_(__f, __a) {}
    (gdb)
    std::__1::__compressed_pair<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)> >::__compressed_pair<void (* const&)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)> const&> (
        this=0x135f88 <usb::HIDMouseDriver::default_observer+8>, __first_args=...,
        __second_args=..., __pc=...)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1588
    1588            : __f_(__f, __a) {}
    (gdb)
    std::__1::__compressed_pair_elem<void (*)(signed char, signed char), 0, false>::__compressed_pair_elem<void (* const&)(signed char, signed char), 0ul> (
        this=0x135f88 <usb::HIDMouseDriver::default_observer+8>, __args=...)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/memory:2156
    2156          : __value_(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {}
    (gdb)
    std::__1::__function::__func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>, void (signed char, signed char)>::__clone(std::__1::__function::__base<void (signed char, signed char)>*) const (this=0x3fea87e0,
        __p=0x135f80 <usb::HIDMouseDriver::default_observer>)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1627
    1627    }
    (gdb)
    std::__1::__function::__value_func<void (signed char, signed char)>::swap(std::__1::__function::__value_func<void (signed char, signed char)>&) (this=0x3fea87e0, __f=...)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1825
    1825                __f_->destroy();
    (gdb)
    std::__1::__function::__func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>, void (signed char, signed char)>::destroy() (this=0x3fea87e0)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1634
    1634    }
    (gdb)
    std::__1::__function::__value_func<void (signed char, signed char)>::swap(std::__1::__function::__value_func<void (signed char, signed char)>&) (this=0x3fea87e0, __f=...)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1826
    1826                __f_ = __f.__f_;
    (gdb)
    2341    }
    (gdb)
    std::__1::function<void (signed char, signed char)>::operator=<void (&)(signed char, signed char), void>(void (&)(signed char, signed char)) (this=<optimized out>,
        __f=<optimized out>)
        at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:2329
    2329        function(_VSTD::forward<_Fp>(__f)).swap(*this);
    (gdb)
    std::__1::function<void (signed char, signed char)>::~function() (
        this=0x1010e8 <vtable for std::__1::__function::__func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>, void (signed char, signed char)>+16>) at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:2329
    2329        function(_VSTD::forward<_Fp>(__f)).swap(*this);
    (gdb)
    std::__1::__function::__value_func<void (signed char, signed char)>::~__value_func() (
        this=0x1010e8 <vtable for std::__1::__function::__func<void (*)(signed char, signed char), std::__1::allocator<void (*)(signed char, signed char)>, void (signed char, signed char)>+16>) at /home/ubuntu/osbook/devenv/x86_64-elf/include/c++/v1/functional:1757
    1757            if ((void*)__f_ == &__buf_)
    (gdb)
    1759            else if (__f_)
    (gdb)
    1760                __f_->destroy_deallocate();
    (gdb)
    
    
    
    
    
    
    ^C
    Program received signal SIGINT, Interrupt.
    0x000000003fb73016 in ?? ()
    

    考えられる原因はありますでしょうか?

    環境はwsl2のUbuntu 18.0.4で、llvmなどの環境はmikanos-buildのAnsibleでインストールしたものです。

    opened by edvakf 2
  • ピクセル描画について

    ピクセル描画について

    第4章のピクセル描画とmaka入門のp.102からp.106にあるプログラムについて質問です。 p.100のプログラムは実行と起動が問題なくできましたがp.102からp.106の部分がエラーが起きて実行できません。 具体的にいうと makeとコンソールで入力すると ld.lld: error: duplicate symbol: KernelMain

    defined at main.cpp:68 main.o:(KernelMain) defined at asmfunc.asm asmfunc.o:(.text+0x7C) make: *** [Makefile:27: kernel.elf] エラー 1 とでます。 多分僕の知識不足だと思いますがどうしたら実行できますか? ,

    opened by sz-shers 1
  • [day15b] OS起動後にTaskBWindowが一瞬表示されすぐ消える

    [day15b] OS起動後にTaskBWindowが一瞬表示されすぐ消える

    main.cppにてInitializeTaskBWindow()をした後、Activateしているが、この段階ではInitializeMouse()が実行されていない。(mouse_layer_は 0 ) layer.cppのActivate()の以下の行で > manager_.UpDown(active_layer_, manager_.GetHeight(mouse_layer_) - 1); 第二引数にmouse_layer_を使用しているが、値がゼロのためTaskBWindowレイヤーの高さがマイナス値になってしまい、ウィンドウが非表示になっています。 解決策として、上記の一行をInitializeMouse();の下に移動すれば、TaskBWindowが消えなくなります。

    opened by ponochi 0
  • 将来的にメモリが保護されない恐れがある

    将来的にメモリが保護されない恐れがある

    • 問題点 kUEFIPageSize が kBytesPerFrame よりも細分化されていた場合、 プロセスに対して割り当てるべきでないメモリ領域が割り当てられる可能性がある。 ただし現状、両者の定数は同じ値が指定されているのでここで指摘する問題は起こらない。

    より具体的な状況として、1つの frame の中に 使用可能な page と不可能な page が混在している場合に frame 全体が使用可能なメモリ領域として扱われる可能性がある。

    opened by ndifix 2
  • ACPI PM Timerが無い機種のためにHPETに対応する

    ACPI PM Timerが無い機種のためにHPETに対応する

    GPD Micro PC の一部機種には ACPI PM Timer が搭載されていないようだ。 聞くところによると Microsoft Surface の一部機種でもそういうものがある。

    参考: GPD Micro PCでMikanOSが起動しない

    そのような機種に対応するために HPET にも対応し、HPET があれば ACPI PM Timer より優先して使うようにしたい。 HPET を優先する理由は ACPI 仕様書に次のようにあるから。

    If the HPET is exposed to OSPM, OSPM should use the HPET. Otherwise, OSPM will use the ACPI power management timer.

    Table 5-34 Fixed ACPI Description Table Fixed Feature Flags の USE_PLATFORM_CLOCK ビットに関する説明より。

    enhancement 
    opened by uchan-nos 0
  • USBドライバが動かない環境について報告

    USBドライバが動かない環境について報告

    まだ全くと行っていいほど情報が集まってないのですが、USBドライバが動かない環境があるようです(本だとday06cのところで確認)

    環境1ではhttps://github.com/uchan-nos/mikanos/blob/37029cba7c66d3cc9f27db435c3c7ac4738145f9/kernel/usb/xhci/xhci.cpp#L138

    環境2ではhttps://github.com/uchan-nos/mikanos/blob/37029cba7c66d3cc9f27db435c3c7ac4738145f9/kernel/usb/xhci/xhci.cpp#L248

    にてエラーが起きています。

    opened by HonokaNo 7
  • ログ出力の書式指定が足りない

    ログ出力の書式指定が足りない

    大本のバグ報告 https://github.com/uchan-nos/os-from-zero/issues/31

    https://github.com/uchan-nos/mikanos/blob/1856c36ea20ac933620708bc43b350eb7d88d815/kernel/usb/xhci/xhci.cpp#L333 で %02%02x が正しい

    bug 
    opened by uchan-nos 0
Releases(v1.0rc5)
  • 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 253 Jun 16, 2022
A unix operating system written from scratch in c++

A unix operating system made from scratch using c++

pranaOS 135 Jun 15, 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.3k Jun 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 24.7k Jun 26, 2022
System Programming 2021 Spring

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

null 30 Apr 23, 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 11.6k Jun 24, 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 19 May 3, 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 63 Jun 8, 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 84 Jun 10, 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 24 Jun 27, 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 20 May 19, 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 20 May 19, 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 40 May 27, 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 Jun 20, 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 13.8k Jun 24, 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
RocketOS is a Unix based OS that uses legacy BIOS and GRUB and is written in C17. It is being developed for educational purposes primarily, but it still is a serious project. It is currently in its infancy.

RocketOS What is RocketOS? RocketOS is a Unix based OS that uses legacy BIOS and GRUB and is written in C17. It is being developed for educational pur

null 28 Jun 20, 2022
The purpose of these streams is to be educational and entertaining for viewers to learn about systems architecture, reverse engineering, software security, etc., and NOT to encourage nor endorse malicious game hacking.

Memestream This repository holds the code that I develop during my live game "modding" ?? sessions. When I stream, I like to speedrun making a success

Stephen Tong 27 Jun 17, 2022
C/C++ Windows Process Injector for Educational Purposes.

ProcessInjector C/C++ Windows Process Injector for Educational Purposes. What does this software do? This is a simple process injector that uses the C

Berat Çağrı Eroğlu 8 May 3, 2022
Educational material and examples for those interested in learning the C programming language

Learn C Educational material and examples for those interested in learning the C programming language Files: examples.c Various examples of programs w

Michael Kolesidis 14 May 15, 2022
archiver is a compressing/decompressing tool made for educational purposes

archiver ?? archiver is a compressing/decompressing tool made for educational purposes (specifically, it was a hometask given at a C++ course in the H

Ihor Chovpan 2 Mar 11, 2022
Accepted solutions to the Atcoder Educational DP Contest

atcoder-educational-dp Accepted solutions to the Atcoder Educational DP Contest A - Frog 1 B - Frog 2 C - Vacation D - Knapsack 1 E - Knapsack 2 F - L

Sachin Srivastava 1 Dec 10, 2021
C library designed for the TI MSP432P401R microprocessor and the TI Educational Booster Pack, to easily play and control songs with the integrated Piezo Buzzer.

MusicLib C library designed for the TI MSP432P401R microprocessor and the TI Educational Booster Pack, to easily play and control songs with the integ

Matteo Merler 1 Nov 24, 2021