分析Linux核心的啟動過程

2021-09-09 03:35:17 字數 4486 閱讀 9117

第一章 環境

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...