2024/05/01 更新
この記事は、自作OS Advent Calendar 2017の 12/4 の記事として書かれました。C 言語と JavaScript、それに両者を繋ぐ役割を持つ Web IDL についてのメモです。
主に、仕様書のダウンロード・サイトなどの URL を集めてみました。この他の URL は、以下でブックマークを公開していますので、興味がある方は参照してみてください。
- ソースコード(UTF-8 など)
- トークン列
- 解析木または抽象構文木
- 中間言語(WebAssembly など)
- アセンブリ
- オブジェクト・ファイル(PE, ELF など)
- コード署名が付加されたオブジェクト・ファイル(PE など)
ソースコードを Unicode の符号化方式の一つ、UTF-8 への対応を行う際に参考になる資料は以下の通りです。
- [改訂新版]プログラマのための文字コード技術入門:書籍案内|技術評論社
- Unicode標準入門(Tony Graham 関口正裕 乾和志 海老塚徹)|翔泳社の本
- JIS X 0221:2020 国際符号化文字集合(UCS)
自作OS Advent Calendar 2017向けに書いた記事では、Unicode の概要を簡単に説明しています。タイトルは UTF-32 となっていますが、UTF-8 でも参考になると思います。
C 言語を選択する理由ですが、特定の企業に所有されておらず、国際標準規格であることが利点です。また、言語仕様が比較的小さく、個人でも実装可能な範囲に収まっていると思います。スクリプト言語を選択しないのは、スクリプト言語のパッケージが C の拡張を含む場合、POSIX API に依存していることも多く、移植性が低いです。同様の理由で、Java VM や .NET の言語も採用できません。
仕様に関する主な情報は以下の通りです。
- CPP-TEST == Validation Suite for Standard C Conformance of Preprocessing ==
- C++でCプリプロセッサを作ったり速くしたりしたお話
- JIS X 3010:2003 プログラム言語C
- ISO/IEC 9899:201x
- ISO/IEC 9899:2017
- Clarification Request Summary for C11
- ISO/IEC 9899:2023
コンパイラが Language Server Protocol のサーバを実装することで、Language Server Protocol のクライアントを実装している統合開発環境(IDE)やテキストエディタで、コード補完などの機能が使えるようになります。
- Language Server… by Shunsuke Shibayama
- language server protocolについて (前編) - Qiita
- Official page for Language Server Protocol
中間言語として、WebAssembly や WebAssembly を拡張したものを利用することを利用することを検討しています。WebAssembly は Web ブラウザだけでなく、組み込み環境向けにも使われることが想定されています。
アセンブリ言語の仕様として有名なのは、AT&T 構文と Intel 構文です(AT&T 記法・Intel 記法とも呼びます)。
コンパイラが生成するアセンブリ言語の関数呼び出しなどのルールを定めた仕様は、ABI(Application Binary Interface)と呼びます。x64 の UEFI では Microsoft の x64 呼び出し規約が採用されています。
- System V ABI - OSDev Wiki
- System V Application Binary Interface - DRAFT
- ELF Handling For Thread-Local Storage
- x86 psABIs / x86-64 psABI · GitLab
x64 の場合、オブジェクト・ファイルは PE32+ か ELF であることが多いです。UEFI では PE32+ が採用されています。
- PE Format - Win32 apps | Microsoft Learn
- The Linux EFI Boot Stub | Intel® Architecture Firmware Resource Center
UEFI セキュアブートを有効化した状態で UEFI アプリを実行可能にするためには、UEFI アプリである PE32+ オブジェクト・ファイルに Microsoft のコード署名を付加する必要があります。2017/12/04 現在、Microsoft のコード署名には EV 証明書が必要です。EV 証明書の維持費は高額ですし、EV 証明書の取得は、企業が対象です。EV 証明書の取得のために企業を設立するのは現実的な選択肢ではありません。
上述の制約は、Microsoft のコード署名が付加された shim ブートローダを利用することで、回避することが可能です。
- mjg59 | Secure Boot bootloader for distributions available now
- tenpoku1000/UEFI_SecureBoot: UEFI セキュアブートのサンプル UEFI アプリケーションです。
shim ブートローダは、UEFI の NVRAM(Non-Volatile RAM:不揮発性 RAM)に格納される UEFI 変数に、MOK(Machine Owner Keys:マシン所有者鍵)という鍵を MokManager UEFI アプリで登録する必要があり、shim ブートローダから起動される UEFI アプリは、MOK でコード署名されている必要があります。
MOK の構造は、次の「Authenticode 署名」で説明します。
PE32+ オブジェクト・ファイルに格納されている Authenticode 署名は、RFC 2315 で規定されている PKCS #7 の SignedData に、ASN.1(Abstract Syntax Notation One)形式でファイルに格納されています。
RFC 2315 : 9.1 SignedData type
The signed-data content type shall have ASN.1 type SignedData:
SignedData ::= SEQUENCE {
version Version,
digestAlgorithms DigestAlgorithmIdentifiers,
contentInfo ContentInfo,
certificates
[0] IMPLICIT ExtendedCertificatesAndCertificates
OPTIONAL,
crls
[1] IMPLICIT CertificateRevocationLists OPTIONAL,
signerInfos SignerInfos }
PKCS #7 の SignedData の certificates には署名に関する X.509 証明書(これも ASN.1 形式です)を格納します。本稿では、上述の MOK を格納します。signerInfos には署名群(コード署名など)を格納します。
- HIRT-PUB14002:Authenticode 署名:Hitachi Incident Response Team:日立
- RFC 2315: PKCS #7: Cryptographic Message Syntax Version 1.5
X.509 証明書の生成や、コード署名に必要な暗号化アルゴリズムは、比較的早く陳腐化するので本稿では割愛します。コード署名サービスを利用することで、Windows アプリを配布する場合にセキュリティ警告表示を抑制することができます。
- インターネットX.509 PKI:証明書とCRLのプロファイル
- RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
- RFC 6818: Updates to the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
2017/12/04 現在、LLVM プロジェクトで公開されている PDB のドキュメントは、未完成です。
- デバッグ情報の歩き方 - Qiita
- DWARFファイルフォーマット - Dr.Deamon64 Wiki - Dr.Deamon64 - OSDN
- Download DWARF Standards
- LLVM Project Blog: LLDB is Coming to Windows
- 本の虫: MicrosoftがPDBフォーマットの構造体定義のソースコードを公開
- 本の虫: LLVMがWindowsのデバッグ情報フォーマットのPDBをサポート
- The PDB File Format — LLVM 6 documentation
- Microsoft/microsoft-pdb: Information from Microsoft about the PDB format. We'll try to keep this up to date. Just trying to help the CLANG/LLVM community get onto Windows.
- CodeView
構造化例外処理は、Linux 等の POSIX 系の環境の signal に相当するものです。コンパイラやリンカが例外処理用の情報を PE32+ オブジェクト・ファイルに付加出来ることが必要です。
コンパイラやリンカなどで実装が必要なセキュリティ関連の機能を集めてみました。
2024/05/01 現在、Alder Lake や Raptor Lake 等のクライアント向け CPU では Intel MPX は実装されなくなっています。
- Intel Memory Protection Extensionsとその活用
- Software Design 2015年5月号|技術評論社 Linuxカーネル観光ガイド【38】Linux 3.19の新機能~Intel MPX機能のカーネル側対応
- /GS (Buffer Security Check) | Microsoft Learn
- Compiler Security Checks In Depth
- “FFR EXCALOC”- コンパイラのセキュリティ機能に基づいたExploitabilityの数値化 -
JavaScript の言語仕様は、ECMA-262 で規定されています。完全に和訳された JIS 規格票は無く、規格書を和訳した書籍が過去に出版されたことがあります。
asm.js は WebAssembly が登場する前に、JavaScript の言語仕様に制限を設けることで、C/C++ など JavaScript 以外の言語で書かれたソースコードを asm.js に変換するために作られた仕様です。Web ブラウザ上で実行する際に、WebAssembly よりも asm.js の構文解析に要する時間がかかると言われています。asm.js に対応していない環境では、通常の JavaScript として解釈・実行されます。
JavaScript のデバッガは、ブラウザ・エンジン毎にプロトコルが異なりますが、これを統合する動きがあるようです。
JavaScript のソースコードをコンパイルした結果、コンパイルする前のソースコードとの行の対応などを確認したいことがあります。Source Map を使うと良いようです。WebAssembly のサイトでも、Source Map について言及されています。
- Use a source map — Firefox Source Docs documentation
- Safx: JavaScriptのSource Mapの内部表現について
- Source Map Revision 3 Proposal - Google ドキュメント
Web ブラウザと Web サイトとの通信内容を保存してデバッグに役立てるためのファイル形式です。2024/05/01 現在、標準仕様としては発表されず、放棄されているようです。
- Generating HAR files and Analyzing Web Requests - Atlassian Documentation
- HTTP Archive (HAR) format
- HAR 1.2 Spec | Software is hard
ツールなどから、プログラムの構造を操作したいことがあります。ESTree は JavaScript の抽象構文木を表現するコミュニティ標準です。
WebAssembly の JavaScript 専用版みたいなものです。WebAssembly や asm.js と異なり、従来からの JavaScript を高速化する試みだと思われます。
JavaScript の抽象構文木を表現する ESTree などに対して、括弧や空白などを含む解析木を表現する仕様である JavaScript CST が考案されていたようですが、仕様の策定は断念されたようです。
- [2015-02] 最近のJavaScript AST標準化の動き | Web Scratch
- getify/concrete-syntax-tree: Defining a standard JavaScript CST (concrete syntax tree) to complement ASTs
Web IDL は、C 言語と JavaScript の両者を繋ぐ役割があります。Web ブラウザを実装するなら、Web IDL コンパイラが使えるようになっていた方が良いでしょう。