借り初めのひみつきち

仮ブログです。

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 のハローワールド

さいきん Rust のべんきょうはじまりました! Rust とは 安全に低レベルプログラミングができるナウい言語っぽいです。 メモリ管理が厳しいので初学者はコンパイルを成功させるだけでも一苦労です。 UEFI とは 2000年ごろに BIOS を代替する目的で開発された…

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 になる際にオリジナルの …

DirectInput と XInput

USB

USB ゲームパッドは大きく分けると DirectInput 形式と XInput 形式の2種類存在しています。 いったい何が違うのでしょうか? DirectInput DirectInput 形式の名前の由来は Windows API の DirectInput からきていて、規格としては USB HID (03 00 00) をベ…

最小限の USB Hub 対応

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

USB/xHCI インタラプト転送の罠

USB プロトコルではホストとデバイスの役割が明確に分かれていて、ホスト (PC) から送受信命令を発行しないとデータ転送が始まりません。ストレージのようなデバイスではこれで問題ありませんが、キーボードやマウスのように人間の気まぐれでいつデータが来…

moe の xHCI / USB 実装

現在の moe の xHCI / USB 実装について軽く解説します。 実装の解説がメインで、各レジスタやビットの意味などあまり詳細に解説すると本が書ける量になってしまうので省略ご了承ください。 xhci.c, xhci_init() PCI エニュメレーションとコンフィグレーショ…

UEFI 自作 OS 日記 v0.7 / First Anniversary

moe を公開して一年経ちました。neriring.hatenablog.jpmeg-os.orgで、そろそろなんかどーんとやりたかったところですが、v0.7が目立った新機能もないのでひっそりします。。。

GPD MicroPC

正直、 GPD 社に期待はしてるけど今まで出した製品はあまり出来がいいと思ってない Nerry です。エンジニア向けとして期待されていた GPD MicroPC ですが、やっと触る機会ができたので自作 OS の観点から調査してみましたヽ(•̀ω•́ )ゝ✧ 結局、 Portrait なの…

BitTest 命令

x86 には BitTest というマイナーな命令があります。具体的には BT BTS BTR BTC の4種類あって、それぞれ特定のビットをテスト(1かどうか返す)、セット(1)する、リセット(0)する、反転する(0⇔1)命令になります。BitTest 命令をレジスタに使った場合はち…

exFAT について

exFAT というファイルシステムがあります。 FAT ファイルシステムの次世代ファイルシステムとしてリムーバブルメディアなどに採用実績がありますが、仕様が公開されておらず特許が絡むために Microsoft 製以外の OS からはあまり使い勝手がよくありませんで…

MOE は MEG-OS MOE になりました。

MOE は MEG-OS MOE になりました。 MEG-OS Dawn もともと MOE は内部コードネーム「MEG-OS Dawn」として企画された MEG-OS ファミリーの最も新しい OS でした。MEG-OS Dawn の主な要件は以下の通りです。 新しい 64bit OS UEFI で起動し、 PIC や PIT に依存…

UEFI自作OS日記 v0.6.1 ゆ。

前回の記事で紹介したように v0.6 は大幅なリメイクとなりましたが、それには大きな目的がありました。github.com現代の PC ではペリフェラル接続に主に USB を利用しています。 キーボードやマウスもデスクトップ PC では USB 接続が主流です。 モバイル PC…

UEFI自作OS日記 v0.6 再始動

しばらく開発の停滞していた moe ですが・・・github.com思うところあってリファクタリングしながら再実装しています。既存のコードを再利用できるところは再利用していますが、完全に新規に書き直してる部分もあります。これだけだと面白くないので具体的な…

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

ついに某OSの起動画面が出ました。まだ動作が怪しいですが...この辺ならキーボードも普通に動きます。(マウスは死んでます某OSも途中で止まります。 cpuid実装してるはずなのに認識されてないのが気になります。FreeDOS (32bit) はまだよくわからない動作を…

WASMで自作PCエミュレーター Part4

自作エミュレーターが VGA に(一部)対応しました!github.com今までは UART 経由で端末エミュレーターに接続していました。 DOS やその上で動く多くのソフトウェアは標準入出力という概念があるので、今まではこの方法が簡単に実装できてうまく動いていま…

ロングモードと64ビットモードの違い

ロングモードと64ビットモードの違い、分かりますか?おそらく多くの人が混乱していると思うのでブログにまとめます。(そしてぼくは混乱してないことを祈る極論を言うと、現代の x86 系プロセッサにはリアルモード、プロテクトモード、ロングモードの3つの…

WASMでPCエミュレータ作った話 / Part 3

github.comさいきんはずっとエミュレーター作ってるます。 FreeDOS ついに、FreeDOS (16bit版) が起動しましたヽ(•̀ω•́ )ゝ✧MSDOSはまだどこかおかしいようです。 Web MIDI Web MIDI に対応しました。 MPU-401 UART モード互換インターフェースのつもりなの…

IBM PC のタイマー事情

IBM PC の BIOS は通常、約 55ms / 18.2Hz ごとにカウントしています。 この数値は一体どこから来てどんな意味があるのでしょうか?まず、 IBM PC で使われているタイマーIC 8254 PIT の動作クロック入力が約 1193182Hz となっています。 すごく中途半端な値…

続・WASMでPCエミュレータ作った。

neriring.hatenablog.jp前回の記事の時点では、対応する命令も少ないしペリフェラルは UART のみでとても OS が起動する状態ではありませんでした。 その後色々実装して前回動かなかったブラウザにも対応し、ついに自作 OS の osz が起動しました!基本的な…