此篇文章延續前文 ─ “Linux Kernel Development / Debugging (1) - 第一次玩 qemu/kgdb 就上手”,簡單介紹如何使用 gdb / kgdb 對核心模組 (kernel module) 進行即時的 debugging。
在先前的文章中,介紹了如何使用 qemu、kgdb、gdb 對核心進行動態的 debugging,並在編譯核心時在 vmlinux 中包含 debugging information,使 debug 時能夠直接瀏覽原始碼以及對變數進行存取。然而,kernel module 是在核心之外的,因次就算編譯時加上 -g GCCFLAG 也無法直接在 gdb 中存取其 debugging information。
昨晚失眠,其實已經累的半死。但看了 The Social Network 之後忍不著帶起耳機,放著洞雌洞雌的 AvB 與 Tiësto 又繼續摸摸 Linux kernel。用電影裡的說法就是 ─ Wired In!!!
修課的作業要求在核心新增一個 system call 提供一個分析記憶體狀態的介面,不過助教學長說我們也可以寫成 kernel module,於是便起了在 kernel module 中寫 system call 的想法。查了一下,要達到這樣的效果要靠 system call hooking 來達成,也就是去 hijack 目前存在的 system call,讓所有程式在呼叫該 system call 時都會變成執行到 module 中的某個 function,該 function 最後會再去呼叫正常的 system call routine。
目前的計畫是在 kernel 中新增一個 system call 來給自己的 module 來 hijack,不知道會不會是很沒有道理開發模式。
網路上許多 kgdb 的教學都是拿編好的 kernel image 搭配 busybox 來載入 qemu 開機,但這次學校作業內容包含執行 Firefox,所以需要跑在一個較完整的作業系統上。
這篇文章是這幾天摸索的心得,其實還沒包含如何去玩 kernel debugging ,因為我還不會XD。 文章分成三個部份:1. 設定與安裝 Debian 於 QEMU 虛擬機器、2. 編譯 Linux 支援 kgdb 的核心以及 initrd、3. 使用 gdb/kgdb 做核心除錯。