Transcript コンテナエンジンの作り方 さくらの夕べ ~ ヤンジェネバトル ~ さくらインターネット 株式会社 技術本部 大西 和貴 (C) Copyright 1996-2016 SAKURA Internet Inc 2019/10/08 自己紹介 2 大西 和貴 (@_k_onishi_) 2017年度新卒 SVOPチーム(運用) → レンタルサーバチーム(開発) サービスのコントロールパネルやメールソフトの バックエンドやフロントエンドを担当( Go / Typescript ) Tech: Linux / Unix / Kernel / File System / 仮想化 / コンテナ エミュレータ / バイナリ Lang: C / Assembly / Perl Blog: レガシーガジェット研究所 Dock
動機 社内の同僚がカーネル周りの問題を調べていて slab キャッシュ ( = dentry, inode ) に関する内容を追っていた。 その問題自体の内容は、アレがコレで、伏せておく。 その問題をみているうちに 「特定のディレクトリ以下の slab キャッシュ = dentry / inode キャッシュ を選択的に破棄することはできないのかな?」 という関心がわきいろいろ調べていた。 ビジネスロジックを担当するアプリケーションの実行とは関係ない箇所で大量に slab キャッシュ (dentry, inode) を蓄えてしまうプロセスがいて、そいつらが作ったキャッシュを意図して破棄したいようなユースケースを考えている (例: バックアップやウィルススキャン) (注意: メモリプレッシャーがかかるとカーネルがよしなに扱ってくれるはずで、「通常」のサーバ用途では slab キャッシュをあれ
この記事はLinux Advent Calendar 2016の10日目の記事です。 概要 ftraceやeBPF/bcc、Systemtap等から使うことができるuprobesだが kprobesのようにuprobes単体で実行できるサンプル(カーネルモジュール)を見つけることができない。 そこで、クリスマスも近いので今回は誰でも気軽に使えるuprobesのサンプルを紹介する(気軽にカーネルモジュール作るべきとは言ってない)。 なお詳細な実装の説明は割愛するが、該当命令を0xccに書き換えて飛ばすアレである。 環境 ディストリビューション : Ubuntu 16.04 調査および検証に利用したカーネル : 4.4.0-45-generic uprobesのAPI uprobesはカーネル空間からユーザプロセスのプローブを行うLinuxカーネルの機構である。 通常uprobesはftrac
void test_func(int a, int b, int c, int d){ int x, y, z; x = a + b; y = c + d; z = x + y; } int main(void){ test_func(1, 2, 3, 4); return 0; } $ gcc -O0 -m32 stack_test.c -o x86 $ objdump -d -M intel x86 | grep -A11 "main>:" 080483f9 <main>: 80483f9: 55 push ebp 80483fa: 89 e5 mov ebp,esp 80483fc: 6a 04 push 0x4 80483fe: 6a 03 push 0x3 8048400: 6a 02 push 0x2 8048402: 6a 01 push 0x1 8048404: e8 d2
x86 Linux の 32bit と 64bit のシステムコールの違い x86 Linux の 32bit と 64bit ではシステムコールの呼び出し方法と、 システムコール番号が異なります。システムコールの呼び出しは、 32bit では int 0x80 でソフトウェア割り込みを実行することでシステムコールを呼び出していますが、64bit では syscall 命令を実行します。 x86-64 の Linux でシステムコールを呼び出すには以下のようにします。rcx と r11 の内容は保存されません(破壊される)。 rax にシステムコール番号を設定 必要ならば、第 1 引数 を rdi に設定 必要ならば、第 2 引数 を rsi に設定 必要ならば、第 3 引数 を rdx に設定 必要ならば、第 4 引数 を r10 に設定 必要ならば、第 5 引数 を r8 に設定 必要
= DTrace Probes A list of DTrace probes and their functionality. "Module" and "Function" cannot be defined in user defined probes (known as USDT), so they will not be specified. Probe definitions are in the format of: provider:module:function:name(arguments) Since module and function cannot be specified, they will be blank. An example probe definition for Ruby would then be: ruby:::function-entry(
Defconとかでは問題のELFバイナリをデバッグすると,ユーザ定義関数名だけでなく,ライブラリ関数名も読めなくなっている.どうやるとこんなバイナリを作れるのかを調べてみた.結論から言えば,静的リンクでコンパイルして,stripでデバッグシンボルを消すだけだった. ライブラリ関数名の読めないプログラム 例えば,/bin/idをexecve関数で実行するだけのid.cを考える. /* id.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(void) { char *env[] = {NULL, NULL}; char *args[] = {"/bin/id", NULL}; execve("/bin/id", args, env); return 0; }
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く