kernel

Linux: pid numberからtask_structの取得

pid numberからtask_structの取得のめも pid番号から直接task_structは取得できないので、pid構造体の取得 -> task_struct構造体の取得という流れになる。 pid名前空間を気しなくて良い場合は、find_get_pid()でpid構造体を取得し、pid_task()でtask_struct…

Linux netns: グローバルなNet Namespace

グローバルなnsproxyに設定するNet Namespaceの変数のinit_nsめも これはコンパイル時にはリストしか初期化していないので、その他のデータはカーネルの起動時に初期化してます。 35 struct net init_net = { 36 .dev_base_head = LIST_HEAD_INIT(init_net.d…

Linux net namespace: pernet_deviceめも

Linuxのnet namespaceにpernet_listというpernet_operation構造体のリストがあって、これがどのように設定されてるのかのめもです。 読んでるカーネルのバージョンは4.1です。 pernet_listを使ってるところは以前書いたこちらの記事にあります。 kernhack.ha…

exit(2)とpid namespaceめも

プロセスが終了するときにもpid namespaceが関係するので、その辺りのめもです。 流れとしてはこんな感じです。 do_exit()@kernel/exit.c -> exit_notify@kernel/exit.c -> forget_original_parent()@kernel/exit.c -> find_child_reaper()@kernel/exit.c ->…

perf-reportめも

Linux 4.5からperf reportのソート方針がちょっと変わっているので忘れないようにメモ。 こんな感じでprobeを設定し、 perf probe -a _do_fork こうやって実行する。 perf record -e probe:_do_fork -aR sleep 10 そして、perf reportを使った場合、 perf re…

kallsymsのめも

/proc/kallsymsをスクリプトで読むときにちょっとハマったので。 なにかというと、下の出力で、ext4_file_operationsはext4モジュールに含まれているというのがわかります。で、_do_forkのほうはモジュールにないので3カラム目まで。 masami@saga:~$ grep ex…

bccでuprobes

前回(LinuxのBPFとbccでデバッグする - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ)はbccを使ってkprobeでカーネル内の関数にprobeを設定したので今回はユーザーランドのほうでuprobesを使うメモ。 fork()が呼ばれたときにプロセス名、pid等を表示する。 …

LinuxのBPFとbccでデバッグする

最近公開されたスライドでLinuxのパフォーマンスチューニングとかDTraceで有名なBrendan GreggさんのLinux BPF Superpowersが面白かったのでBPFとbccに手を出してみました。 BPFはLinuxカーネルのパケットフィルタリングの機能で、その名の通りBerkeley Pack…

systemtapでカーネルの関数を呼ぶメモ

systemtapのスクリプトでカーネル関数を呼ぶのはどうやんだっけ?というところのメモです。 c言語の関数を作って、それを呼び出す形で実装しました。systemtapのマニュアル 3 Components of a SystemTap scriptの3.5~3.7にcの関数を組み込む方法の説明があり…

strncpy_from_user()を読んで見る

なんとなくLinuxカーネルのライブラリにあるstrncpy_from_user()を読んでみます。 ファイルはlib/strncpy_from_user.cです。 関数名から何をするかは想像つきますね。関数はこうなってます。 99 long strncpy_from_user(char *dst, const char __user *src, …

IPC名前空間を調べる(2)

IPC名前空間の初期化で、名前空間のリソース初期化をするこれらの関数は特にこれと言った処理はありません。 mq_init_ns() sem_init_ns() msg_init_ns() shm_init_ns() 各リソースがシステムコールが呼ばれた時にどのように使われるのか?というところに関し…

IPC名前空間を調べる(1)

IPC名前空間で使う構造体とか読んでいきます。まずは簡単に全体像を把握するところからです。 まずはipc_namespace構造体。ファイルはinclude/linux/ipc_namespace.hです。 21 struct ipc_namespace { 22 atomic_t count; 23 struct ipc_ids ids[3]; 24 25 i…

create_pid_namespace()の処理を読む。

最近はfork/clone時のプロセス番号の発行あたりを読んできたので、今回はPID名前空間の生成部分を読んでみます。 処理を行うのはcreate_pid_namespace()です。clone(2)の場合、ここに至る流れはこうなっています。 do_fork() -> copy_process() -> copy_name…

fork/clone時に返すpidの設定(2)

前回のfork/clone時に返すpidの設定(1) - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモの続きです。alloc_pid()を見ていきます。 その前に、pid構造体のnumbers変数はサイズ1の配列として宣言されていますが、pidの処理ではindex番号1とかそれ以上の場所にア…

fork/clone時に返すpidの設定(1)

fork/clone時にpidがどのように決まるのか見てみます。見ているのはカーネル v4.1です。今回はどういう流れで処理されているかを見ていきます。 pidの設定は数カ所でやっていて、copy_process()、copy_namespaces()、do_fork()内でcopy_process()をあります…

setnsの実装を読む

カーネル4.3でのsetnsの実装を読みます。 setns()はkernel/nsproxy.cにあり、30行程度の短い関数です。 流れとしてはこのようになります。 移動先の名前空間のfdからns_common構造体を取得 nsproxyの作成 移動先名前空間のinstall()を呼んで名前空間のほうに…

Linuxカーネルのデバッグでprintk(9)デバッグを卒業したいっ!

この記事はLinux Advent Calendar 2015の25日目の記事です。 Linuxカーネルのデバッグである意味一番手軽なのがprintk(9)によるデバッグだと思うんですが(ユーザランドのプログラムで言うところのprintf(3)デバッグ)、この場合h速いCPUを積んだマシンなら…

glibcのmalloc(3)とLinuxカーネルのovercommitとOOM

この記事はLinux Advent Calendar 2015の23日目です。 glibcのmalloc(3)とLinuxカーネルのovercommitとOOMの関連でも見てみようと思います。Linuxカーネルのシステムコールにはmalloc(3)的なものはないので、mmap(2)、brk(2)が使われます。 今回知りたかった…

Linux 4.0(x86_64)のメモリレイアウト

この記事はLinux Advent Calendar 2015の2日目の記事です。 今日は復習も兼ねてメモリレイアウトの確認です。 見るのはDocumentation/x86/x86_64/mm.txtです。見ているのは4.0ですが、4.3も同じでした。 で、メモリーマップですが下記のように説明されていま…

fedora カーネルパッケージのバージョンの付け方の謎

このタイトルだと謎とは何ぞや?となる人が多いと思います・・・ どういうことかというと、2015/11/12の時点ではカーネル 4.4のマージウィンドウが開いている段階で、カーネルのMakefileに書かれているバージョンは4.3です。 これを書いている時の最新のコミ…

Linuxのスケジューラのデータ構造めも

Linuxのスケジューラはランキューには赤黒木を使っていて〜というところは見聞きしたことありますが、実際にどんなデータを使っていて、それらの関係は?と思ったので調べてみました。 スケジューラに関連する構造体はこれらのものがあります。 struct sched…

sched_setscheduler(2)の挙動めも

ちょっとsched_setscheduler(2)の動作を調べていたのでそのメモを。 見ているのはlinux kernel 4.2。 sched_setscheduler(2)はkerne/sched/core.cにある。 ここは単なる入り口でpolicyが0以下の場合にエラーを返す程度で、その他の処理はdo_sched_setschedul…

kmem_cache_alloc_bulk()を試してみる

lwn.netの2015/09/10の記事でLinuxの4.3にkmem_cache_alloc_bulk()とkmem_cache_free_bulk()のスラブキャッシュをがっつり確保するための関数が入ったと書かれていたので試してみました。 最初のパッチはslab: infrastructure for bulk object allocation an…

PID名前空間で名前空間を普通の時と多段にしたときでgetpid(2)にかかる速度を見てみる

PID名前空間で名前空間をとくに使わない時(CONFIG_PID_NS=yな環境で特に分離させてない時)とPID名前空間の分離を多段でやってみた時で、getpid(2)に影響があるのかどうかというのを見てみました。 まず、getpid(2)の仕組みですが、これは以前書いたCLONE_N…

linux: socketとNet名前空間

LinuxカーネルのNet名前空間の辺りを読んでみます。 まず、抑えておくべきNet名前空間はどんなものかというとこです。ここを抑えておかないと話が進まないですね。 Net名前空間はstruct netです。これは比較的大きめの構造体です。メンバ変数としてipv4、ipv…

mount namespaceでinit_taskのmnt_nsを設定するところ

Linuxのinit_taskに設定されるmnt_nsはコンパイル時には設定されていなくて実行時に決定されてます。で、それがどこで設定されているのかのメモです。 まず、nsproxy.cでinit_taskはこのように作られていて、mnt_nsはNULLが初期値になっている。 31 struct n…

linux: 署名付きカーネルモジュールの署名の付き方

Fedora等、モジュールを署名しているディストリビューションの場合、カーネルモジュールのELFバイナリの最後に署名がついています。これがとんな感じなの?いうところはkernelのDocumentation/module-signing.txtに書かれています。/proc/keysで鍵の確認とか…

namespaces: proc_ns_operations構造体のget()の呼び出し方

各名前空間は/proc//ns以下にファイルとしてエクスポートされていて、nsenterがこの辺を使うわけですが、proc_ns_operations構造体に設定した関数はどのような流れで呼びだされているのかを見てみます。 対象をuts namespaceとし、utsns_get()にWARN_ONを仕…

buddy allocator: compatctionの処理 compaction_suitable()

compaction_suitable()はcompact_zone()の最初に使う関数で、コンパクションしようとしているzoneをコンパクションするかどうか判断する。 compaction_suitable()自体はたいした処理はなく、__compaction_suitable()が実際にチェックをする。 1259 unsigned …

buddy allocatorの__zone_watermark_ok()めも

Linuxのbuddy allocatorでpage数のwatermarkをチェックしているのは__zone_watermark_ok()。そんなわけで、今日はその辺りの動作を見てみる。 __zone_watermark_ok()は他のファイルから直接呼べないので、zone_watermark_ok()を使う。例えば、mm/compaction.…