備忘録やめた

備忘録として使用していたけどやめた.このブログに載せてあるコードのライセンスは別途記載がない限りWTFPL OR NYSLです.

自作OS

安定版Rustでの自作OSの試み

はじめに この記事は自作OS Advent Calendar 2021並びにRust Advent Calendar 2021の14日目の記事です. Rustを使用してOSを自作する場合,Nightlyの使用が前提とされている雰囲気を感じます.有名なチュートリアルであるWriting an OS in RustでもNightlyの…

Stable RustでUEFIバイナリを作成する

はじめに Rustにはx86_64-unknown-uefiというターゲットが存在しますが,このターゲットに対するcoreライブラリなどの標準ライブラリは提供されていないため,cargoの-Z build-std=coreなどのオプションを用いて自分でこれらのライブラリをコンパイルする必…

自身をメモリの下位1MBに読み込むカーネルには,GRUB2は対応していない

GRUB2のマニュアルの1.4より引用. Only kernels loaded at 1 megabyte or above are presently supported. Any attempt to load below that boundary will simply result in immediate failure and an error message reporting the problem. 1MBより下には…

1GBページでのページングはPDPTの13-29ビットがReservedになる

1GBページでのページングでは,4KBページでのページングとは違い,ページディレクトリやページテーブルを使用せず,PDPT (Page-Directory-Pointer-Table) が物理アドレスを格納します.この物理アドレスは,1GB単位である必要があります. 丁度今,仮想アド…

USBキーボードドライバを作成した

この記事は,自作OS Advent Calendar 2020 - Adventarの13日目の記事です. USBキーボードドライバを実装しました. 主に読んだもの www.intel.co.jp xHCIの仕様書です. booth.pm USBキーボードドライバの作成手順が載っています. www.usb.org USB3.2の仕…

GOPを楽に取得する

コード uefi-rsを使用しています. fn fetch_gop<'a>(system_table: &'a SystemTable<Boot>) -> &'a mut gop::GraphicsOutput<'a> { let gop = system_table .boot_services() .locate_protocol::<gop::GraphicsOutput>() .expect_success("Your computer does not support Graphics Out</gop::graphicsoutput></boot>…

カーネルの直後のページがページフォルトを起こした

問題 カーネルが配置されているメモリ(0xffffffff80000000 - 0xffffffff80017000)の直後のページにてページフォルト発生. check_exception old: 0xffffffff new 0xe 118: v=0e e=0002 i=0 cpl=0 IP=0038:ffffffff80000083 pc=ffffffff80000083 SP=0030:ff…

RamenOSに64ビットモードを実装した

要約 RamenOSに64ビットモードを実装しました.64ビットモード実装の際は,4階層ページングの実装,PAE(Physical Address Extension)の有効化,IA-32eモードの有効化,64ビットコードセグメントへのfar JMP,各種アドレスの変更,IDTの64ビットモード対応…

RamenOSにページングを実装した

要約 RamenOSにページングを実装しました.はりぼてOSを改造してページングを実装する場合,ページディレクトリ,ページテーブルの領域を確保し,GDTのエントリを追加又は編集し,保護モード移行直後にfar JMPをし,CR3,CR0レジスタに適切な値を代入し,リ…

RamenOSのカーネルの.headセグメントを削除する

30日でできる! OS自作入門作者:川合 秀実発売日: 2006/03/01メディア: 単行本 要約 RamenOSのカーネルの.headセグメントを削除します..headセグメントに依存している,asmhead.nas内の; bootpackの起動というコメントで始まる.dataセグメント移動のコードを…

はりぼてOSのカーネルへのジャンプについて

要約 はりぼてOSでは,まず絶対ジャンプでカーネルのヘッダに飛んだ後,そこから相対ジャンプでHariMainに飛ぶという,二段階ジャンプを行っていることが判りました. はじめに はりぼてOSにページングを実装する事に奮闘していました.JMP 0xC0000000でカー…

RamenOSのカーネル,IDT,GDTの移動

要約 RamenOSのカーネル,IDT,GDTの場所を変更します.変更のためにはアセンブリファイルや*.rsファイル*1の各所で定義されている定数の値と,GDTのエントリを変更する必要があります. はじめに はりぼてOSを基にしているRamenOSにページングを実装するた…

はりぼてOSの仮GDT解説

要約 GDTの各フィールドと,はりぼてOSのasmhead.nas内で仮設定するGDTのヌルセレクタ以外の2つのエントリの各ビットがどのような意味を持つのかを解説します. 背景 RamenOSにページングを実装するために,カーネルやIDT,GDTの位置を動かしていましたが,G…

VBE設定コードを分離する

要約 tokuchan3515.hatenablog.com 以前,はりぼてOSの解像度と色深度を上げる方法を紹介しましたが,ここで書いたコードが長いので,別のファイルにコードを移し,元のファイルに%includeでインクルードすることでコードを分割します.asmファイルとMakefil…

はりぼてOSの解像度と色数を大きくする

30日でできる! OS自作入門作者:川合 秀実出版社/メーカー: マイナビ出版発売日: 2006/03/01メディア: Kindle版 概要 『30日でできる!OS自作入門』で取り扱っているはりぼてOSでは,最大256色使用できる8ビットカラーを使用しています*1.これに対し,最大16…

「はりぼてOS」をC++で書く時の注意点

このブログを大体2/3年放置していたようだけど,なんか勿体無いし,アウトプットはいいことなのでまた書くことにした. 30日でできる! OS自作入門作者: 川合秀実出版社/メーカー: 毎日コミュニケーションズ発売日: 2006/03/01メディア: 単行本購入: 36人 ク…