徒然ネル

LinuxカーネルとかeBPFとか

itmediaの「main()関数の前には何があるのか」を読んでみる(第二回)

itmediaの「main()関数の前には何があるのか」の連載を読んでわからなかったことや、調べたことをメモする

(作者サポートページ)

 

第二回は"「Hello World!」の主役printf()の内部動作をデバッガGDBで追う"

 

gdbserverを使う話が出てきた

Remote Debugging using GDB - CodeProject

https://www.codeproject.com/KB/mcpp/remote_debugging/3.jpg

 

 

printfの逆アセンブル結果のニーモニックleaがわからなかった

movはラベルを指定すると、ラベルの先にある中身をコピーする。

leaは、アドレスの先の中身ではなく、アドレスそのものをコピーする。

https://3iz.jp/try-assembly.html#:~:text=mov%E3%81%AF%E3%83%A9%E3%83%99%E3%83%AB%E3%82%92,%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%82%92%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B%E3%80%82

movは中身の値、leaはアドレスをコピーするみたい

 

ニーモニックleaveも知らないな

調べてみると、

leave命令は、以下の2つの命令を組み合わせたのと同等の処理をします。

mov esp, ebp
pop ebp

https://vanya.jp.net/os/x86call/#enterleave:~:text=leave%E5%91%BD%E4%BB%A4%E3%81%AF,ebp%0Apop%20ebp

とのこと。

retの前に必要な処理みたい

retはスタックに積まれてるアドレスから呼び出しもとに戻る命令

上でも参照した以下のサイトが関数呼び出しについてわかりやすかった

x86アセンブリ言語での関数コール (vanya.jp.net)

 

 

itmediaの「main()関数の前には何があるのか」を読んでみる(第一回)

itmediaの「main()関数の前には何があるのか」の連載を読んでわからなかったことや、調べたことをメモする

 

第一回は"「Hello World!」の中身を探る意義と環境構築、main(C言語)のアセンブラコードの読み方"

 

4ページ目の

「*(int *)((char *)EBP+0xc)」

が、なんでcharでキャストしてるのかわからん

→1 byteずつ明示的にアドレスを加算するためだと思われる(追記)

 

4ページ目のスタックの扱いから難しい

and命令ではスタックポインタに0xFFFFFFF0を論理積でかけあわせることで、スタックポインタを16バイト境界にそろえているようだ。

ようわからんなーと思ったけど、具体的なアドレスで考えるとわかった。

16進数で下一桁を0にすることで、16バイト境界に合わせてスタックのアドレスを下の方に移動(ゼロアドレスに向かって移動)させてるのね。

 

自動変数がなにか知らんかったけど、main関数内のローカル変数のことらしい。

 

push命令周りの話は以下の記事の解説がわかりやすそう

第六話:EBPとESP、スタック領域の使われ方|トリコロールな猫 (note.com)

 

スタックの絵を書いて、アドレスがどこを指してるのか追っていかないとわからんな。

 

あと、x86アーキテクチャレジスタ名について参照しながらじゃないとわからんくなる。

x86レジスタ 備忘録 #CTF - Qiitaより

 

関数からのリターンで、

 x86アーキテクチャでは、関数からの戻り値はEAXレジスタで返される。つまりこれはmain()関数の終端にある「return 0」の戻り値を準備していることになる。

と書いてあるけど、関数からの戻り値が0以外の場合どうなるんだ?

 

関数の先頭は16バイトや32バイトなどのキャッシュラインにアラインメントされていたほうがキャッシュ効率が良くなり、高速性が高まる。

これもわかんねー

キャッシュラインにアラインメントがわからん。

 

 

次、読み返す際に、やること。

 

2023年度振り返って(私生活)

2023年度ももう終わり

ということで2023年度の振り返りを残しときます。

 

書いてたら長くなっちゃったから、私生活と仕事で分けます。

それでは、私生活の振り返り~

 

4月

東京に引っ越して、新生活の準備が大変でしたね。

新生活需要で洗濯機の配送に2週間以上かかるなんで知らなくて、しばらくコインランドリーに通うことになりましたね。大変でした。

週末は大学の上京組とよく遊んびましたね。

 

5月

GWに帰省して、奥さんご両親へのご挨拶、うちの家族との食事会をしました。

どうなることやらと、ビビってたけど無事に歓談できました。

あと、職場にカナダから海外インターンの学生が来て、週末に東京案内しましたね。

 

6月

新生活落ち着いたころだったかな?

週末は海外インターン生をつれて遊び回ってました。

横浜のカップヌードルミュージアムに行ったり、温泉につれてったり、プロ野球の試合につれてったり。

海外インターン生の希望で、柔道教室に通い始めたのもこの頃だっけか

 

7月

FLOWのライブに行きましたね。ロックバンドのアニソンいいですね。

2024年もFLOWのライブに行きます。(しかもアニソンロックフェスとかいう激アツイベ)

海外インターン生と一泊二日で日本で二番目に高い北岳に登りました。

きつすぎて死ぬかと思った。

 

8月

お盆前から帰省して帰省中はリモートで働いて、東京帰ってきてから休暇取りました。

帰省中に海外インターン生が福岡に遊びに来たりもしました。

お盆明けは奥さんも東京に来てて、一緒にミラコスタに泊まったりしました。

ミラコスタでプロポーズもしました。

8月末に海外インターン生がカナダに帰っちゃいました。

一緒にあっちこっち遊びに行ったから結構寂しかったな。

 

9月

会社の同期と遊びに行くことが多かったな。

 

10月

人生初の人間ドックを受けました。もうしばらくは胃カメラやりたくない。

 

11月

祝日があったので、2回ほど福岡に帰りました。

結婚指輪を買いに行きました。

 

12月

結婚後の新居探しに行きました。希望通りの物件を探すって難しいね。

そこそこ希望に沿った物件を見つけられたので良かった。

あと、入籍しました。

年末、福岡に帰省して、奥さん家族と一泊二日の旅行に行ってきました。

緊張したけど楽しかったな。

 

1月

両家顔合わせを実施。

自分たちよりも、両家の両親のほうが緊張してぎこちなかった。

東京に戻ってすぐ、新居に引っ越しした。引っ越しマジ大変。

 

2月

私の両親と弟と釜山旅行に行ってきました。

今後、奥さんと暮らし始めたら、親と旅行もなかなか行かないかなと思って行ってきました。(奥さんは仕事の都合で福岡にいたので、まだひとり暮らし中)

 

3月

月末に奥さんが福岡から東京に引っ越してきました。

もうちょっと新居の収納を準備してあげれてたら良かったな。

申し訳ない。

 

スケジュール帳を見ながらバタバタと書いたので、また後で見返して書き直したり追加したりしたいな。

 

eBPFに関する情報まとめ

eBPF関連の記事や情報をメモ

BCCインストールからexampleコード実行まで

eBPFのフロントエンドツールであるBCCをインストールしたので備忘録

 

環境

Ubuntu 22.04 server (full install)

カーネルバージョン:5.15.0-101-generic

 BCCと依存関係のあるライブラリをインストール

# For Jammy (22.04)
sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
  libllvm14 llvm-14-dev libclang-14-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools \
  liblzma-dev libdebuginfod-dev arping netperf iperf

BCCのインストールとコンパイル

git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build
cmake ..
make
sudo make install
cmake -DPYTHON_CMD=python3 .. # build python3 binding
pushd src/python/
make
sudo make install
popd

exampleの実行

cd ~/bcc/examples

$ sudo python3 hello_world.py 

実行結果

b'           <...>-3632    [002] d...1  1136.279260: bpf_trace_printk: Hello, World!'
b''
b'            node-3632    [002] d...1  1136.285979: bpf_trace_printk: Hello, World!'
b''
b'            node-3632    [002] d...1  1136.304155: bpf_trace_printk: Hello, World!'
b''
b'     cpuUsage.sh-11298   [001] d...1  1136.313026: bpf_trace_printk: Hello, World!'
b''
b'     cpuUsage.sh-11298   [001] d...1  1136.321563: bpf_trace_printk: Hello, World!'
b''
b'     cpuUsage.sh-11298   [001] d...1  1136.324960: bpf_trace_printk: Hello, World!'
b''
b'     cpuUsage.sh-11298   [001] d...1  1136.328242: bpf_trace_printk: Hello, World!'
b''
b'     cpuUsage.sh-11298   [001] d...1  1136.331308: bpf_trace_printk: Hello, World!'
b''
b'     cpuUsage.sh-11298   [001] d...1  1136.334393: bpf_trace_printk: Hello, World!'
b''
b'     cpuUsage.sh-11298   [000] d...1  1137.349559: bpf_trace_printk: Hello, World!'

参考

bcc/INSTALL.md at master · iovisor/bcc (github.com)

 

eBPFシステム

eBPFシステム関係のメモ

 

システム概要図

eBPF - 入門概要 編 (zenn.dev)

Verifier

Program type

ヘルパー関数

kprobe

  • アタッチ可能な関数一覧
    • /sys/kernel/debug/tracing/available_filter_functions

tracepoint

  • アタッチ可能な一覧
    • bcc toolsに含まれるtplist(8)の出力から得られる