UEFI_Basic

2022-08

UEFI BOOTなBASICインタプリタ

要点

  • ソースは、かなりあっさり。
  • 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させると、変な行番号が出て止まったりする。)

https://iruka-git.github.io/ATMEL_AVR/upload/uefi.png



環境構築メモ

  • (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

・・・みたいな。