檢查lfs從核心到到第乙個程序init是否成功

2021-07-11 08:50:14 字數 2365 閱讀 7291

當系統從bootloader傳遞引數到linux的start_kernel

一般核心裡面不會出什麼bug。主要是上層構建的rootfs有沒有問題。

即使核心裡面出了問題,也會在串列埠提示。也可以通過打log來跟蹤 一步步到**出問題了。

使用printk 列印核心日誌。可以很快定位到**出了問題。

一般最後核心會執行到

kernel_init

嘗試執行init程序

if (!try_to_run_init_process("/sbin/init") )

if ( !try_to_run_init_process("/etc/init"))

if ( !try_to_run_init_process("/bin/init"))

if (  !try_to_run_init_process("/bin/sh"))

這四個裡面有乙個執行成功就算執行到init程序了。只要有乙個成功就會立馬返回。

如果這個程序完成。後續的過程也可以從init程序裡面打日誌printf來除錯了。

關鍵就是這個init程序能否起來。一般不能起來主要是缺少某些依賴庫。特別是lib下面的

我們可以一步步跟蹤過去。返回0表示 成功。其他的值一般是錯誤

這一條路徑上可以多打日誌

try_to_run_init_process->run_init_process->do_execve->do_execveat_common->(prepare_binprm  exec_binprm)

這個exec_binprm最容易返回錯誤 導致最後執行try_run的值返回-2沒有找到模組

exec_binprm->search_binary_handler

search_binary_handler會根據讀取的binary的頭部判斷是不是可執行的bin格式。

然後呼叫相應的函式執行

static struct linux_binfmt elf_format = ;

list_for_each_entry(fmt, &formats, lh) 列舉當前的處理bin檔案的handler然後呼叫他們的

retval = fmt->load_binary(bprm);的方法。

load_binary方法主要是 load_elf_binary和load_elf_library

主要是load_elf_binary載入的過程容易出錯也就是說

try_to_run_init_process("/sbin/init)

最後用load_elf_binary來載入執行這個程序

load_elf_binary中間解析了init頭部

確認binary需要載入哪些庫然後嘗試載入這些庫

這中間需要呼叫 open_exec來開啟這些庫

open_exec->do_open_execat->do_filp_open->path_openat-> do_last做最後一步開啟的工作->lookup_open

do_last裡面如何確認是哪個檔案miss?

printk("critical begin \n\n")

列印當前準備開啟的檔名 在第乙個引數

struct nameidata *nd,

struct nameidata ;

struct qstr ;

u64 hash_len;

};const unsigned char *name;

};nd->last->name這裡是檔案名字 列印出來(這裡是不帶路徑的。只有檔名,也可以直接去lookup_dcache函式裡面列印 這裡會打出全路徑)

lookup_open 

printk("critical end \n\n")

在return之前列印返回值 如果return 地方不好找,可以直接在do_last之後列印

return ******

如果 do_last返回值不是0表示這個檔案由錯誤。一般是不存在。我們在這裡面又列印了檔案名字,可以一下就定位到是哪個檔案出了問題。

關鍵是看do_last開啟檔案的時候是否返回了0,0表示成功。非0表失敗。把這個檔案列印出來就知道**的問題了。

我的init起不來表現為

根據這個方法成功定位到

lookup_dcache=lib/ld-linux.so.3

openat error 3350=00000000

critical begin 

lookup_dcache=ld-linux.so.3

dentry flag 0 

do_last  flags  3083=00000080

critical end 

do_last error negative 3141=fffffffe

返回了-2.是ld-linux.so.3丟失了。

第乙個核心驅動

測試驅動開發平台 為了後續學習的順利進行,我們利用最簡單的hello,world程式,在核心上掛載和解除安裝我們自己編寫的hello模組。說明 本文除錯環境vmware workstation 5.0 turbolinux 10,教材是 linux device drivers 第3版英文電子圖書。...

第乙個核心測試程式

1.在vmware安裝上centos 網路設定,參考注意在centos 右上角的網路圖示選擇對應的網路裝置。2.安裝gcc環境 yum install gcc c 3.安裝核心檔案 yum install kernel devel 4.編寫hello.c檔案 例子參考 include include...

linux 核心學習10 從第乙個核心模組開始

c檔案 include include 該核心模組初始化函式 可以通過insmod命令來載入乙個核心模組 static int init my test init void 該核心模組退出函式 可以使用rmmod命令解除安裝乙個核心模組 static void exit my test exit v...