新聞中心
Linux系統(tǒng)是一種非常流行并且廣泛使用的操作系統(tǒng),它提供了強(qiáng)大的功能和靈活性,可以在各種不同的設(shè)備上使用。在Linux系統(tǒng)中,內(nèi)核是整個(gè)系統(tǒng)的核心,并且是系統(tǒng)啟動(dòng)時(shí)更先加載的組件。在本文中,我們將深入探討過(guò)程,了解它的所有步驟和階段。

公司主營(yíng)業(yè)務(wù):做網(wǎng)站、成都做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出迎澤免費(fèi)做網(wǎng)站回饋大家。
1. 引導(dǎo)加載程序
在任何操作系統(tǒng)的啟動(dòng)過(guò)程中,之一步始終是啟動(dòng)引導(dǎo)加載程序。引導(dǎo)加載程序負(fù)責(zé)在計(jì)算機(jī)啟動(dòng)時(shí)加載操作系統(tǒng)的內(nèi)核,并且它通常存儲(chǔ)在計(jì)算機(jī)的啟動(dòng)磁盤驅(qū)動(dòng)器中。在Linux系統(tǒng)中,引導(dǎo)加載程序通常是Grub(GRand Unified Bootloader)。
2. 初始化內(nèi)核
啟動(dòng)引導(dǎo)加載程序之后,計(jì)算機(jī)將開始初始化操作系統(tǒng)內(nèi)核。這是一個(gè)非常關(guān)鍵的步驟,因?yàn)樗鼘橄到y(tǒng)中的其他組件提供必要的基礎(chǔ)設(shè)施,并確保內(nèi)核能夠正常工作。在Linux系統(tǒng)中,內(nèi)核初始化包括以下步驟:
– 計(jì)算機(jī)檢測(cè)硬件。
– 內(nèi)核加載相應(yīng)的驅(qū)動(dòng)程序以支持硬件設(shè)備。
– 內(nèi)核初始化內(nèi)存管理子系統(tǒng)、進(jìn)程管理子系統(tǒng)和文件系統(tǒng)子系統(tǒng)。
– 內(nèi)核啟動(dòng)守護(hù)程序,并設(shè)置其他系統(tǒng)設(shè)置。
3. 用戶空間初始化
完成內(nèi)核初始化后,Linux系統(tǒng)將開始用戶空間初始化。用戶空間是一個(gè)操作系統(tǒng)中的一部分,它是用戶和應(yīng)用程序運(yùn)行的地方。在Linux系統(tǒng)中,用戶空間初始化包括以下步驟:
– 管理用戶和用戶組。
– 初始化系統(tǒng)服務(wù)和設(shè)置程序,以便它們可以正常運(yùn)行。
– 啟動(dòng)登錄管理器(如GDM或KDM),以便用戶可以登錄到系統(tǒng)。
4. shell啟動(dòng)
一旦用戶空間初始化完成,Linux系統(tǒng)將啟動(dòng)shell。shell是一個(gè)命令行界面,它允許用戶與操作系統(tǒng)交互。在Linux系統(tǒng)中,有多個(gè)shell可供選擇,例如bash和zsh。
5. 啟動(dòng)應(yīng)用程序和服務(wù)
在完成用戶空間初始化和shell啟動(dòng)之后,Linux系統(tǒng)將啟動(dòng)應(yīng)用程序和服務(wù)。這些應(yīng)用程序和服務(wù)可能是從命令行啟動(dòng)的,也可能是在系統(tǒng)啟動(dòng)時(shí)自動(dòng)啟動(dòng)的,以確保它們一直在后臺(tái)運(yùn)行。
過(guò)程是一個(gè)非常復(fù)雜和精細(xì)的過(guò)程。沒有引導(dǎo)加載程序和內(nèi)核初始化,操作系統(tǒng)無(wú)法正常運(yùn)行。通過(guò)深入了解過(guò)程,我們可以更好地理解操作系統(tǒng)的工作原理,并且可以進(jìn)行調(diào)試和優(yōu)化,使其更加高效和可靠。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
linux kernel 沒有輸出信息 怎么調(diào)試
最近工作在調(diào)試u虛擬串口,讓其作為kernel啟動(dòng)的調(diào)試串口老埋,以及user空間的輸入輸出控制臺(tái)。
利用這個(gè)機(jī)會(huì),學(xué)習(xí)下printk如何選擇往哪個(gè)console輸出以及user空間下控制臺(tái)如何選擇,記錄與此,與大家共享,也尺含絕方便自己以后翻閱。
Kernel版本號(hào):3.4.55
依照我的思路(還是時(shí)間順序)分了4部分,指定kernel調(diào)試console , kernel下printk console的選擇 ,kernel下console的注冊(cè),user空間console的選陵姿擇。
一 指定kernel調(diào)試console
首先看kernel啟動(dòng)時(shí)如何獲取和處理指定的console參數(shù)。
kernel的啟動(dòng)參數(shù)cmdline可以指定調(diào)試console,如指定‘console=ttyS0,115200’,
kernel如何解析cmdline,我之前寫了一篇博文如下:
根據(jù)之前的分析,cmdline中有console=xxx,start_kernel中parse_args遍歷.init.setup段所有obs_kernel_param。
kernel/printk.c中注冊(cè)了‘console=’的解析函數(shù)console_setup(注冊(cè)了obs_kernel_param),所以匹配成功,會(huì)調(diào)用console_setup來(lái)解析,如下:
view plain copy
static int __init console_setup(char *str)
{
char buf.name) + 4>; /* 4 for index */
char *s, *options, *brl_options = NULL;
int idx;
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
if (!memcmp(str, “brl,”, 4)) {
brl_options = “”;
str += 4;
} else if (!memcmp(str, “brl=”, 4)) {
brl_options = str + 4;
str = strchr(brl_options, ‘,’);
if (!str) {
printk(KERN_ERR “need port name after brl=\n”);
return 1;
}
*(str++) = 0;
}
#endif
/*
* Decode str into name, index, options.
*/
if (str >= ‘0’ && str = ‘0’ && *s name, name, sizeof(c->name));
c->options = options;
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
c->brl_options = brl_options;
#endif
c->index = idx;
return 0;
}
kernel利用結(jié)構(gòu)體數(shù)組console_cmdline,最多可支持8個(gè)cmdline傳入的console參數(shù)。
__add_preferred_console將name idx options保存到數(shù)組下一個(gè)成員console_cmdline結(jié)構(gòu)體中,如果數(shù)組中已有重名,則不添加,并置selected_console為最新添加的console_cmdline的下標(biāo)號(hào)。
比如cmdline中有“console=ttyS0,console=ttyS1,9600”
則在console_cmdline數(shù)組中console_cmdline代表ttyS0,console_cmdline代表ttyS1,而selected_console=1.
二 kernel下printk console的選擇
kernel下調(diào)試信息是通過(guò)printk輸出,如果要kernel正常打印,則需要搞明白printk怎么選擇輸出的設(shè)備。
關(guān)于printk的實(shí)現(xiàn)原理,我在剛工作的時(shí)候?qū)戇^(guò)一篇博文,kernel版本是2.6.21的,但是原理還是一致的,可供參考:
printk首先將輸出內(nèi)容添加到一個(gè)kernel緩沖區(qū)中,叫l(wèi)og_buf,log_buf相關(guān)代碼如下:
view plain copy
#define MAX_CMDLINECONSOLES 8
static struct console_cmdline console_cmdline;
static int selected_console = -1;
static int preferred_console = -1;
int console_set_on_cmdline;
EXPORT_SYMBOL(console_set_on_cmdline);
/* Flag: console code may call schedule() */
static int console_may_schedule;
#ifdef CONFIG_PRINTK
static char __log_buf;
static char *log_buf = __log_buf;
static int log_buf_len = __LOG_BUF_LEN;
static unsigned logged_chars; /* Number of chars produced since last read+clear operation */
static int saved_console_loglevel = -1;
log_buf的大小由kernel menuconfig配置,我配置的CONFIG_LOG_BUF_SHIFT為17,則log_buf為128k。
printk內(nèi)容會(huì)一直存在log_buf中,log_buf滿了之后則會(huì)從頭在開始存,覆蓋掉原來(lái)的數(shù)據(jù)。
根據(jù)printk的實(shí)現(xiàn)原理,printk最后調(diào)用console_unlock實(shí)現(xiàn)log_buf數(shù)據(jù)刷出到指定設(shè)備。
這里先不關(guān)心printk如何處理log buf數(shù)據(jù)(比如添加內(nèi)容級(jí)別),只關(guān)心printk如何一步步找到指定的輸出設(shè)備,根據(jù)printk.c代碼,可以找到如下線索。
printk->vprintk->console_unlock->call_console_drivers->_call_console_drivers->_call_console_drivers->__call_console_drivers
看線索更底層__call_console_drivers代碼。如下:
view plain copy
/*
* Call the console drivers on a range of log_buf
*/
static void __call_console_drivers(unsigned start, unsigned end)
{
struct console *con;
for_each_console(con) {
if (exclusive_console && con != exclusive_console)
continue;
if ((con->flags & CON_ENABLED) && con->write &&
(cpu_online(p_processor_id()) ||
(con->flags & CON_ANYTIME)))
con->write(con, &LOG_BUF(start), end – start);
}
}
for_each_console定義如下:
view plain copy
/*
* for_each_console() allows you to iterate on each console
*/
#define for_each_console(con) \
for (con = console_drivers; con != NULL; con = con->next)
遍歷console_drivers鏈表所有console struct,如果有exclusive_console,則調(diào)用與exclusive_console一致console的write,
如果exclusive_console為NULL,則調(diào)用所有ENABLE的console的write方法將log buf中start到end的內(nèi)容發(fā)出。
可以看出,execlusive_console來(lái)指定printk輸出唯一console,如果未指定,則向所有enable的console寫。
默認(rèn)情況下execlusive_console=NULL,所以printk默認(rèn)是向所有enable的console寫!
只有一種情況是指定execlusive_console,就是在console注冊(cè)時(shí),下面會(huì)講到。
到這里就很明了了,kernel下每次printk打印,首先存log_buf,然后遍歷console_drivers,找到合適console(execlusive_console或所有enable的),刷出log。
console_drivers鏈表的成員是哪里來(lái)的,誰(shuí)會(huì)指定execulsive_console?接著來(lái)看下一部分,kernel下console的注冊(cè)
linux start kernel的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux start kernel,Linux系統(tǒng)的內(nèi)核啟動(dòng),linux kernel 沒有輸出信息 怎么調(diào)試的信息別忘了在本站進(jìn)行查找喔。
香港云服務(wù)器機(jī)房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)云服務(wù)器廠商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務(wù),提供一站式解決方案。香港服務(wù)器-免備案低延遲-雙向CN2+BGP極速互訪!
網(wǎng)站標(biāo)題:Linux系統(tǒng)的內(nèi)核啟動(dòng)(linuxstartkernel)
瀏覽地址:http://fisionsoft.com.cn/article/djehdsg.html


咨詢
建站咨詢
