kernel

nsproxyとfork()周りのめも

軽くnsproxyと初期化周りのめもを。 Linuxでは名前空間の管理にはnsproxy構造体が使われていて定義はinclude/linux/nsproxy.hにある。 中身はこのような形で5つの名前空間が管理されている。 29 struct nsproxy { 30 atomic_t count; 31 struct uts_namespac…

printk()で%pS format string指定時のアドレス->シンボル名の探し方

Linuxカーネルのprintk()はformat stringが色々と拡張されていて(Documentation/printk-formats.txt)、例えば、IPv4/IPv6の表示用、UUID/GUIDの表示用などがあります。その中でsymbol関連のformat stringもいくつか合って、%pSの場合はこんなふうに呼び出…

Linux: pud_alloc()周りのメモ

前回はPGD周りをみたので今回はPUD周りを。PUDを作るのはpuc_alloc()でこれはいくつかの呼び出しパターンがあるのだけど(lxrでIdentifier Searchした結果からして)、一番基本であろうページフォルトの時で調べる。 ページフォルト発生時は__handle_mm_faul…

Linux x86_64のPaging:Page Global Directory辺りの扱いを見てみる

Linux(x86_64)のpagingをちゃんと理解したいな〜ということで。見ているのはLinuxカーネル3.15。 まずはx86_64アーキテクチャのページングの仕組みとLinuxでの対応(どんな型で表すのか)を調べる。 | name | bits | c type | |----------- ----|-------|-…

Linux:面白そうなpatch(Address sanitizer for kernel)を見てみる

ふと見て面白そうだなと思った[RFC/PATCH RESEND -next 00/21] Address sanitizer for kernel (kasan) - dynamic memory error detector.、略してKASANがどんなものなのかを見てみる。どうしてもJ( 'ー`)しが思い浮かぶんだけどそこはスルー。 基本、見るのは…

linux-3.16で入ったdecode_stacktrace.shを試してみる

先週のLWNの記事3.16 merge window, part 2を見てて、「お、これは便利じゃね?」って思ったdecode_stacktrace.shを試してみました。 これはカーネルのスタックトレースにあるオブジェクトのシンボルからソースファイル名・行番号を出してくれるという優れも…

sys_stat()を読んで見る。

なんとなく昨日のLinux:sparse fileのファイルサイズと実際に使っている領域の大きさはどう調べるのか。続きで見てみます。 見ているカーネルは3.15です。 まずはarch/x86/syscalls/syscall_64.tblでシステムコールの定義を見てみるとstat()はsys_newstat()…

kmalloc()とBUG: sleeping function called from invalid context〜とslab_alloc_node()

カーネルのバグでspin lock取っているコンテキストでsleepする可能性のある関数を使うと「BUG: sleeping function called from invalid context at mm/slub.c:965」なんて感じでエラーがでますけど、kmalloc()はGFP_XXXなflagsをどのように使っているのかな…

Linuxのpipeの実装を見てみる

Unix V6のpipe()と比べてLinuxのpipe()どう実装しているんですかねーなんて話を最近したのでちょっと見比べてみた。 V6のpipeははじめてのOSコードリーディング 読書会 (15)でやったところなんだけど、俺は風邪ひいて家で引きこもってたので・・・ V6のpipe…

Linuxカーネルハックに興味があるけど特にネタが無いんだよな〜って人向けの小ネタ

Linuxカーネルに興味があるんだけど特に作りたいものってないんだよなーなんて割とあると思う訳です。俺とか。。。 まあ、kernelnewbiesのメーリングリストでもよく見る話題かと思います。この辺なんかもそうですね。 で、そんな時にオススメできるのがkmeml…

kpatchはhot patchをどうやって作っているのか調べてみる

Red HatがLinuxカーネルにライブパッチするツールとしてkpatchを公開したのでそれはどうやってhot patchを作るのかを調べてみる。 kpatchのソースコードはgithubに置かれている。 kpatchはパッチの作成を行うモジュール群、パッチを当てるモジュール、両者を…

linux:x86_64のpageing_init()での最後の処理、zone_sizes_init()を読む。

paging_init()の続きで残りの2行を。。 node_clear_state()は特に見るほどではないのでzone_sizes_init()を見る。 650 void __init paging_init(void) 651 { 652 sparse_memory_present_with_active_regions(MAX_NUMNODES); 653 sparse_init(); 654 655 /* 6…

linux:sparse_init()で細かいメモリ領域の断片達を管理できるように

paging_init()の2行目、sparse_init()のところを読む。 sparse_init()の関数にあるコメントを見るとやろうとしていることはなんとなくわかる。 ここで言っているaccumulated non-linear sectionsというのは前回までの記事で見てきた部分で、e820のメモリマッ…

linux:sparse_init()の前にalloc_usemap_and_memmap()を見ておく

paging_init()の2行目で実行するsparse_init()を見る前にここで使っている関数を先に軽く見ておく。 alloc_usemap_and_memmap()はこのようなI/Fの関数。 引数の最後のdataはalloc_func()の一番目の引数として使う。 469 static void __init alloc_usemap_and…

linux:x86_64のpaging_init()を読み進める。

今日はx86_64のpaging_init()から呼ばれるsparse_memory_present_with_active_regions()とそこで使われるmemory_present()のあたりを読む。 ディレクトリ的にはarch/x86/以下ではなくてmm/になる。 まずはsparse_memory_present_with_active_regions()を。 …

linux:x86_64のメモリ管理のうちe820のメモリマップを扱っている部分読む

x86_64のページングを設定している部分を読もうと思って読み始めて前回の続きになるsparse_memory_present_with_active_regions()を読もうと思ったんだけど、この関数で使う変数(struct memblockのメンバ変数のmemory(型はstruct memblock_type))を調べた…

linux:x86_64のページング初期化処理周りを読んでみる

Linuxカーネルの解説本は何種類か出版されているけど大概はx86_32が対象なんですよね。ということでx86_32を基本として大まかな内容は解説本を参考にしつつ、実際のx86_64の処理はコードを読む必要があるのです。。。 ということでx86_64の場合のページング…

linuxカーネルパッチ:Known exploit detectionで遊んでみる

2013年12月中頃のLWNの記事で Known-exploit detection for the kernel というのがちょっと気になったので試してみた。 今の時点(2014/01/21)だとlinux-nextのtreeにも入っていないので今後どうなるかはわかりませんが。。。 記事の時点で投稿されたパッチ…

lkmlにフレームバッファのメモリーリーク修正パッチを投げたのでそのデバッグ過程メモ

前回のパッチとは別でフレームバッファのドライバでのメモリーリークを修正するパッチを投げたのでデバッグのメモkmemleakのレポートはこのようなもの。 unreferenced object 0xffff880036ca84c0 (size 16): comm "swapper/0", pid 1, jiffies 4294877407 (a…

Linuxカーネルで見たc言語の小技:BUILD_BUG_ONマクロ

LinuxカーネルにあるBUILD_BUG_ONマクロ。名前からやりたいことは十分に分かるんだけど、これはどういう仕組みなのかというところ。使っている例としてarch/x86/kernel/head64.cにあるx86_64_start_kernel()を見てみるとこんな感じ。 140 asmlinkage void __…

lkmlにメモリーリーク修正のパッチを投げたので修正内容のメモ

どんなことをやったかをメモしておこう。 といっても今回のは比較的簡単に調べられたけど。パッチを作ったカーネルは3.13-rc4です。2013/12/20 追記: (´-`).。oO(Reviewed-byしてもらったのでそのうちメインラインにも入るだろう kmemleakさんから以下のよ…

Linuxブート時のcpu数認識の処理を読む

Linuxブート時のcpu数認識の最後の部分のこれ。 [ 0.000000] smpboot: Allowing 8 CPUs, 0 hotplug CPUsこのメッセージはarch/x86/kernel/smpboot.cにあるprefill_possible_map()が出している。 1252 pr_info("Allowing %d CPUs, %d hotplug CPUs\n", 1253 p…

generic_processor_info()によるcpuの処理部分を読む

前回の続きとしてgeneric_processor_info()を読む。まずはgeneric_processor_info()が呼ばれる流れを。これはacpi_register_lapic()から呼ばれていて、acpi_register_lapic()は以下の関数などから呼ばれる。 acpi_parse_x2apic() acpi_parse_lapic() acpi_pa…

Linuxカーネルで「ACPI: LAPIC ~」などを出している辺りを読む

前回の続きとしてacpi_parse_madt_lapic_entries()内で acpi_table_parse_madt()の2番目の引数で渡している関数を見ていこう。 見るのはうちの環境に関係ありそうなところでこの辺を。 acpi_parse_x2apic() acpi_parse_lapic() acpi_parse_x2apic_nmi() acpi…

acpi_parse_madt_lapic_entries()とMultiple APIC Description Table

今日はacpi_parse_madt_lapic_entries()を見ていこう。と言ってもコードよりもACPIの仕様書読むほうがメインかも。。 901 static int __init acpi_parse_madt_lapic_entries(void) 902 { 903 int count; 904 int x2count = 0; 905 906 if (!cpu_has_apic) 90…

「Using ACPI (MADT) for SMP configuration information」のところを読む

昨日の「LinuxカーネルのSMPまわりの処理を調べてみる」の続きでUsing ACPI (MADT) for SMP configuration informationを出している箇所を見てみる。メッセージを検索してみるとarch/x86/kernel/acpi/boot.cにあるacpi_process_madt()がヒット! どこでメッ…

LinuxカーネルのSMPまわりの処理を調べてみる

うちではデスクトップとして使っているPCにIntel® Core™ i7-3770S Processorを使っていて、コア数が4、8スレッドということで/proc/cpuinfoでは8個のcpuがLinuxによって認識されています。では、これがどのような手順で認識されていったのか?というのをちょ…

Linuxカーネルで処理できるEjectプロトコルを作ってみる

Linuxカーネルでinet_add_protocol()という関数を使うとオレオレプロトコルを簡単に追加できるので遊んでみました。 以下が作ったカーネルモジュールです。 #include <linux/module.h> #include <linux/kernel.h> #include <linux/kmod.h> #include <net/protocol.h> MODULE_DESCRIPTION("simple Eject protocol"); MODULE_A</net/protocol.h></linux/kmod.h></linux/kernel.h></linux/module.h>…

カーネル/VM Advent Calendar 2013 3日目の記事をQiitaに書きました。

カーネル/VM Advent Calendar 2013 3日目の記事「カーネル/VM Advent Calendar 2013 3日目:LinuxカーネルのlockrefというLock機能を試してみよう」をQiitaに書きました。 内容はタイトルそのままですw 3.12から入ったlockrefというロック機能を試してます。…

φ(・・*)ゞ ウーン jailhouseのコードを読んでみるの7

今回はcpu_init()から。cpu_init()はこのような関数。他の関数を読んでいくだけで、この関数自体は特別なことはしてないですね。 static void cpu_init(struct per_cpu *cpu_data) { int err; printk(" CPU %d... ", cpu_data->cpu_id); err = register_linu…