UEFI_Basic
UEFI BOOTなBASICインタプリタ†
- Githubで発見
要点
- ソースは、かなりあっさり。
- basic.c : 2400行也(いわゆる、一本釣りだ)
- Makefileもあっさり。
- mingw-x64が(Ubuntuに)必要。
- makeすると、BOOTX64.EFIが出来るので、それをQEMUに食わせる。
$ qemu-system-x86_64 -bios OVMF.fd -drive file=fat:rw:fs
- 食わせる前に、BOOTX64.EFIをカレントディレクトリの fs以下に配置する。
fs/EFI/BOOT/BOOTX64.EFI
- 元のBASICは、こんなやつらしい
/* ****************************************************************** * * * Tiny BASIC for the Motorola MC68000 * * * * Derived from Palo Alto Tiny BASIC as published in the May 1976 * * issue of Dr. Dobb's Journal. Adapted to the 68000 by: * * Gordon Brandly * * 12147 - 51 Street * * Edmonton AB T5W 3G8 * * Canada * * (updated mailing address for 1996) * * * * This version is for MEX68KECB Educational Computer Board I/O. * * * ****************************************************************** * Copyright (C) 1984 by Gordon Brandly. This program may be * * freely distributed for personal use only. All commercial * * rights are reserved. * ****************************************************************** */
- なんとなく動くけど、これもバグバグなんだよねー。
- (runさせると、変な行番号が出て止まったりする。)
環境構築メモ†
- (1)・Lubuntu22.04 を用意(普通のUbuntu22.04でも良い) QEMUを動かすので、GUIが必要。
- (2)・QEMUを入れる。・・・UEFIブートを試すエミュレータ。
# apt install qemu-system-x86
- (3)・OVMFを入れる。・・・UEFIのBIOS(変な言い方だが、そう)というかファームウェアね。 Open Virtual Machine Firmware とかそんな感じの。
# apt install ovmf
- (4)・mingw-x64を入れる。・・・元はWindows用のgccなんだけど、UEFIから起動する実行ファイルは PE32+形式なので、それを吐けるコンパイラが必要。
# apt install mingw-w64
- (5)・UEFI_Basicを拾ってくる。あ、もちろんGitは先に入れといてね。(aptで)
$ git clone https://github.com/LHerrmeyer/UEFI_Basic
たぶんこれだけでいいはず。
実機で動くのか?†
- ちなみに、てきとーなUSBメモリーをFAT32フォーマットして、
USBドライブ名: /EFI/BOOT/BOOTX64.EFI
- のようにさっきのファイルを配置して、
- C:ドライブだったSSDを抜いておいて起動すると、ちゃんとBASICが起動する。
- だけど、メーカーロゴが残ったままだし、全画面じゃないし(中央部分にしかコンソールがprintしない)不満が・・・
感想:†
- うーん、なんだろう。PIC32MXでBASIC動かしたときもそうだったんだけど。
- まともなBASICインタプリタって、どっかに置いてくれないですかね。
- バグバグやん。
- こいつ、files とか loadとかsaveがない。
- なんも出来ん。
・・・
まだ続きがあります。
UEFI_Basic64の改造ソースコードをGithubに登録†
次に、
UEFI_Basic64に、Newlib (libc + libm ) を付け足してみる。†
やってみた
まず、Newlibのビルド方法から。
- cloneしてきたNewlibのソースと並列に ./build/ ディレクトリを掘る
- これは、いろんなターゲットにビルドされるので、元ソースのツリーでは、./configureさせないためにそうなっている。
$ cd Newlib/newlib-cygwin/ $ mkdir build $ cd build/ $ CC=x86_64-w64-mingw32-gcc ../newlib/configure CFLAGS_FOR_TARGET='-g -O2 -fPIC' --host=x86_64-linux --prefix=$HOME/x86_64-none-elf --target=x86_64-coff --disable-multilib
- configureがうまくいくと Makefileが出来るので、
$ make
- で、ここにlib.acとlibm.aが出来るはず、と、言いたいけれどエラーする。
- エラー内容は、 malloc_r.cの中の gcleanup()と wsbrk() が多重定義ってやつ。
- 結局、両方とも static をつけて回避した。
- ただし、こうやって生成したlibc.a では、UEFIでうまくmalloc()してくれない(printfも内部でmallocが必要なので、動かない)
- さらに対策をする。
- malloc_r.cに、 #define NANO_MALLOC が定義されていたら、このソースは使わずに、 nano-mallocr.c を代替で使うように書かれている。
- こちらを有効にして、ライブラリを作り直す。
- あとは、なんちゃってsbrk()を用意しておけば、おk
・・・みたいな。