2014-01-01から1年間の記事一覧
new_slab_objects()がfreelistを確保するためにnew_slab()を呼んで、それが戻ってきたらという辺りのメモです。 大まかにはslub:slab objectの作成処理を見ていく - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモで書いたりしているんだけど流れが見えてきた…
この記事はLinux Advent Calendar 2014の25日目ですヽ(=´▽`=)ノ 今回はLinux Kernel Hack入門編ということで入門的なことを書いてみたいと思います。 まず使用する環境ですけど最近出たばっかのFedora 21のWorkstationにしました。まあ、今回の内容的にはディ…
slabを作る時とallocするときで似たようなパスを通ってちょっと混乱してしまったのでその辺のメモです。 slabを作るときはkmem_cache_create()が呼ばれて、そこから呼ばれるdo_kmem_cache_create()がメイン処理。 まずslabキャッシュの作り方の復習。slabキ…
slubでオブジェクト管理する上で使うサイズ等の管理のメモ。見ているカーネルはv3.17です。今回はcalculate_sizes()を見るのがメインかな。 struct kmem_cacheの中でサイズに関連するのはこの辺り。 62 struct kmem_cache { 〜略〜 67 int size; /* The size…
この記事はLinux Advent Calendar 2014の17日目です。 virt-managerのGUIを使って仮想環境を作るときにOS Typeというのを選択していると思いますが、これの設定はどのように使われているのか見てようと思います。 特に最近のvirt-managerはやたら選択可能なO…
この記事はLinux Advent Calendar 2014の13日目です。 LWNのACCESS_ONCE() and compiler bugsを読んでなるほどねーと思ったのでその辺について書いてみたいと思います。 最適化の技と言いつつ実際は最適化させすぎない技なんですが\(^o^)/ まずACCESS_ONCE…
この記事はLinux Advent Calendar 2014の11日目です。 systemdはAPIが公開されていてプログラムからジャーナルを読んだりできるのですが、公式サイトを見ていたらrubyのgem(systemd-journal)があったので遊んでみます。 requireするのはsystemd/journalで…
この記事はLinux Advent Calendar 2014の10日目の記事です。 今回は前回の「slub:slab objectの作成処理を見ていく」で詳細を見なかったnew_slab()でpageを確保するところを見ていきます。 new_slab()では下記のようにallocate_slab()にてページの確保を行…
この記事はLinux Advent Calendar 2014の9日目の記事です。 ネットワークを使う機能でなにかしらテストしたいときに複数のクライアントが欲しい時がありますよね。大量アクセスをしたい場合はjmeterとかありますが、クライアントのIPアドレスも複数あったほ…
この記事はLinux Advent Calendar 2014の8日目の記事です。 systemdでシステムshutdown時に何かさせる場合の.serviceファイルについて書いてみたいと思います。 systemdで何かを実行する場合、どこにインストールするか(Installセクションをどうするか)が…
この記事はLinux Advent Calendar 2014の6日目の記事です。 今回は前回の続きではなくて(といっても流れ的には続きになるんですが)slab objectの作成部分です。 slab objectの作成はnew_slab_objects()にて行います。この関数の呼び出し元は__slab_alloc()…
この記事はLinux Advent Calendar 2014の5日目の記事です。 Linuxカーネルのシステムコールをhookしたい場合にどうやるかという話です。試したカーネルは3.18.0-rc6です。 まずシステムコールですが、これはテーブルで管理されていて、各要素はNR_システムコ…
この記事はLinux Advent Calendar 2014の3日目の記事です。 kmem_cache_zalloc()、名前だけ見ると単純そうな気がするけど割とそうでもないのでした。この関数は最初のほうは別の関数へのラッパー程度になっていますが、memcg_kmem_get_cache()、__memcg_kmem…
この記事はLinux Advent Calendar 2014の2日目の記事です。 プログラムの中でロードアベレージとかメモリの空き容量を見るのにどうしようかなーと思っていて見つけたのがsysinfo(2)です。 使い方は至って単純でsysinfo構造体のアドレスをsysinfo(2)に渡せば…
この記事はLinux Advent Calendar 2014 1日目の記事です。 switch_toはプロセス切り替え時の処理ですね。ここを読んでみます。基本的にはアセンブラで__switch_toがcの関数となってます。 まずはプロトタイプから。引数は3個でprev,、next、 lastの3個。型は…
DragonFly BSD 4.0.1がリリースされたという記事を呼んでリリースノートを見ていたら「New device files /dev/upmap and /dev/kpmap have been added」なんてのがあって、興味が出たのでソースを読んでみました。 この機能はざっくり言ってしまうとLinuxにお…
Linuxでスラブキャッシュを新しく作成する場合はkmem_cache_create()を使用する。これのラッパーとしてKMEM_CACHE()というマクロもあって、これは構造体の型名とメモリ確保時に使用するフラグ(GFP_KERNEL等)を渡すだけの便利マクロ。 処理の流れは下記の通…
Linux 3.18のrc(自分が気付いたのは3.18-rc2)でiptablesが動かないからkvm環境等々が動かせなくて悩んでたんだけど、とりあえずはpatchを見つけたので解決。 パッチは(nf_reject_ipv4: module license 'unspecified' taints kernel - Patchwork)です。 i…
semctl()を読むのは良いけどフラグによって操作が違うのでshmctl()の時と同じくIPC_RMIDの場合を読みます。 まずはsemctl()からでshmctl()と同じくIPC_SETとIPC_RMIDは同じ関数が使われます。 1569 SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, c…
今日はsemop()の実装を。システムコール的にはsemop(2)とsemtimedop(2)の2つの関数がありますが、カーネルのsemop()側はsemtimedop(semid, sops, nsops, NULL);と呼び出してるだけなので、実体は一つです。 では、semop(2)とsemtimedop(2)の共通実装部分、と…
semget()は以前のエントリ(Linuxカーネル:SystemV IPC get系操作の共通実装部分を読む - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ)で書いたようにSystemV IPC共通部分と機能固有部分に分かれていて、semget()の場合はnewary()が使われます。 というわけ…
shmctl()はセグメントの削除だけ見ておけば良いかなというところで。 shmctl()はipc()よりsys_shmctl()の呼び出しという形で呼ばれます。 そして、shmctl()の第二引数にあたるcmdの値を使ったswitchがあり、IPC_RMIDとIPC_SETの場合はshmctl_down()が呼ばれ…
今日はshmat()とshmdt()を読んでみます。 shmat()はshmget()、shmdt()、shmctl()と違ってsyscall_defineは使われていなくて、ipc()からdo_shmat()を呼び出しています。 では、do_shmat()を見ていきます。 最初は変数定義が並んでいるだけなので飛ばします。 …
今日はipc/shm.cにあるshmget()の実装部分であるnewseg()を読んでみる。昨日の「 Linuxカーネル:SystemV IPC get系操作の共通実装部分を読む - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ」でも書いた通りSystemV IPCのxxxget()はipcget()という共通関数を…
LinuxカーネルのSystemV IPC実装で共有メモリ、セマフォ、メッセージキューのget操作はある程度共通化されているのでその辺を読んでみます。 と、その前にまずはglibc側をちょっと見てます。glibcの中でLinuxのシステムコールはsysdeps/unix/sysv/linux/にあ…
systemd関連のコマンドで面白そうなものを適当に。 systemd-cat(1) systemd-catはコマンドの出力結果をjournalに書き込んでくれる。 例えば↓を実行してからjournalctlでログを見ると、 masami@saga:~$ systemd-cat ls -la /usr/bin/gcc このように出力される…
Linux環境においてcpu数(core数)を数えたいときにgrep processor /proc/cpuinfo | wc -lとやっても良いんですけど、もうちょっとスマートなやり方は無いかな?と思ってたらnproc(1)があったのでそれがどうやって数を調べているのかソースを読んでみました…
systemdにはsystemd-tmpfilesという機能が合ってテンポラリなファイルやディレクトリをsystemdを使って作ることができます。systemdを使うので使い道としてはシステムの起動時に作るというのが基本的なユースケースだと思います。 マニュアルはsystemd-tmpfi…
systemdでネットワークが完全に立ち上がってからサービスを動かしたい場合のめもです。ありますよね、こういうケース。 で、Unitセクションにこんな感じで書くんですがこれだと上手く動かない場合があったりして困るわけです。 After=network.target そんな…
mnt_nsはinit_nsproxyにあるデータの中で唯一コンパイル時に値が入っていないので、どのようデータが設定されていくのかを見てみる。mnt_nsの作成はcreate_mnt_ns()で実施していて、以前のエントリー「φ(・・*)ゞ ウーン mount namespaceめも - φ(・・*)ゞ ウーン …