借り初めのひみつきち

仮ブログです。

rust

RISC-V で自作OS

じだいは RISC-V です。 github.com RISC-V とは Windows でよく使われている x86 は 40 年以上前から基本的に互換性を持ったまま拡張を続けた結果、現代ではほとんど必要ない機能との互換性のためにかなり複雑な仕様になっています。 また、 Arm に比べると…

QEMU RISC-V virt マシンで VGA を使う

さいきん QEMU RISC-V virt マシンで何ができるか色々探していたところ、なんと VGA が使えることがわかったので記事を書きます。 github.com 最新の RISC-V で古き良き VGA が動いてるのが面白いだけです。実用性はあまりありません。笑 解説 qemu で virti…

MYOS の現状

前回の記事でチラッと触れたものの正式な告知をしていなかったのでここで現状をまとめます。 もともと MYOS の実装には Rust の nightly の機能が必要だったため、 nightly の機能を積極的に使っていました。 nightly の機能は安定化されていないため、今ま…

非可逆圧縮作ってみた

シンプルな非可逆圧縮を作ってみました。簡単な処理しかしていません。 github.com 組み込み向けに設計したのでデコードのメモリ消費は抑えてあり、圧縮後の画像は16bitカラー相当になります。 *1 また、以下のような画像は苦手です。 モノクロ画像 もともと…

最近の myos

最後にこの記事書いたの何ヶ月前だったかな?な感じなのでタイトルも変更です。 綺麗なウィンドウシステムがそれなりに動くようになって逆に見た目の進化が乏しくなってしまった myos ですが、今も中身は進化しています。 外部アセンブラの廃止 高級言語で O…

raspberry pi ベアメタルでマルチコアを利用する方法

入手困難とうわさの raspberry pi を偶然にも入手たので最近触っています。 raspi の CPU は4コアで動作しますが、現在のファームウェアは最初のコア (ID 0) のみ起動します。*1 他のコアがどうしているかというと、ファームウェアが物理アドレス 0x0000_00E…

私の OS のご紹介

ここ数年 Rust で meg-os という名前の自作 OS を作っています。 github.com 過去に何度か0から作り直しているので、似たような名前の別のものを昔見たり聞いたりしたことがあるかもしれません。 現在のコードベースのコードネームは「Maystorm」となってい…

今月の myos

久しぶりの更新になります。 現在のバージョンの myos には明確な内部目標がありました。 Intel HD Audio の対応です。 *1 HD Audio は近年の PC にはかなりの割合で搭載されており、仕様も公開されていてそれなりに情報が出揃っているので実装可能だろうと…

QOI 画像ビューワーつくった

最近 QOI (Quite OK Image Format) という新しい画像形式が登場しました。 QOI — The Quite OK Image Format PDF1 ページに収まる単純な仕様でエンコーダーやデコーダーもC言語で数百行と単純で高速ですが、PNGよりやや圧縮率が悪い程度というトレードオフが…

今週の MYOS

さいきんの MYOS 界隈のトピックです。 WASM 高速化 以前の大規模改修で数倍の高速化に成功した WASM ランタイムですが、まだいくつか課題と高速化の余地があります。 まず、実行時エラーの処理を改善しました。 以前のエラー処理は命令実行時に現在の命令を…

今週の MYOS 🎉

今週、というには間が空いてしまった最近の MYOS/TOE 界隈のトピックです。 MAYSTORM 直訳すると5月の風になります。 MYOS が最初のコミットから1年経ったので、1周年を記念して新しい名前を付けて仮プロジェクトから正式なプロジェクトに昇格しました gi…

今週の MYOS

さいきんの MYOS/TOE 界隈のトピックです。 WebAssembly 高速化 (fused op) 中間コード変換とスタック操作合理化によって以前に比べると結構速くなりました。 この2つの改良によって実現可能になった新しい高速化手法があります。 WebAssembly は所謂スタッ…

MYOS のウィンドウのつくりかた

MYOS/TOE のアプリでウィンドウを作るところを少し詳しく見てみましょう。 ※ 執筆時点のバージョンの TOE をもとに記述しています。まだ API 安定化してないのでバージョンごとに細かい違いがあったり MYOS と TOE の間でも微妙に違うことがあります。 アプ…

wasm ランタイムの高速化

現在の自作 wasm ランタイムはインタプリタ実行しています。 インタプリタと JIT VM やエミュレーターの実装方法は大きく分けると2種類あります。 ある程度一気にターゲットの機械語に変換してしまう JIT 方式と、1命令ずつ読み込んで動作を再現するインタ…

Wasm on Wasm

ついに、 WebAssembly の自作エミュレータの上で動く自作 OS の上で自作 WebAssembly ランタイムが動くようになりました つまり Wasm on Wasm ですね٩( 'ω' )و 以下に試験的に体験版設置してるので起動してみることができます。 meg-os.org もちろん PC98 …

3種のビットマップ

昨日の日記で何故ビットマップクラスが3種類必要になるのか少し補則します。 生ポインタと Box 旧 MYOS のビットマップは生ポインタでデータを管理していました。 これは所有権もライフタイムも Rust によって管理されておらず借用の制限もなかったので C …

ビットマップクラス統合

近代的な OS は一部の組み込み用途をのぞくと画像処理が不可欠です。 MYOS や TOE も画像処理にそれなりの割合を割いています。 MYOS と TOE の大きな違い MYOS の主要なターゲットは UEFI で、 UEFI では 32bit ARGB 形式が標準です。 また、近代的な画像処…

新しい自作 OS 始めました

前回の日記で作り始めたもの、それは新しい OS でした。 概要欄 今のところ特徴を myos と比較すると以下のようになります。 myos のサブセット的な感じになっていて一部ソースを流用しています。 MYOS TOE コードネーム myos toe アーキテクチャ x86-64 x86…

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

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

ぬるぽ警察24時

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

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」ってなんやねーん …

Rustの基本戦略

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

Rust 自作 OS 日記/Part 8 🔔

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

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 には様々なテーブルがありますが、このラ…