2010-01-01から1年間の記事一覧

動的ライブラリの観察その4

前回は、動的ライブラリの関数へのシンボル参照は、/usr/lib/libSystem.B.dylib の中の dyld_stub_binder の中で解決された〜、というところまで見た。今回は dyld_stub_binder の中で何が起こっているのかをもう少し見てみる。 ソースは前回と同じ。 動的ラ…

動的ライブラリの観察その3

前回は動的ライブラリの関数が実行される様子の概要を観た。今回は詳細を観察してみる。事前にhoge1のセクション一覧を取得しておく。(出力結果抜粋) $otool -l hoge1 Section sectname __text segname __TEXT addr 0x0000000100000ec8 size 0x0000000000000…

動的ライブラリの観察その2

今回は動的ライブラリの関数呼び出しの様子を観察してみる。動的ライブラリで定義されている関数のアドレスは動的ライブラリがメモリにロードされるまで決定しない。そのどこに有るかわからない関数をどのようにして呼び出すのかが見どころ。 動的ライブラリ…

動的ライブラリの観察その1

今回からは動的ライブラリが利用される様子を観察してみる。 ライブラリとは リンク可能なオブジェクトファイルの集まり。ライブラリには静的ライブラリと動的ライブラリが有る。 静的ライブラリ 実行形式ファイルには必要なコードが全てコピーされる 実行形…

C++のprivateプロパティを改竄する

前回、C++(gcc)のインスタンスの正体はインスタンス変数(プロパティ)を格納するための記憶領域だと言うことがわかったので、それを元にチョットお遊び。 ソース(Hoge9.cpp) #include <stdio.h> class Hoge9 { private: int hoge; public: void printHoge(); }; void H</stdio.h>…

C++のインスタンスとは

オブジェクト指向の入門書の冒頭にはこういう説明がよく出てくる。 クラスはオブジェクトの設計図 オブジェクトはデータと振舞いをカプセル化したもの インスタンスはオブジェクトの実体 これが C++ ではどのように実現されているかを今回は観察してみる。 …

OS Xの「現在非使用中」のメモリを開放する

自分のマックはメモリが 4GB の MacBook Pro。ちなみにこれがMacデビュー機。VMWareを2個以上起動するとMacの動きもVMWareの動きもカクカクカクカクで使い物にならなくなる。三万円くらいの8GBメモリがネットに有ったので換装してみた。Micron製のMT16JSS512…

Mach-Oのリロケーション情報を読み込む

引き続き、共有ライブラリの仕組を知るための準備でMach-Oの構造を調べる。今回はリロケーション情報を読み込んでみる。環境はx86_64 リロケーションとは 最終形式にリンクされる前の中間形式のMach-Oファイルにはコードやデータが含まれているが、コードに…

__PAGEZEROセグメントでヌルぽ体験

前回、Mach-Oのセグメント定義をロードしたときに__PAGEZEROセグメントと言うのが出てきた。興味を引かれたのでもうちょっと触ってみる。環境はx86_64。 __PAGEZEROセグメントに関して、アップルのリファレンスにはこう書いてある。 __PAGEZEROセグメントは…

Mach-Oのセグメント&セクション定義を読み込む

今回も引き続き共有ライブラリの仕組を知るための準備としてMach-Oの構造を学習。今回はセグメントとセクションに関する情報を読み込んでみる。環境はx86_64 セグメントとセクション 図1のように、Mach-Oファイルにはロードコマンドに続いてセグメントと呼…

Mach-Oのシンボルテーブルを読み込む

前回に引き続き共有ライブラリの仕組を知るための準備としてMach-Oの構造を調べる。今回はシンボルテーブルを読み込んでみる。環境はx86_64。 シンボルとは 私達がソースを書く時には関数や変数に int i; i = foo(); の様に文字列の名前を付ける。しかし、CP…

Mach-Oのヘッダとロードコマンドを読み込む

動的ライブラリの仕組みを知りたかったので、その準備としてMach-Oの構造について調べてみた。環境はx86_64。 Mach-Oとは Mac OS Xでプログラムやライブラリをディスクに格納するために標準で使用されるフォーマット。中間形式(リンク前)にも最終形式(リンク…

カーネル制作体験

低レベル層に興味がある人にはインテルの、ここ(日本語資料)とか ここ(英語資料)とかにあるソフトウェア開マニュアルは非常に面白い読み物だと思う。でも実際に試してみないと分かった気がしないなーと言うことでカーネルを作ってみることにした。とりあえず…

MMX,SSE体験

アセンブラ。インストラクションリファレンスを眺めながら、「あ、これ試してみよー」みたいなのが出来て楽しいな。基本情報なんとか試験用に考案されたCOMET IIというシンプルな仮想コンピュータとそれ用のアセンブリ言語のCASL IIと言うのが有る。いきなり…

インラインアセンブラでCPUIDその4

i386用の実行ファイルでエラーが発生した原因はPICで利用するebxレジスタをcpuid命令が破壊してしまったことが原因だった。 ではなぜx86_64用の実行ファイルではエラーが発生しなかったのかを今回は調べてみる。 一時ファイルを残すようにコンパイル。 $ gcc…

インラインアセンブラでCPUIDその3

今回は前回チラっと出てきた「pic」について。 PICとはPosition Independent Codeのこと。 仮想メモリ上のどこにロードしても、何も手を加えずに動作させることのできるコードのこと。 プログラムは通常はディスクにファイルとして存在し、実行時にメモリに…

インラインアセンブラでCPUIDその2

前回のエントリ( d:id:teru_kusu:20100203 )で次のようなコードをx86_64用のコードにコンパイルすると実行しても問題ないが、i386用のコードにコンパイルすると実行時にBus Errorと言うメッセージと共にクラッシュすると言う現象が発生。 この原因を今回は調…

インラインアセンブラでCPUID

インテル系(x86)アーキテクチャのcpuid命令を使用して、 プロセッサがサポートするリニアアドレスと物理アドレスのビット幅を取得してみる。 プログラムがメモリにアクセスするためには CPUのメモリ管理機構を経由することになる。 その中でアドレス変換が行…

SnowLeopardカーネル入れ替え

Mac OS X 10.6.2 のカーネルを自分でビルドしたxnuに入れ替えてみた。 環境 機種名: MacBook Pro 機種 ID: MacBookPro5,5 プロセッサ名: Intel Core 2 Duo プロセッサ速度: 2.53 GHz プロセッサ数: 1 合計コア数: 2 二次キャッシュ: 3 MB メモリ: 4 …

低レベルが面白い

初はてなダイアリー(祝) 仕事では主にJavaを使ったウェブアプリを設計・制作してきた。 携帯電話向けのJavaアプリも作ってきた。 その前はPerl製CGIでコミュニティサイト(今で言うSNS?)を制作したり。 と、低レベルの事はあまり意識する必要もなくやってきた…