Cc: @shimada
やや時期尚早なきもしますが…すでに手がついてるのがここなので。
【現状 260824】
- /bootはFreeDOSベースにした方が都合が良さそう
- hwboot(リニアフレームバッファ(LFB)をセットアップする、機種ごとのdosboot派生ローダ)か、純正dosbootかなあといった感じ(MENUコマンドとかで選ばせればよいでしょう)
- UniVBEというhwboot相当の動作(VBE2.0のエミュレーション)をやってくれるDOS向けフリーウェア(ドライバ)があって(まだ試してないが)、これは大量のVGAチップをサポートしているので便利そうだがさすがに同梱するにはなかなかハードルが高いかなあと(OSSでもないし、潰れた会社のフリーウェアゆえ…) (参考:https://dosdriver.de/graph.html ダウンロードしたzip内にサポートしているVGA一覧あり)
- /bootを作るスクリプト類のrepoというのはどう持てばいいのかという(とりあえずMakefileなのを手元に作ってある、後でGitHubに上げておく)
すんません、調査ありがとうございます(8月中は身動きが取れないです…)
486系を中心に、VBE 1.2とかしか喋れない機種のグラフィックのセットアップは、DOSから動かすこと前提なんだよ、という話をかぐら先生から先日聞きましたので(TODO : 認識あっていますか?)、DOS経由でのNetBSDブートは致し方ないかなと思っています。
で、/boot を FreeDOS ベースに…という話なのですが、NetBSD の /boot を使うのもありだとは思うのですが、私としては FreeDOS の部分は NetBSD パーティションから独立させたほうが、後々、取り回しがよいかなとも思うところで、ちょっと悩んでいます。
例えば具体的には、今回のケースであると、ディスク全体はこんなパーティション構成になります。(わかりにくいのですが、Linuxと異なり、NetBSDは大枠のパーティションを1つ確保し、その中にスライスで /usr などを切る方式です。)
そして、以下を置くことになります。
- a: 最低限のFreeDOS環境と、VBE初期化プログラムを何か、そして dosboot / hwboot, netbsd カーネルを置き、autoexec.bat 的な物で自動起動できるようにする。そして、FreeDOSをブートローダとして動くように、SYS的なコマンド(FreeDOSでは何というコマンドなんだろう?)をあらかじめ実行しておく。
- b: NetBSD 環境。ここのブートローダは事実上使いません。
a : FreeDOS部分
ディストリビューションのCI/CDを考えると、最初は a: の部分で、どういうコマンドを使ってディスクイメージを作っていくかを考え…ることになるのですが、最初からそれを考えるのは面倒だとは思います。
なのでまずは手動で a: のパーティションを作り、 b: に橋渡しする仕組みを手動で作り、あれこれ実験してみるところからでしょうか。
DOSのバッチファイルは頑張れば簡易メニュー的なものも作れますので、dosboot / hwboot などの選択もできるようにできれば夢が広がりそうです。利用者自身でダウンロードして a: に置いてね、という自己責任を設ければ、 UniVBE もありだと思います。
b: NetBSD部分
Kernelでフレームバッファを掴む処理・・・まわりは、後々私もレビューできればと考えています。
486系を中心に、VBE 1.2とかしか喋れない機種のグラフィックのセットアップは、DOSから動かすこと前提なんだよ
これは前提というか、その方が楽というか、微妙なところではあるかもしれない 明確に言えるのは別のOS(FreeDOS)を踏み台にするおかげで「フレームバッファを有効化してカーネルをロードする」というシンプル?な責務にローダが集中できるというところですかね
a: 最低限のFreeDOS環境と、VBE初期化プログラムを何か、そして dosboot / hwboot, netbsd カーネルを置き、autoexec.bat 的な物で自動起動できるようにする。そして、FreeDOSをブートローダとして動くように、SYS的なコマンド(FreeDOSでは何というコマンドなんだろう?)をあらかじめ実行しておく。
ディストリビューションのCI/CDを考えると、最初は a: の部分で、どういうコマンドを使ってディスクイメージを作っていくかを考え…ることになるのですが、最初からそれを考えるのは面倒だとは思います。
ここはなんかAI slopした結果いい感じっぽいのができているような感じがしています(家帰ったらGitHubに上げておきます)
sys-freedos.plという公式のperlスクリプトがあって、それでFAT32のVBR(もしくはパーティションレスFAT32ディスクのMBR)として公式のブートセクタバイナリを埋め込む(その場でnasmして書き込み)ことができるので、SYSコマンド的な部分はそれでいけますし
普通のfat32イメージなので中に物を入れるのはmtoolsでmcopyして突っ込んでやれば行けると思います。
問題はVBRをどうロードするかですが、ここら辺はSonnetくんがVBRをロードするMBRを書いてくれたのでそれでよいでしょう。(ここまでの組み合わせでQEMUならFREECOMまで上がってくるのは確認済み)
参考: Makefileのようす boot.imgがFreeDOSパーティションでvbrldr_*.binがMBRイメージ
SHELL := /bin/bash
BOOT_IMG := boot.img
BOOT_IMG_BS ?= 8M
BOOT_IMG_COUNT ?= 16
SYS_OFFSET ?= 64
FREECOM_URL := https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/dos/command/0.86/command.zip
KERNEL_URL := https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/dos/kernel/2046/kernel.zip
FREECOM_DIR := freecom
KERNEL_DIR := kernel
FREECOM_ZIP := .cache/command.zip
KERNEL_ZIP := .cache/kernel.zip
.PHONY: all image bootloaders clean fetch freecom kernel
all: image bootloaders
image: freecom kernel
dd if=/dev/zero of=$(BOOT_IMG) bs=$(BOOT_IMG_BS) count=$(BOOT_IMG_COUNT)
mkfs.fat -F 16 $(BOOT_IMG)
mcopy -i $(BOOT_IMG) $(KERNEL_DIR)/BIN/KERNL86.SYS ::/KERNEL.SYS
mcopy -i $(BOOT_IMG) $(FREECOM_DIR)/BIN/COMMAND.COM ::
./sys-freedos.pl --disk=$(BOOT_IMG) --offset=$(SYS_OFFSET)
fetch: freecom kernel
freecom: $(FREECOM_DIR)/BIN/COMMAND.COM
kernel: $(KERNEL_DIR)/BIN/KERNL86.SYS
$(FREECOM_DIR)/BIN/COMMAND.COM: $(FREECOM_ZIP)
rm -rf $(FREECOM_DIR)
mkdir -p $(FREECOM_DIR)
unzip -q -o $< -d $(FREECOM_DIR).tmp
mv $(FREECOM_DIR).tmp/* $(FREECOM_DIR)/
rmdir $(FREECOM_DIR).tmp
$(KERNEL_DIR)/BIN/KERNL86.SYS: $(KERNEL_ZIP)
rm -rf $(KERNEL_DIR)
mkdir -p $(KERNEL_DIR)
unzip -q -o $< -d $(KERNEL_DIR).tmp
mv $(KERNEL_DIR).tmp/* $(KERNEL_DIR)/
rmdir $(KERNEL_DIR).tmp
$(FREECOM_ZIP):
mkdir -p .cache
curl -L --fail --retry 3 --output $@ $(FREECOM_URL)
$(KERNEL_ZIP):
mkdir -p .cache
curl -L --fail --retry 3 --output $@ $(KERNEL_URL)
bootloaders:
nasm -f bin vbrldr_chs.asm -o vbrldr_chs.bin
nasm -f bin vbrldr_lba.asm -o vbrldr_lba.bin
clean:
rm -f $(BOOT_IMG) vbrldr_chs.bin vbrldr_lba.bin
rm -rf $(FREECOM_DIR) $(KERNEL_DIR) .cache
利用者自身でダウンロードして a: に置いてね、という自己責任を設ければ、 UniVBE もありだと思います。
これもそうですね。あれば実行する、みたいな処理ができるとなおよさそう(将来的な話ですが)
b: NetBSD部分
Kernelでフレームバッファを掴む処理・・・まわりは、後々私もレビューできればと考えています。
ここはちょっとあまり分かってないのでぜひぜひお願いしたいところですね…ある程度詰めたらまた例会とか顔出しに行ってもいいかもしれませんね
ツッコミありがとうございます。FreeDOSはOSSですし、(踏み台として)使えるものは使うの精神でいいんじゃないかなと思っています。MSのものを使っていなのでおおっぴらに配布できますし。
sys-freedos.pl も後ほど確認してみます。ディスクイメージをうまく作って、あとは mcopy でど /boot パーティションにコピーして、ブートローダを組み込む…というのは、現時点の opencocon (Linuxフレーバー)でも同じことを内部でやっていますので、私としても馴染みであります。
Makefileについても、コードは私の方でレビューを入れて、コメントなりechoなりを加えたいと思います。そうすることでAI生成ぽさがなくなり、外から文句を言われなくなるかなと。
「いいね!」 1
ありがとうございます。
取り急ぎぱっと見ているのですが、vbrldr_chs.bin, vbrldr_lba.bin はどこから持ってきて、何をするものなのか…というのが気になっています。ソースのコメントも日本語で割と綺麗なものなので、どこかの古の example か、はりぼてにあるものを持ってきたのかな? (もとの出典がわからないと採用は辛いかもしれません)
sys-freedos.pl は元ソースのありかも発見しましたので、このまま流用できそうですね。
「いいね!」 1
vbrldr_chs.asmとvbrldr_lba.asmはディスク自体のMBRに書き込むやつで、/bootパーティションの1セクタ目(VBR)をchainloadしてくれる部分です(FreeDOS公式のブートセクタをそのままMBRとしたうえで、ディスクにパーティションに切ることはできないないっぽい)
ちなみにどっかのExampleとかではなくこれもSonnetくんに書いてもらったやつです(自宅のLibreChatでやったんですがどうも共有リンクが機能しないためクソ長画像で失礼)
了解です。となると vbrldr_chs.bin, vbrldr_lba.bin については、他のコードを見ながら挙動の簡単な確認を進めたうえで、Sonnet 生成であることをソース冒頭に明記の上使用、という感じでしょうか。
たとえば、こんな感じのコードとにらめっこする感じです:
https://qiita.com/earthen94/items/958fbd1a52031123bc0b
ここんのような小さいプロジェクトは、AI生成コードの採用はある程度の裁量はあります(大きなディストリではこうはいかないでしょうね)。私としては今のところ、実機が燃えないこと、GPLから持ってきていないことは重視しますが、それ以外は明記していればまぁいいんじゃないのという立場ではあります。
「いいね!」 1