世界を動かす技術を、日本語で。

JavaScriptのためのUEFIバインディング

概要

UEFI Bindings for JavaScript は、UEFI環境でJavaScriptを実行できる仕組み。 Promethee がboot volumeから script.js を読み込み、ブートローダとして動作。 UEFIサービスをJavaScriptから呼び出し可能。 QEMU でのビルド・実行手順が用意されている。 Node.jsと Duktape ツールを利用した最小構成のビルド環境。

UEFI Bindings for JavaScriptとは

  • UEFIファームウェア上JavaScript を実行する仕組み
  • Prometheescript.js を読み込み、JavaScriptブートローダとして起動
  • UEFIサービス(例えば GraphicsOutput プロトコル)をJavaScriptから呼び出し可能
  • UEFIサービス連携 による高度なブート処理の実現

動作概要

  • Promethee がブート時に \script.js をUEFI FATボリュームから読み込み
  • script.js がエントリーポイントとして実行
  • UEFIの各種サービスへJavaScriptからアクセス可能
  • 例:画面描画、デバイス検出など

クイックスタート手順

  • 依存関係取得:./get-depsの実行
  • ビルド&QEMU実行:make runコマンド
  • script.js をUEFI FATボリュームの \script.js に自動コピー

サンプルコード例

  • script.js 内でGraphicsOutputプロトコルを利用
    • var gop = efi.SystemTable.BootServices.LocateProtocol(efi.guid.GraphicsOutput);
    • if (gop) { var red = { r: 255, g: 0, b: 0 }; gop.Blt(red, 'EfiBltVideoFill', 0, 0, 50, 50, 200, 120, 0); }
  • 画面領域塗りつぶし の実装例

注意事項

  • Duktape ツールはソース生成に Node.js を利用
  • ビルドは freestanding (最小限のlibcスタブのみ提供)
  • 独自のブートローダやOS開発に適した環境
  • 技術的な興味を持つ開発者向けのプロジェクト

Hackerたちの意見

わあ、これは呪われてるね。

r/unixpornがDOMサポートされたら喜びそうだね :^)

正しい言葉は「blursed」だと思う。

次のステップは、Reactを使ってUEFIのTUIを作ることだね(やめてほしいけど)。

OMG、それにはinkを使えるね。

お前のせいで、未来のマザーボードに呪いをかけたかもしれない、くそ!

今のゲーマー向けファームウェアのUIがどれだけひどいかを考えると、改善されるかもしれないね。

次はネットワークスタックを追加するんだよね?そうすれば、僕のお気に入りで一番役立つパッケージが使えるようになる? import isOdd from "https://unpkg.com/is-odd";

ブートローダーでGTA-IVの前にisOddを取得してるんだね。

新しいファームウェアには、HTTPやHTTPSを含むネットワークスタックがすでにあるよ。

誰かこれを分解して説明してくれない?Cを使って、jsインタープリタを読み込んで、UEFIの機能を囲むAPIをブートストラップしてるみたいなんだけど、合ってる?もしそうなら、APIがブートストラップされたら、実際にjsでOSを書けるってこと?それとも、まず移行しなきゃいけない他の抽象化があるの?

OSの定義によるけど、確かにそれはできるね :)

JSでOS?興味出てきたな…

それって、APIがブートストラップされたら、実際にJSでOSを書けるってこと?誰かやってる気がする。 https://www.google.com/search?q=os+kernel+in+javascript 少数の趣味でやってる人がいるみたい。高級言語でこれをやってる人も聞いたことある。基本的には、VMをブートストラップするための十分な低レベルコードが必要なんだ。それがあれば、高級言語でCコードにあたるロジックを決めたり、ページテーブルを操作したりできるようになる。

JSでOSを書くのにJSブートローダーは必要ないよ。ブートローダーはマシンを特定のメモリアドレスに落として、OSの初期化スクリプトを実行させるだけ。あの部分はJavaScriptインタープリターでもいいんだ。ただ、JavaScriptではアーキテクチャにあまり手を出せないから、メモリを直接タイプにマッピングすることはできない(もし知らない非現実的なことがあれば別だけど)。だから、ポートやレジスタ、テーブルにアクセスしてユーザースペースを設定するためにはCやアセンブリに落ちる必要があるよ。

数年前に誰かがLinuxをasm.jsにコンパイルしたって聞いたことあるけど、実際にそうだったんじゃないかな。asm.jsはJSのサブセットだから、もうやっちゃったって言えるよね。理論的には、そこからJSで作業を続けることもできるし。

このプロジェクトは面白いことになるよ。生産向けじゃないおかしなプロジェクトみたいにね。 :)

これ最高!機械に対する完全な支配の例だね。面白い引用もあるし(笑) > 「プロメテウスは神々から火を盗んで人間に与えた。そのため、岩に鎖でつながれ、永遠に拷問された。」

引用の話だけど、readmeの最後にあったこのメモがすごく好きだった:> 「これを見てニヤッとしたなら、あなたはおそらくトーチを持っている。」

「JavaScriptの誕生と死」が現実になりつつあるね。

これも投稿しようと思ってた!動画の直接リンクはこちら: https://www.destroyallsoftware.com/talks/the-birth-and-death...

浮動小数点数をサポートしてるのかな?UEFI環境で安全に使えるかはわからないな。(GRUBのLuaは整数専用だったし、Linuxはカーネルモードで浮動小数点演算を避けてたけど、その理由は忘れちゃった。)

うん、浮動小数点数は使えるよ。

浮動小数点はFPレジスタを保存/復元しなくて済むように、Linuxカーネルではサポートされてなかったんだよね。

これを見てニヤニヤしちゃうなら、君は多分トーチを持ってるね。でも、もしこれが恐怖で身を引かせるなら?虚空に叫ぶ。

おお、ついに「メタル」ステージに到達したね!

自分も頑張ってるよ ∠(‘-‘)

あの動画を年に一度見ることを思い出させてくれてありがとう(笑)

うわ、ASM.jsのことは詳しく追ってなかったな。Metalがカーネルとユーザースペースの境界をメモリのVM保護で置き換えて、システムコールのオーバーヘッドを排除するってことは、ASM/VMのオーバーヘッドがその代わりにかかるってことか。面白いアイデアだね。冗談だけどさ...

俺だけかもしれないけど、この人…大きな間違いを犯したんじゃないかな?言葉で現実を曲げようとしてた気がする。俺のノートパソコンで動いてるアプリがたくさんあって、各アプリが300MB以上(例えばSpotify)使ってるのに、AIの助けを借りてネイティブSwiftで書かれた他のアプリは最高のパフォーマンスを出してるのが見えるよ… 追記。今のRAMの価格もさ...

ガリーがどれだけ間違ったことを言ったかを見るのは面白いね。