借り初めのひみつきち

仮ブログです。移転先募集中

妖精さんとなかよくなるほうほう

年初まで x64 や WebAssembly で Rust を色々いじってましたが、少しお休みして x86 でコードを書いてみようと思います。 動かす環境はベアメタル ʕ•ᴥ•ʔ になりますが、 Rust はベアメタルの適切なターゲットがありません。 CPU さえ合ってれば OS はどうで…

ぬるぽ警察24時

myos では Null Pointer Exception は発生しません。 理由は2つあって、言語に Rust を採用しているというのと、 Null Pointer Exception が発生するようにページングを設定していないからです。 事件編 Rust には Null Pointer Exception によく似た別のエ…

myos の描画アーキテクチャ

myos のウィンドウ描画アーキテクチャについて解説します。 執筆時点での情報なのでバージョンによっては詳細が異なる場合があります。 なお、ここにあるのはカーネルの構造なので、アプリケーションレイヤーではラッピングしたオブジェクトなど詳細は異なり…

Rust の Null Pointer Optimization

古き良き C 言語では NULL ポインターがよく使われましたが、 NULL の発明者は10億ドルを超える莫大な経済損失を引き起こしたとのちに後悔しました。 モダンな言語は NULL に対する安全性を担保する仕組みを持っています。 Rust では Null 安全性のために Op…

Rust 自作 OS 日記/Part 9 my new os...

2020 年を振り返ってみると、色々と検討した結果もう Rust を勉強するしかないなー ということになって春ごろから Rust の勉強を開始、そして myos の開発が始まりました。 さて、およそ半年開発を続けてきた「myos」ですが、 「私の OS」ってなんやねーん …

BASIC-DOS

さいきん変な OS が発表されたっぽいです。 basicdos.com 2020 年になって DOS !!! ぼくはこういうソフトを見つけた時に、普通の人とはちょっと視点で見てしまいます。 このソフト、ぼくの自作エミュレータで動くのかな? バイナリないナリ ということで、ま…

Rustの基本戦略

さいきん Rust の基本戦略をやっと完全に理解しました。 オブジェクトはスタックに割り当てます。(スタックポインタを減算するだけ) 所有権とライフタイムによってオブジェクトの生存期間が関数の生存期間を超えないように制御します。 関数を抜けたらスタ…

ロゼッタと林檎と

最近 myos の開発していて気になったことがあります。 myos のスケジューラーをほとんどいじってないのに今まで見たことない不審な動きをするようになったんですよ そういえば、開発用の Mac を Intel から Apple に買い替えました。 そして、現状 Apple Mac…

Rust 自作 OS 日記/Part 8 🔔

飲食店のテーブルには謎のボタンがついていることがあります。 お店の中のものを勝手に触ると怒られますが、謎のボタンを押すと店員さんがやってきていろいろなサービスを受けることができます。 これって何かに似てませんか? 前回は WebAssembly のランタ…

妄想

モチベーション wasm のサブセットを base64 に最適化したい 内容 単純なオクテットストリーム → base64 変換をするとサイズが約 4/3 になるが、以下のような変換で直接 base64 ストリームに変換することで効率低下を抑えることができる i32 は wasm におい…

Rust 自作 OS 日記/Part 7 次世代の OS へ。

myos の開発をはじめておよそ半年が経ちました。 前回の続き 前回の日記より実装も進歩してはりぼて OS でできることの8〜9割程度が myos でもできるようになりましたが、まだいくつか課題があります。 そもそも myos ははりぼて OS ベースではないし、は…

Rust 自作 OS 日記/Part 6 過去最大の更新

このシリーズの記事は月1くらいで書こうと思ってて前回からそんなに日付も経ってないのですが、 ここ最近で過去最大にいろいろ変わってしまったので前倒しで書くことにします。 initrd 某はりぼて OS では起動時にフロッピーディスクの内容をメモリに転送し…

Rust 自作 OS 日記/Part 5 マルチタスキング

古代のコンピュータでは1台のコンピュータでひとつのタスクを実行するのが普通でした。*1 現代のコンピュータでは1台のコンピュータで複数のタスクを同時に実行するのが当たり前となり、さらには複数の OS を並列に動かす技術さえあります。 複数のタスク…

Rust 自作 OS 日記/Part 4.1 おまけ

前回の日記でひとつ触れ忘れました。 Rust 自作 OS 日記/Part 4 フォントのはなし - 借り初めのひみつきち ベクターフォントのラスターフォントにないもうひとつの利点、 それは描画予定のサイズよりあらかじめ大きいバッファに描画してから縮小して実際の画…

Rust 自作 OS 日記/Part 4 フォントのはなし

古きよき太古のコンピューターは ROM にフォントを内蔵していたので文字コードを指定するだけで画面に文字を表示することができました。 現代のコンピューターは広大な画面に自由に図形を描画できるようになった代償として文字を表示するためにフォントが必…

ACPI 2.0

いまどきの PC 用 OS では ACPI 対応を避けて通ることができません。 現在、私の OS では以下の ACPI ライブラリを利用しています。 GitHub - rust-osdev/acpi: Rust library for parsing ACPI tables and AML ACPI には様々なテーブルがありますが、このラ…

Rust 自作 OS 日記/Part 3 ブートローダー

最近の大きな変更点は、カーネルとブートローダーを分離しました! UEFI の便利なところはカーネルを直接起動できるところです。 一方、カーネルに UEFI のコードが含まれることによる問題も少なからずあるので、 ブートローダーを分離することになりました…

Rust で ARM64-UEFI Hello World

以前書いた日記の続きになります。 neriring.hatenablog.jp Rust ではさまざまなターゲットがあり、比較的容易にクロスコンパイルできます。 一方 UEFI も PC に依存しないように設計されていて、 x86 系とは全く別のアーキテクチャである ARM 系 CPU などに…

EFER.LME と EFER.LMA

EFER.LME と EFER.LMA をご存知ですか? これらのフラグは x64 CPU でロングモードの遷移に関わるフラグです。 では、2つのフラグの役割の違いをご存知ですか? ロングモードの遷移 ロングモードの遷移についておさらいしてみましょう。 *1 まずは、 CR0 レ…

Rust 自作 OS 日記/Part 2

前回の日記からまた間が空いてしまったので進捗をば。。 最近多忙につき、あまり開発時間が取れてないですが、 ウィンドウシステムっぽいものを実装始まりました ちなみに以前作ってたアレがこんな感じ まるで進化してない 見た目はだいぶそれっぽいになりま…

Rust 自作 OS 日記/Part 1 my new gear...

前回の日記でお察しかと思いますが、さいきん Rust + UEFI で OS がどのくらい作れるのか検証していました。 TL; DR 結論から言うとマルチスレッドが動く程度までは動いて、今後も継続して開発していこうと思います。(๑╹ω╹๑ ) Rust で OS Rust 特有の苦労し…

Rust で UEFI のハローワールド

2020-12-23: cargo xbuild が不要になったので一部修正しました。 さいきん Rust のべんきょうはじまりました! Rust とは 安全に低レベルプログラミングができるナウい言語っぽいです。 メモリ管理が厳しいので初学者はコンパイルを成功させるだけでも一苦…

AssemblyScript の配列

さいきん AssemblyScript を触ってました。*1AssemblyScript とは、 WebAssembly にコンパイルできる TypeScript のサブセット言語です。 WebAssembly の世界と JavaScript の世界は別の世界なので結構勝手が違いますが、 AssemblyScript を使うと同じ TypeS…

WASM 自作 PC エミュレータ日記/202001

自作PCエミュレーターの進捗です。GitHub - neri/vpc: A PC Emulator implemented by WebAssembly はりぼてOS 前回投稿時点では 起動画面が出るところまでの動作でそれ以降の動作は不安定になってましたが、その後の改良で現在ではほとんどのアプリが動くよ…

自作フォントエディタの話

今年作ったソフトの紹介をします。 Font Edit '95 このソフトウェアはビットマップフォントを編集することができます。 ビットマップフォントというのは名前の通りフォントデータをピクセル単位のビットマップで扱うフォント形式で、昔のOS・自作OS・組み込…

x86 の汎用レジスタのルーツ

x86 の汎用レジスタは AX CX DX BX です。AX BX CX DX ではありません! この由来について 8086 のルーツから探ってみたいと思います。 Intel 4004 Intel が初めて作った CPU は電卓を作るために開発された 4004 でした。 このことから 8086 は電卓の子孫と…

任意コード実行可能なホームページ作った。

今年作った自作アプリの紹介します。 TL; DR Virtual Playground GitHub - neri/vpc: A PC Emulator implemented by WebAssembly このアプリは Web ブラウザ上で PC をエミュレーションします。 技術的には WebAssembly、 Canvas、 WebWorker、 WebAudio、 W…

UEFI ゴルフの果てに

前回の記事の UEFI ゴルフの続報です。Hello world はどの環境でも文字列出力関数(API, メソッド, etc...)を呼び出すだけなのでコードはほぼ定型となりコード部分の最適化の余地はほとんどありませんでした。 ゴルフのお題のひとつに CHARS というものがあり…

最小の UEFI Hello World

UEFI は実行ファイルに PE/COFF という形式を採用しています。PE/COFF 形式はご存知の方も多いかと思いますが Windows で現在主流の実行ファイル形式で、名前の通り昔 UN*X で使われていた COFF 形式の派生です。 COFF から PE/COFF になる際にオリジナルの …

最小限の USB Hub 対応

USB バスはスター型トポロジーになっていて規格上は最大127台のデバイスを接続することができることになっていますが*1、実際のコンピューターには多い機種でも数個、ほとんどのモバイル PC にはたった1個の USB ポートしかコネクタがありません。 それ以上…