kernel

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.…

buddy allocator: compactionのざっくりとした流れ

__alloc_pages_slowpath()でcompactionの処理をする場合のざっくりとした流れをc⌒っ゚д゚)っφ メモメモ... __alloc_pages_slowpath()では__alloc_pages_direct_compact()をこのように呼んでpageの確保を試みる。 2700 /* 2701 * Try direct compaction. The first…

user_ns: task_structからuser_nsの取得めも

誰得なめも。task_structからuser_nsの取得の方法。 名前空間はstruct nsproxyで管理されているけど、user namespaceはstruct credが管理していて、user namespace以外の名前空間はその構造体にuser namespaceへのポインタを持っている。 このポインタがどう…

Linux: inodeからtask_struct構造体を取得

Namespace周りのコードを読んでいたらinodeからtask_struct構造体を取得をしているところがあって、こんなことできるんだ〜などと思ったのでどんな方法で取得するのか見てみます。 使ってた場所はproc_ns_follow_link()とかです。 ↓のように。 37 struct tas…

buddy system: __alloc_pages_slowpath()のざっくりとした流れ。

LinuxのPage Allocatorで __alloc_pages_slowpath()の流れをメモ程度に。 読んでいるカーネルのversionは4.0。 __alloc_pages_nodemask()でget_page_from_freelist()を呼んだ時にpageの確保ができなかった場合に呼ばれるのが __alloc_pages_slowpath()。 get…

buddy allocator: __rmqueue_fallback()を調べる

前回の記事では__rmqueue_smallest()を見たので、今回は __rmqueue_fallback()を見ていきます。 この関数の呼び出し元は__rmqueue()で、__rmqueue_smallest()でメモリを確保できなかった場合に実行されます。 では、処理を見ていきましょう。 __rmqueue_fall…

buddy allocator: __rmqueue_smallest()を調べる

前回の「buffered_rmqueue()めも - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ」続きとして、__rmqueue_smallest()を読みます。 これは割と分かりやすい感じです。 では、見ていきます。 関数のプロトタイプはこうなっていて、引数はpageを確保する対象のzo…

buffered_rmqueue()めも

今日はLinuxカーネルもくもく会 #12 を利用してbuffered_rmqueue()から読んでく。 buffered_rmqueue() 最初の大きな分岐はページ確保のorderが0(1page)かどうかで処理が変わる まずは1page分の場合から見ていく if文には1pageにlikelyが使われいるのでこっ…

get_page_from_freelist()の処理

前回は__alloc_pages_nodemask()を見たので、今回はそこから呼ばれ、実際にallocationを行う部分の get_page_from_freelist()を見ていきます。 基本的な流れは、 boolの変数consider_zone_dirtyにalloc_flagsとgfpフラグの値から真偽値を決める ここでgfpフ…

linux: page allocatorの辺りを読んでいこう

Linuxのpage単位のallocatorを理解したいなーというところで、mm/page_alloc.cの __alloc_pages_nodemask()を起点にコードを読み始める。 __alloc_pages_nodemask()はalloc_pages()なんかから呼ばれるところですね。 __alloc_pages_nodemask()の細かいところ…

livepatchでftraceのハンドラでセットしたInstruction Pointerがどう使われるのか調べた

Linuxのlivepatchはftraceを使って古い関数へのアクセスをフックして新しい関数を呼ぶようにしているというのは以前の記事で調べたんですが、 じゃあ、セットしたIP(Instruction Pointer)をどのように使って新しい関数に飛ばしているのか?というのが知りた…

linux: livepatchめも klp_find_object_symbol()でpatch対象関数のアドレスを探すところ

前のlinux: livepatchコードリーディングめも1 〜 patch側のデータ設定とpatchの登録まで - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモではさらっと流したklp_find_object_symbol()でpatch対象関数のアドレスを探すところを見てみる。 呼んでいる場所として…

linux: livepatchめも 新たに関数が追加れされる場合

livepatchはftraceを使って既存の関数のアドレスにフィルターをセットして、フィルターにセットしたハンドラがripを新しい関数のアドレスに置き換えて実行を継続するというのは前回の記事で分かったんだけど、新しい関数を追加する場合はどうすんだろ?と思…

linux: livepatchコードリーディングめも2 〜 patchのenable

前回の記事(linux: livepatchコードリーディングめも1 〜 patch側のデータ設定とpatchの登録まで - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ)はpatchを登録するを見たので今回はpatchを有効にする部分を見てきます。 まず、livepatch-sample.cでpatchを…

linux: livepatchコードリーディングめも1 〜 patch側のデータ設定とpatchの登録まで

Linuxカーネルもくもく会 #11でやったことです。Linux kernel 4.0 のlivepatchを調べてみる。patchとなるsamples/livepatch/にあるlivepatch-sample.cからスタートして読んでいきましょう。livepatchモジュールにpatchを登録するまでを見ていきます。 まずは…

perf probeで関数の引数も記録する

perf probeで引数とかもログ取れる?と思って確認したらできることが分かったのでその辺のめも。 例えばlong do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)の引数を記録するのはこんな感じ。filename引数は文字列として扱う…

linux: slub code reading

最近調べていたslubのkmem_cache_alloc()、kmem_cache_free()のまとめですm( )m Slub alloc and_free from Masami Ichikawa Slub alloc and_free Amazon Web Services 基礎からのネットワーク&サーバー構築作者: 玉川憲,片山暁雄,今井雄太出版社/メーカー: …

Linuxのthis_cpu_cmpxchg_double()によるpercpuなデータの交換

Linux kernelでpercpuなデータの入れ替えに使用されるthis_cpu_cmpxchg_double()のメモ。見ているカーネルは3.18。 これはマクロでlinux/include/percpu-defs.hにて下記のように定義されています。 507 #define this_cpu_cmpxchg_double(pcp1, pcp2, oval1, …

slub: [sg]et_freepointer()めも

slubのkmem_cache_alloc()、kmem_cache_free()時の[sg]et_freepointer()の動きを確かめるというめもですが、チラ裏ですm(__)m kmem_cache_alloc()を呼ぶとslubではslab_alloc_node()が呼ばれて、slabがすでにある場合はelseの方に入る。ここでget_freepointe…