Blog posts by @retrage

mirror of https://retrage.github.io/

今年の振り返り

今年もそろそろ終わりそうなので、何やったかを振り返ってみる。

OSはどうやってP-coreとE-coreを使い分けているのか

Alder Lake以降のIntel CPUでは、P-coreとE-coreの2種類のコアが搭載されている。 P-coreは性能重視、E-coreは省電力重視という位置づけで、OSがうまくこれらのコアを使い分けることで、消費電力と性能の両立が図られている。 ここまでの話は広く知られてい…

VisionFive 2をJTAGデバッグ

VisionFive 2 (以下、VF2) はStarFive Technologyが開発したSBCである。名前からわかるように、RISC-VのSoCを搭載している。ここではVF2をJTAGデバッグする方法を簡単にまとめる。 なお、この記事の内容は以下のVF2のフォーラムの投稿を参考に、具体的な手順…

2022年にやったこと

今年はブログ記事も書かなかったし、外から見えるアウトプットが目に見えて少なかった。今はまだ技術の貯金とか業務でコードを書いているのでいいが、そのうち技術も追いつかなくなって、「Twitterでは訳知り顔で抽象的な技術論を語るが、実際には手を動かし…

Allwinner NezhaにJTAGで接続する

Allwinner NezhaはD1という64-bit RISC-VなSoCが載ったSBCである。Linuxがちゃんと動くRISC-Vマシンとしてはかなり安価なため一部で人気がある。 ここではこれにJTAGで接続してみた話をメモ程度に書いておく。なお、今回は接続してOpenOCDで認識できた程度で…

Apple File Systemの下にはEFI driverが埋まっている

Apple File System (APFS)はAppleが自社製品向けに開発したファイルシステムである.APFSの仕様は公開されており以下で参照できる. https://developer.apple.com/support/downloads/Apple-File-System-Reference.pdf その目次の中で特に興味を引いたのが"EFI…

UEFI向け9P File Systemを作ってクラウドからネットワークブートできるようにした

UEFI向け9P File Systemを実装した. これにより9Pサーバからネットワークブートができるようになった. さらにFUSEと組み合わせることで少ない労力で9Pサーバ経由で クラウドからネットワークブートができるようになった. ソースコードと発表資料と発表の…

EDK2におけるDebugPrintErrorLevel

EDK2のコードにはDebugPrint()が多く埋め込まれている. この関数は第一引数にErrorLevelをとり, ビルド時に与えるPcdDebugPrintErrorLevelを変えることによりデバッグ出力を制御できる. この値は*.dscに以下のような記述をすることで設定できる. [PcdsFi…

ccov: printfデバッグを支援するツール

ここではコードカバレッジ計測を元にしたprintfデバッグ支援ツールであるccovを作ったので紹介する.

EFI_STATUSの値

毎回EFI_STATUSの値を調べるのが手間なのでここでまとめておく.

OVMFのデバッグ

ここではgdbを用いたOVMFのデバッグ方法について説明する. すでにOVMFのデバッグについて書かれた記事[1]が存在するが, ここでは特別なツールなどは使わずに通常のgdbでOVMFをデバッグする.

LLVMのEFI Byte Codeバックエンドを作る

ここでは開発しているLLVMのEFI Byte Code (EBC)バックエンドの概要と EBCバックエンド固有の問題などについてみていく. ソースコードは以下で公開している. yabits/llvm:retrage/ebc yabits/clang:retrage/ebc yabits/lld:retrage/ebc

文鎮化したMinnowboardを復旧させる

MinnowboardはIntel Atomを搭載した シングルボードコンピュータである. Minnowboardを使った実験で誤ったファームウェアを書き込んでしまい brick (文鎮化) させてしまったので SPI Flashを外部から書き換えることで復旧させる.

ELVMのEFI Byte Codeバックエンドを作る

ここでは ELVM のEFI Byte Codeバックエンドについて紹介する. 特にELVM IRとEFI Byte Codeのsemantic gapに注目する.

Linux kernelをUnikernelのライブラリ化する

Linux kernelをUnikraftのライブラリ化した. これにより機能の少ないUnikernelの資源として Linux kernelの持つ機能を利用することが可能となる.

正規表現からLLVM IRを生成する

正規表現は文字列マッチングなどに広く用いられている形式言語であるが, 等価な決定性有限オートマトン(DFA)に変換できることが知られている. google/redgrep は与えられた正規表現から等価なDFAに相当するネイティブコードを LLVMにより生成する. ここで…

技術書典6で新刊「UEFI読本 GRUB編」を頒布

2019年4月14日に池袋サンシャインシティで開催される 技術書典6において「海洋軟件」として 新刊「UEFI読本 GRUB編」を頒布する。 既刊「UEFI読本 基礎編 Linux編」も基礎編を分離し 「UEFI読本 Linux編」として頒布する。 配置先は「う27」である。

春の秋山郷の行き方 (2019年3月版)

2019年3月21日から24日かけて開催された「カーネル/VMキャンプ #9」[1]に参加した. 開催場所は秋山郷結東温泉「かたくりの宿」という元小学校校舎の宿[2]である. 東京から「かたくりの宿」までの公共交通機関でのアクセスがやや変則的なのでここにまとめ…

LinuxにおけるEFI Variableをみてみる

この記事は Linux Advent Calendar 2018 の20日目の記事として書かれた. ここではLinux kerenlにおけるEFI Variableのコードをみていく. EFI Variableとは UEFIでは,EFI varibale(EFI変数)というものが存在する. これは不揮発性メモリ(NVRAM)に値が書き…

ebcvm: A Usermode EFI Byte Code Virtual Machine

この記事は 自作OS Advent Calendar 2018 の19日目の記事として書かれた. ここでは,フルスクラッチで開発したEFI Byte Code Virtual Machineである ebcvm[1]と開発したのELVMのEBCバックエンド[2]について紹介する.

EFI Byte Code解説

本記事は2018年11月10日に開催されたkernelvm 北陸 Part4において 発表した内容[10]をまとめたものである. ここではUEFIの持つ独自のバイトコードであるEFI Byte CodeとそのVMについてみていく.

EFI stubなArch Linuxのインストール

QEMU上の仮想マシンにEFI stubなArch Linuxをインストールする。 ここでのホストはUbuntu 16.04.4 TLSとする。 なお[1][2][3][4]を参考にした。 OVMFのダウンロードとArch Linuxのインストールディスクのダウンロード 最初にOVMFをダウンロードして解凍する…

技術書典5で「UEFI読本 基礎編 Linux編」を頒布

2018年10月8日に池袋サンシャインシティで開催される 技術書典5において「海洋軟件」として 「UEFI読本 基礎編 Linux編」を頒布する. 配置先は「お09」である. UEFI読本 基礎編 Linux編 以下,本書「はじめに」より抜粋. UEFIが2005年に登場してから10年…

LKL.js: Linux kernelを直接JavaScript上で動かす

Linux kernelを直接JavaScript上で動かした. つまり,JSLinuxのようにEmulatorをJavaScriptで作成し, その上でLinuxを動かすのではなく, JavaScriptで書かれたLinuxを生成し,それを動かす,ということである. LKL.js Architecture リポジトリは以下の通…

HiFive1でZephyr

HiFive1とは,SiFiveによって開発されたRISC-V搭載のArduino互換ボードである. 一方,Zephyrは,Linux Foundationにより開発が進められている組み込み向けOSである. upstreamのZephyrはHiFive1に対応している. ここでは,ZephyrをHiFive1向けにビルドして…

RustでBrainfuck処理系を高速化して遊んでみる

Brainfuckとは><+-.,[]の8つの命令からなるプログラミング言語である. 実装が簡単であるために,すでに多くの言語によって実装がなされている. ここでは, Adventures in JIT compilation: Part 1 - an interpreter を参考にC++の実装をRustに移植し,その…

8cc in Lazy K

本日は4月1日で,エイプリルフールの日である. ただ,書いている現在は午後9時で,ちょっと嘘をつくには遅すぎる時間である.そこで,今回は何にも役に立たないものを作ってみようと思った. そこで,表題の通り,Lazy Kで書かれた8ccを生成して遊んでみた…

Google V8 JavaScript EngineでのWebAssemblyのi32.addの実装を見てみる

WebAssembly(以下,wasm)については,既に多くの解説記事が存在するため, wasmについての説明は割愛する. ここでは,wasmにおいてとある命令i32.addがどのように実行されるのかを見ていく. 参照する実装はGoogle V8 JavaScript Engineの 1b254a25163fd84a…

Rustでcoreboot payload

この記事は自作OS Advent Calendar の19日目の記事として書かれた. ここでは,corebootのpayloadをRustを使って作ってみる. corebootはファームウェアなのでOSとは異なるが,そこはご愛嬌ということで.

Linux kernelの5-Level Paging有効化部分を読んでみる

この記事はLinux Advent Calendar 14日目の記事として書かれた. 本記事ではLinuxにおける5-Level Paging(la57 paging)の実装を見ていく.