日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)

發(fā)布時間:2025/3/15 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

本章學(xué)習(xí)如何啟動第一個應(yīng)用程序

1.在前面的分析中我們了解到,在init進程中內(nèi)核掛接到根文件系統(tǒng)之后,會開始啟動第一個應(yīng)用程序:

kernel_init函數(shù)代碼如下:

static int __init kernel_init(void * unused) //進入init進程 { prepare_namespace() //掛載根文件系統(tǒng){... ... / /通過解析出來的命令行參數(shù)” root=/dev/mtdblock3”來掛接根文件系統(tǒng) mount_root(); //開始掛載}init_post(); //啟動應(yīng)用程序 } }

2.接下來開始分析init_post()如何啟動應(yīng)用程序的,代碼如下:

static int noinline init_post(void) {/*內(nèi)核已經(jīng)初始化完成,所以清除__init_begin段到__init_end段之間的數(shù)據(jù)*/free_initmem();unlock_kernel();mark_rodata_ro();system_state = SYSTEM_RUNNING;numa_default_policy(); /* 打開dev/console控制臺設(shè)備(串口0),使用戶能輸入信息, /dev/console即成為kernel_init進程的標準輸入源(文件描述符0),
打開失敗則打印Warning: unable to open an initial console.\n
*/if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)printk(KERN_WARNING "Warning: unable to open an initial console.\n");

當我們刪除根文件系統(tǒng)的內(nèi)容再啟動內(nèi)核,發(fā)現(xiàn)串口就會打印上面的字符串,如下圖:

會顯示打開dev/console失敗,是因為根文件系統(tǒng)還是在root=/dev/mtdblock3, 所以能掛載根文件系統(tǒng),我們擦除了mtd3內(nèi)容,也就是dev里面的內(nèi)容,所以無法打開console控制臺。?

接下來繼續(xù)分析init_post():

/*調(diào)用dup打開/dev/console文件描述符兩次, 該控制臺設(shè)備就也可以供標準輸出和標準錯誤使用(文件描述符1和2),
kernel_init進程現(xiàn)在就擁有3個文件描述符--標準輸入、標準輸出以及標準錯誤。
*/(void) sys_dup(0);(void) sys_dup(0);
if (ramdisk_execute_command) { //若 ramdisk_execute_command為0,不運行它run_init_process(ramdisk_execute_command); printk(KERN_WARNING "Failed to execute %s\n",ramdisk_execute_command); }

搜索上面ramdisk_execute_command,發(fā)現(xiàn)它是一個char型全局數(shù)組,找到它被用在init_setup()中,代碼如下:

static int __init rdinit_setup(char *str) {unsigned int i;/* 使ramdisk_execute_command數(shù)組等于str *、ramdisk_execute_command = str; /* See "auto" comment in init_setup */for (i = 1; i < MAX_INIT_ARGS; i++)argv_init[i] = NULL;return 1; }__setup("rdinit=", rdinit_setup); ramdisk_execute_command

發(fā)現(xiàn)上面__setup和我們上節(jié)分析的掛載根文件系統(tǒng)的__setup都是一樣的

它是匹配命令行中以” rdinit=”開頭的字符串,由于我們uboot的命令行參數(shù)中沒有”rdint=”,所以ramdisk_execute_command=0,不執(zhí)行if判斷

接下來繼續(xù)分析init_post():

if (execute_command) { // execute_command不為0, 運行它/* run_init_process 運行目標程序成功后會一直死循環(huán)*/ run_init_process(execute_command); /*run_init_process運行失敗退出后,打印Failed to execute /linuxrc. Attempting defaults... */printk(KERN_WARNING "Failed to execute %s. Attempting ""defaults...\n", execute_command);}

搜索上面execute_command,發(fā)現(xiàn)它是一個char型全局數(shù)組,找到它被用在init_setup()中,代碼如下:

static int __init init_setup(char *str) {unsigned int i;/*execute_command =str*/execute_command = str; for (i = 1; i < MAX_INIT_ARGS; i++)argv_init[i] = NULL;return 1; } __setup("init=", init_setup); execute_command

發(fā)現(xiàn)上面__setup和我們上節(jié)分析的掛載根文件系統(tǒng)的__setup都是一樣的

顯然這里就是用來匹配命令行中以” init=”開頭的字符串,然后再將命令行參數(shù)bootargs中的” init=/linuxrc”中的” /linuxrc”放在execute_command數(shù)組中.

(init=/linuxrc:指定內(nèi)核啟動后運行的第一個腳本是當前目錄下linuxrc腳本)? ???

最終__setup("init=", init_setup)宏= { __setup_str_ root_dev_setup[], root_dev_setup , 0 };

然后放在.init.setup段中,在內(nèi)核啟動后進入start_kernel()函數(shù)中使用這個宏,并將” /linuxrc”放在execute_command數(shù)組中.

當文件系統(tǒng)被擦除后,就會運行l(wèi)inuxrc應(yīng)用程序失敗,打印執(zhí)行l(wèi)inuxrc失敗,如下圖:

?

接下來繼續(xù)分析init_post():

/*運行應(yīng)用程序失敗后,從下面3個地方查找可能出現(xiàn) init應(yīng)用程序的所有地方*/run_init_process("/sbin/init");run_init_process("/etc/init");run_init_process("/bin/init");/*試圖建立/bin/sh 來代替應(yīng)用程序 */run_init_process("/bin/sh");/*如上圖所示,當前面的所有情況都失敗時,調(diào)用panic。這樣內(nèi)核就會試圖同步磁盤,確保其狀態(tài)一致。
如果超過了內(nèi)核選項中定義的時間,它也可能會重新啟動機器。
*/panic("No init found. Try passing init= option to kernel.");}

在這里init_post函數(shù)就分析完畢了.

3.當在內(nèi)核中,能輸入數(shù)據(jù)時,表示根文件系統(tǒng)的應(yīng)用程序啟動完畢

比如輸入ps查看進程,如下圖,(ps-process status)

?

接下來開始分析init進程,知道命令是怎么來的

轉(zhuǎn)載于:https://www.cnblogs.com/lifexy/p/7405838.html

總結(jié)

以上是生活随笔為你收集整理的第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。