情弱ログ

参考にならないので当てにしないでください

12ステップOS自作本の開発環境をGentoo Linux + crossdev + gcc 7.3.0で構築した話

10月の初旬に「12ステップで作る組込みOS自作入門」という本を買いました。

Amazon CAPTCHA

H8というCPUが乗ったマイコンボード上に組込みOSを動かすという内容で、サボりつつも2ヶ月程度で完成させることができました。
かいつまんでやったことを紹介すると、ELFファイルをXMODEMで受信し、RAM上に展開して実行するブートローダの作成を前半6回で行い、システムコールやスレッド管理、スケジューラを持つOSの作成を後半6回で行います。

アセンブリリンカスクリプトの書き方を始めとし、割り込みやメモリ管理といったOSの基本的な機能まで丁寧に説明しているので、専門外の私でも理解することができました。
実機やシリアルコンソールの購入が必要なため、本と合わせると一万円弱の出費が必要ですが、OS自作というレアな実績が解除できるので非常におすすめです。

ただし、初版の出版が2010年と少し古く、推奨環境がUbuntu9.10やWindows XPといったサポート切れのOSになっています。
筆者のHPで構築済みのVMが配布されているため、これを用いれば問題ないのですが、クロスコンパイラのビルドという一つの大きなタスクが未消化に終わってしまいます。

一方、Gentoo Linuxといえば(運が良ければ)GCCのビルドがコマンド一発でできるディストリビューションとして、一部のクラスタから熱狂的な支持を集めています(多分)。
更にcrossdevというツールを用いるとコマンド一発でクロスビルド環境が整うという、まるで本書のためにあつらえたかのようなディストリビューションです。

そこで今回はGentoo Linux + crossdevでh8300-elf-gcc 7.3.0な環境を構築するまでのメモです。

続きを読む

引数の数が関数の実行時間に及ぼす影響を調査した話

x86_64の呼び出し規約では、関数の引数は主にレジスタを使って渡すように定義されている。
主に、というのは引数の数が6個まではレジスタ(%edi、%esi、%edx、%ecx、%r8、%r9)を使って渡し、7個以上の場合はスタックに置いて渡す形式となっているからだ。

レジスタとメモリアクセスでは明らかに後者のほうが遅いため、関数の引数が7個以上になると6個以下の関数に比べて実行時間が増加するのでは?と思い検証してみた。

続きを読む

Linuxの共有ライブラリ呼び出し(呼び出し側編)

Linuxで共有ライブラリの関数を呼び出す際、PLTを経由して関数が呼び出される。PLTとはProcedure Linkage Tableの略で、PLT経由で呼び出す関数のアドレスは動的リンカが解決してくれる。この機構を追ってみた。

続きを読む

PIE(position-independent executable)なオブジェクトの中身を見てみる

巷ではSpectre/Meltdownが話題になっている.

有効な対策として(K)ASLRが挙げられており,これはプロセス実行時のメモリ空間の配置をランダマイズすることで,例えば攻撃者が配置したコードのアドレスへのJMP等を防ぐことができる.
詳しくはシェルコードでググろう(解説できるほど詳しくない).

共有ライブラリは原則的にPIC(position-independent code)としてビルドされており,これらはASLRの恩恵に与ることができる.

しかし,通常のアプリケーションは絶対アドレスを用いて記述されているため,ASLRによるランダマイズが適用できない.
そこで,セキュリティ向上のために相対アドレスを用いたPIE(position-independent executable)と呼ばれる形式が通常のアプリケーションにおいても使用されている.

昔はセキュリティ上重要なファイルだけがPIEでビルドされていたらしいが,最近ではGentoo Linuxのprofile 17.0からPIEでのビルドがデフォルトオプションになったりしている.(これ全パッケージのリビルドが必要なので,まだ更新できてないです.同時にpython3.4がstableに降ってきたりして酷いことになりました…)
https://www.gentoo.org/support/news-items/2017-11-30-new-17-profiles.html

しかし,PIEでビルドした場合はパフォーマンスの低下が懸念されている.論文ではベンチマークであるSPEC CPU2006を用いて評価実験を行い,幾何平均で9.4%のパフォーマンス低下という結果を得たと述べている.
だが,実際にPIEを用いることで何がボトルネックになっているのか分からないので,今回はPIEなオブジェクトの中身を見てみる.
中身が見たくて見てるので,パフォーマンス低下の考察なら論文でしてると思うよ.

続きを読む

vtableの中身を見てみる

C++ポリモーフィズムを実現するためにvtableと呼ばれる機構が用いられている.
だいたいの入門本でvtableという言葉は出てくるものの,実装については特に触れられていないので中身を見てみた.

続きを読む