第一章 環境
ubuntu 14.10
linux kernel 3.18.6
第二章 **及除錯過程
環境搭建與核心準備:
cd ~/linuxkernel/
wget
xz -d linux-3.18.6.tar.xz
tar -xvf linux-3.18.6.tar
cd linux-3.18.6
make i386_defconfig
make
cd ~/linuxkernel/
mkdir rootfs
git clone
cd menu
gcc -o init linktable.c menu.c test.c -m32 -static –lpthread
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -hnewc |gzip -9 > ../rootfs.img
cd ~/linuxkernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzimage -initrd rootfs.img
又一次編譯核心:
make menuconfig
kernel hacking—>
compile-time checks and compile options
[*] compile the kernel with debug info
開始除錯:
qemu -kernel linux-3.18.6/arch/x86/boot/bzimage -initrd rootfs.img -s -s
同一時候另開乙個窗體。執行gdb:
gdb
(gdb)file linux-3.18.6/vmlinux
(gdb)target remote:1234
(gdb)break start_kernel
(gdb)list
這一次**就不貼出來了,在init/mian.c下,主要是**太長。
這裡打算分析:
cpu_startup_entry
page_address_init()
rest_init()
page_alloc_init()
trap_init()
tick_init()
profile_init()
key_init()
security_init()
buffer_init()
init_task 0號程序
run_init_process(const char *init_filename) 1號程序
0號程序init_task的結構:
#define init_task(tsk) \
, \
.rt = , \
.tasks = list_head_init(tsk.tasks), \
init_pushable_tasks(tsk) \
init_cgroup_sched(tsk) \
.ptraced = list_head_init(tsk.ptraced), \
.ptrace_entry = list_head_init(tsk.ptrace_entry), \
.real_parent = &tsk, \
.parent = &tsk, \
.children = list_head_init(tsk.children), \
.sibling = list_head_init(tsk.sibling), \
.group_leader = &tsk, \
rcu_pointer_initializer(real_cred, &init_cred), \
rcu_pointer_initializer(cred, &init_cred), \
.comm = init_task_comm, \
.thread = init_thread, \
.fs = &init_fs, \
.files = &init_files, \
.signal = &init_signals, \
.sighand = &init_sighand, \
.nsproxy = &init_nsproxy, \
.pending = }}, \
.blocked = }, \
.alloc_lock = __spin_lock_unlocked(tsk.alloc_lock), \
.journal_info = null, \
.cpu_timers = init_cpu_timers(tsk.cpu_timers), \
.pi_lock = __raw_spin_lock_unlocked(tsk.pi_lock), \
.timer_slack_ns = 50000, /* 50 usec default slack */ \
.pids = , \
.thread_group = list_head_init(tsk.thread_group), \
.thread_node = list_head_init(init_signals.thread_head), \
init_ids \
init_perf_events(tsk) \
init_trace_irqflags \
init_lockdep \
init_ftrace_graph \
init_trace_recursion \
init_task_rcu_preempt(tsk) \
init_task_rcu_tasks(tsk) \
init_cpuset_seq(tsk) \
init_rt_mutexes(tsk) \
init_vtime(tsk) \
}
第三章 除錯
設定斷點:一共13個。
命令為:
(gdb)break
接著輸入c進行除錯。
流程例如以下:
來幾張有代表性的除錯:
第四章 總結
通過這個方式我們知道了。linux核心通過呼叫那些函式來啟動,看起來在啟動的時候僅僅有些跳動的字元,但是在內部是非常忙碌的。希望以後能了解到每個函式的詳細作用。只是,這就非常困難的了。
set_task_stack_end_magic確立乙個init_task。這個便是後來的0號程序,也就是idle。
通過參考資料:
通過檢測時鐘中斷來提醒idle程序來複製自己的程序資訊,來建立乙個程序。
就好像之前的mykernel一樣。
然後idle程序就會檢測,假設有新的任務便會中斷執行。生成並釋放系統資源讓程序使用。當程序結束,系統便將資源收回返回給idle程序。
當執行到run_init_process時。1號程序便開始執行。附錄
Linux核心啟動過程分析
本文永久更新鏈結位址 日期 2014 10 14 字型 大中小 下面給出核心映像完整的啟動過程 注意kernel evecve呼叫的是與具體體系平台相關的實現,但它是乙個通用的系統呼叫,在linux syscalls.h中宣告,這個標頭檔案中宣告了與體系結構無關的所有系統呼叫介面。只不過kernel...
跟蹤分析Linux核心的啟動過程
在linux作業系統中,系統的啟動都是從start kernel 這個函式開始的。start kernel 是核心的彙編與 語言的交接點,在該函式以前,核心的 都是用彙編寫的,完成一些最基本的初始化與環境設定工作,比如核心 載入記憶體並解壓縮 現在的核心一般都經過壓縮 cpu 的最基本初始化,為c ...
跟蹤分析Linux核心的啟動過程
說明 在實驗樓裡做該實驗時,發現實驗樓環境老卡死,折騰幾個小時都如此,根本沒有辦法完成作業。因此此處只能提供一張截圖。後面的內容都是根據老師的課程整理出來的。開啟shell 使用gdb跟蹤除錯核心 gdb file linux 3.18.6 vmlinux 說明 在gdb介面中targe remot...