ふるた技工所(てっこうしょ)

ふるた技工所(てっこうしょ)

PR

×

キーワードサーチ

▼キーワード検索

プロフィール

Aちゃん22

Aちゃん22

フリーページ

2025.11.04
XML
カテゴリ: ソフト開発日誌
Redox OS

ここからは自分で可能な試行と解釈の結果で書いていく。他の人と意見が合わないかもしれない。

まず現実的に実行可能な環境は QEMU Emulator 一択 (リンク先は Running Redox in a Virtual Machine - Redox OS) だ( Redox OS を QEMU にインストールしてみた結果をまとめたページへのリンク )。

実マシンで動く との説明は「そうかもしれないけれど」という疑問がある。試した結果、 ほぼ骨董品になってしまった PC, Keybpard, Mouse, NIC, IDE-HDD, IDE-Optical Drive を見つけて動かすしかない。

骨董品が見つかり揃ったったとして、絶望的に Live USB Memory や CD-R(他の光学媒体も同様) の読み込みが遅い。精々 1 ~ 3Mbytes/sec の読み込み速度で live image を主記憶に読み込む。600Mbyte 程あるので、(linux で言う所の kernel + initrd) 起動だけで 3 ~ 10 分程度待たされる。それで起動すれば良い。大抵は HDD を認識したところでハングするか、起動まで漕ぎつけたとして、インストール先の HDD が見つからない。

普通の人なら、窓から投げ捨てるだろう。自分はこの時点でやる気ゲージが 50% まで落ちてしまった。

HDD のアクセスに問題が有り(リンク先はログ、末尾に VirtualBox が検出した問題が記録されている) (VirtualBox は実マシンで起こりえる問題も厳密にエミュレーションしていると思われる)、Frame Buffer 書き込みで CPU cache 制御の問題も露見している様に見える(こちらも厳密エミュレーションなのだろう、そして実マシンで起動のための読み込みが遅いのも cache 制御に問題が有りそうだ)。



QEMU で動かすことに辿り着き、 試しにプログラムを動かしてみる(リンク先は試したプログラムのソースコード) ことにした。rust で書かれた OS には失礼だとは思いつつ C 言語と bash を使う。必要な package を GUI の cosmic-terminal ウインドウで sudo pkg install git gcc13 gnu-make gnu-grep と入力してインストールする。

Page fault: 000000000000000C US
RFLAG: 0000000000010297
CS:    000000000000002b
RIP:   000000000061ad77
RSP:   0000000000d61e00
SS:    0000000000000023
FSBASE  000000000023e000
GSBASE  0000000000000000
KGSBASE ffff80007fc64000
RAX:   0000000000000001
RCX:   0000000000000000
RDX:   0000000000000000
RDI:   0000000000000004
RSI:   0000000000000000
R8:    0000000000000000
R9:    000000000061ad70
R10:   0000000000000001
R11:   0000000000000246
RBX:   0000000000000004
RBP:   0000000000000010
R12:   0000000000d61e60
R13:   0000000000000018
R14:   0000000000000001
R15:   0000000000000000
  FP ffff80000f02fe80: PC ffffffff8007c115
    FFFFFFFF8007BF40+01D5
    kernel::arch::x86_shared::interrupt::exception::page::inner
  FP ffff80000f02ff50: PC ffffffff80078e87
    FFFFFFFF80078E50+0037
    kernel::arch::x86_shared::interrupt::exception::page
  0000000000000010: GUARD PAGE

いきなり segmentation fault ですか(メッセージに UNIX 伝統の segmentation fault は含まれない。とは言ってもアドレス 0x000000000000000C って NULL pointer で指した構造体メンバーのアドレスだと思う)。

え? rust で書いて segmentation fault ってあるの?なんだかなぁ... この問題は QEMU の monitor/terminal 混合ターミナル(Linux を動かすと serial port の tty になる疑似端末)で 操作すれば解決した。やる気ゲージ 20% down。

Linux 上で一通り動作確認してたのですんなりコンパイルができて、動くかと思っていたら、コマンドライン解釈に問題がでた。getopt() が動作しない。何かの error return とか、"Not Implemented" の様なコンソールメッセージを出力するのかと思っていたら、沈黙をもって動作しない。

うん、ここに辿り着くまでに次のような未実装メッセージを散々見ている。
example 1: setsockopt(23, 1, 9, 0x20c7e0, 4) - unknown option
example 2: relibc getgroups(65536, Pointer { addr: 0xd5a0, metadata: 65536 }): not implemented
example 3: relibc getrlimit(7, 0x7ffffffffba8): not implemented

やる気ゲージ 10% down。ああ、普通に動いていない環境なんだ。

普段使いは JP keyboard なので、US keyboard 入力を強要する GUI にも不満が溜まる( keyboard driver を見ると layout は hard coding だし JP layout は stub すらない )。

ソースコードのリンク )。

コンパイルも通ったし、実装した個別のコマンドも動くようになった。test loop が回りだしてしばらくすると、kernel panic が起きる(起きなくても loop が途中で動かなくなって、UNIX で言う所の kill -HUP $pid をしないと終了しない)。できることは QEMU 毎終了するだけだ。
KERNEL PANIC: panicked at src/memory/mod.rs:954:9:
allocator-owned frames need a PageInfo, but none for [frame at 0x7ffffffffffff000]
  FP ffff800016caf730: PC ffffffff80050e55
    FFFFFFFF80050CD0+0185
    kernel::panic::panic_handler_inner
  FP ffff800016caf820: PC ffffffff8004ef39
  FP ffff800016caf830: PC ffffffff800a732f
  FP ffff800016caf860: PC ffffffff80075d90
    FFFFFFFF80075AF0+02A0
    kernel::memory::deallocate_p2frame
  FP ffff800016caf8f0: PC ffffffff8001d2ae
    FFFFFFFF8001CAC0+07EE
    <kernel::context::memory::AddrSpace as core::ops::drop::Drop>::drop
  FP ffff800016cafac0: PC ffffffff80033b1c
    FFFFFFFF80033B00+001C
    alloc::sync::Arc<T,A>::drop_slow
  FP ffff800016cafb30: PC ffffffff80049d8f
    FFFFFFFF80049720+066F
    <kernel::scheme::proc::ProcScheme as kernel::scheme::KernelScheme>::close
  FP ffff800016cafc40: PC ffffffff800968ea
    FFFFFFFF800964B0+043A
    kernel::context::file::FileDescription::try_close
  FP ffff800016cafcd0: PC ffffffff80096464
    FFFFFFFF800963A0+00C4
    kernel::context::file::FileDescriptor::close
  FP ffff800016cafd40: PC ffffffff80066baa
    FFFFFFFF80066A30+017A
    kernel::syscall::fs::close
  FP ffff800016cafd70: PC ffffffff8006b2c3
    FFFFFFFF8006AEF0+03D3
    kernel::syscall::syscall
  FP ffff800016cafea0: PC ffffffff8005f6ee
    FFFFFFFF8005F640+00AE
    __inner_syscall_instruction
  FP ffff800016caff50: PC ffffffff80058693
    FFFFFFFF80058650+0043
    kernel::arch::x86_64::interrupt::syscall::syscall_instruction
  0000000000000000: GUARD PAGE
CPU #2, CID 0xffffff7f801b7f20
NAME: /usr/bin/tr, DEBUG ID: 825
SYSCALL: close(8)
HALT

pipe line / redirect で繋いだ file descriptor の close() で問題が起きる?と言うことは、file descriptor で参照するかその操作で更新する情報の reference counter が不正操作されるか、そもそも up / down が必要な処理が抜けているか余計なのか。あれ、rust って Rc<> とか Arc<> とか有るんじゃなかったの(kernel 用に再実装するとして設計思想的に強要されるやり方では)?

ここまできてやる気ゲージは 0% になった。他にも一々 UNIX 系 command とコマンドラインの使い方が違うとか、おせっかいすぎる completion とか、不便は微塵も感じていなかったことが変わっている。変えた意図を汲めないことが多い。

rust への理解は殆どない。それでも Redox OS を実装している rust のソースコード






お気に入りの記事を「いいね!」で応援しよう

最終更新日  2025.11.05 08:36:30
コメント(1) | コメントを書く


■コメント

お名前
タイトル
メッセージ
画像認証
上の画像で表示されている数字を入力して下さい。


利用規約 に同意してコメントを
※コメントに関するよくある質問は、 こちら をご確認ください。


President  
MartaTek さん
The US president raged at NATO allies over defense spending in meeting with the German chancellor, as Israel ordered its military to ‘advance’ in Lebanon (2026.05.30 15:14:24)

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

カレンダー

サイド自由欄

コメント新着

MartaTek@ President The US president raged at NATO allies o…
Aちゃん22 @ Re[1]:接地外し忘れなのかな - 山手線停電障害(01/17) ご無沙汰してますさんへ こんにちは、面白…
ご無沙汰してます@ Re:接地外し忘れなのかな - 山手線停電障害(01/17) ご無沙汰してます。 ところで、こんなサイ…
RonaldBom@ От BDSM до тройничка: мужские хиты Раскрываем мужские тайны: от BDSM до се…

© Rakuten Group, Inc.
Design a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: