借り初めのひみつきち

仮ブログです。

|ω・`)チラッ

2023年のご活躍

今年一年の活動を振り返ってみます。 シンプルでそこそこの圧縮率が出る組み込みに有用な非可逆画像フォーマット「MPIC」を作りました。 neriring.hatenablog.jp また、去年作った画像ツールをMPICに対応しました。 最初は画像の表示と保存しかできないアプ…

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

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

Intel APX

面白そうな拡張が発表されたようです。 www.intel.com Intel APX は一言で言うとx86汎用命令のAVX化です*1 AVX では新しいプレフィックスを追加することで今までの SSE 命令ではエンコーディングできない機能が追加されました。 APX もこれに似ていて、今ま…

MYOS の現状

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

x86S

Intel が 64bit モードのみのサブセットの x86 アーキテクチャを検討中という噂が流れてきました。 www.intel.com 検討始めるのが10年遅くないですか? ここから普及するまでまた何年もかかるのに… x86 の枷 以前ぼくのブログでも紹介したことがあるように、…

Kano PC

教育用パソコンとかいう奴らしいです 元は5万円くらいしたようですが、現在は2万円くらいで手に入るので購入してみました。 結論から言うと、ハードウェアはゴミです。これを買うくらいなら mouse の E10 の方がはるかにマシです。 windows がギリギリ動くス…

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

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

誰も教えてくれない AMD64 と Intel64 の違い (ページング編)

Intel64 は AMD64 を参考に実装したので、9割以上のアプリケーションにおいて概ね互換性があります。 一方、船頭多くしてなんとやら、両社の政治的な思惑などが絡んで意図的に非互換になっている部分があったり、細部の互換性をとることができていない部分…

MYOS の起動処理概要

MYOS の起動処理をかんたんに解説します。 MYOS をメインに解説しますが、 TOE は MYOS のサブセットとして開発が始まったので共通点も多いです。 Boot Loader 〜 カーネルエントリポイント まずはブートローダーが起動します。ブートローダーの細かい動作は…

スケジューラーと優先順位の逆転

MYOS のスケジューラーは SMP に対応しています。 つまり、 CPU を 100% 使おうとする重いタスクが2個あった場合、合計で 200% ほど使うことができるわけです。 これがシングルコアだったら 100% を仲良く分け合って 50% しか使うことができません。 マルチ…

3種のビットマップ

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

ビットマップクラス統合

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

アクティビティモニターの作り方

MYOS や TOE にはアクティビティモニターがあります。 これらは見せ方が若干異なりますが、定期的にスケジューラーが集計したデータをそのまま表示しているだけです。 では、スケジューラーはどのように集計しているのでしょうか? CPU時間 スレッドの切り替…

CD から OS を起動する

昔の OS は CDROM で提供されていました。 TOE は標準でフロッピーから起動しますが、さいきん入手難しくなってきたので CD 起動に対応したいと思います。 ロメオとジョリエット CDROM のファイルシステムはたくさんの規格が複雑にからんでいます。 CDROM は…

MEGFS

古の MEG-OS は MEGFS という独自ファイルシステムをサポートしていました。 それ、 FAT でよくね? MEGFS はファイル管理にファイルアロケーションテーブル (いわゆる FAT) を採用するなど FAT によく似た特徴を備えており、 FAT と MEGFS の違いは FAT と …

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

年初まで 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…

BASIC-DOS

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

Rustの基本戦略

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

ロゼッタと林檎と

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

ACPI 2.0

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

EFER.LME と EFER.LMA

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

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

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

UEFI ゴルフの果てに

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

最小の UEFI Hello World

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

BitTest 命令

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

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

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

IBM PC のタイマー事情

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