日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux系統(tǒng)的內(nèi)核啟動(linuxstartkernel)

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

公司主營業(yè)務(wù):做網(wǎng)站、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出迎澤免費做網(wǎng)站回饋大家。

1. 引導加載程序

在任何操作系統(tǒng)的啟動過程中,之一步始終是啟動引導加載程序。引導加載程序負責在計算機啟動時加載操作系統(tǒng)的內(nèi)核,并且它通常存儲在計算機的啟動磁盤驅(qū)動器中。在Linux系統(tǒng)中,引導加載程序通常是Grub(GRand Unified Bootloader)。

2. 初始化內(nèi)核

啟動引導加載程序之后,計算機將開始初始化操作系統(tǒng)內(nèi)核。這是一個非常關(guān)鍵的步驟,因為它將為系統(tǒng)中的其他組件提供必要的基礎(chǔ)設(shè)施,并確保內(nèi)核能夠正常工作。在Linux系統(tǒng)中,內(nèi)核初始化包括以下步驟:

– 計算機檢測硬件。

– 內(nèi)核加載相應(yīng)的驅(qū)動程序以支持硬件設(shè)備。

– 內(nèi)核初始化內(nèi)存管理子系統(tǒng)、進程管理子系統(tǒng)和文件系統(tǒng)子系統(tǒng)。

– 內(nèi)核啟動守護程序,并設(shè)置其他系統(tǒng)設(shè)置。

3. 用戶空間初始化

完成內(nèi)核初始化后,Linux系統(tǒng)將開始用戶空間初始化。用戶空間是一個操作系統(tǒng)中的一部分,它是用戶和應(yīng)用程序運行的地方。在Linux系統(tǒng)中,用戶空間初始化包括以下步驟:

– 管理用戶和用戶組。

– 初始化系統(tǒng)服務(wù)和設(shè)置程序,以便它們可以正常運行。

– 啟動登錄管理器(如GDM或KDM),以便用戶可以登錄到系統(tǒng)。

4. shell啟動

一旦用戶空間初始化完成,Linux系統(tǒng)將啟動shell。shell是一個命令行界面,它允許用戶與操作系統(tǒng)交互。在Linux系統(tǒng)中,有多個shell可供選擇,例如bash和zsh。

5. 啟動應(yīng)用程序和服務(wù)

在完成用戶空間初始化和shell啟動之后,Linux系統(tǒng)將啟動應(yīng)用程序和服務(wù)。這些應(yīng)用程序和服務(wù)可能是從命令行啟動的,也可能是在系統(tǒng)啟動時自動啟動的,以確保它們一直在后臺運行。

過程是一個非常復雜和精細的過程。沒有引導加載程序和內(nèi)核初始化,操作系統(tǒng)無法正常運行。通過深入了解過程,我們可以更好地理解操作系統(tǒng)的工作原理,并且可以進行調(diào)試和優(yōu)化,使其更加高效和可靠。

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù)!

linux kernel 沒有輸出信息 怎么調(diào)試

最近工作在調(diào)試u虛擬串口,讓其作為kernel啟動的調(diào)試串口老埋,以及user空間的輸入輸出控制臺。

利用這個機會,學習下printk如何選擇往哪個console輸出以及user空間下控制臺如何選擇,記錄與此,與大家共享,也尺含絕方便自己以后翻閱。

Kernel版本號:3.4.55

依照我的思路(還是時間順序)分了4部分,指定kernel調(diào)試console , kernel下printk console的選擇 ,kernel下console的注冊,user空間console的選陵姿擇。

一 指定kernel調(diào)試console

首先看kernel啟動時如何獲取和處理指定的console參數(shù)。

kernel的啟動參數(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中注冊了‘console=’的解析函數(shù)console_setup(注冊了obs_kernel_param),所以匹配成功,會調(diào)用console_setup來解析,如下:

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個cmdline傳入的console參數(shù)。

__add_preferred_console將name idx options保存到數(shù)組下一個成員console_cmdline結(jié)構(gòu)體中,如果數(shù)組中已有重名,則不添加,并置selected_console為最新添加的console_cmdline的下標號。

比如cmdline中有“console=ttyS0,console=ttyS1,9600”

則在console_cmdline數(shù)組中console_cmdline代表ttyS0,console_cmdline代表ttyS1,而selected_console=1.

二 kernel下printk console的選擇

kernel下調(diào)試信息是通過printk輸出,如果要kernel正常打印,則需要搞明白printk怎么選擇輸出的設(shè)備。

關(guān)于printk的實現(xiàn)原理,我在剛工作的時候?qū)戇^一篇博文,kernel版本是2.6.21的,但是原理還是一致的,可供參考:

printk首先將輸出內(nèi)容添加到一個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)容會一直存在log_buf中,log_buf滿了之后則會從頭在開始存,覆蓋掉原來的數(shù)據(jù)。

根據(jù)printk的實現(xiàn)原理,printk最后調(diào)用console_unlock實現(xiàn)log_buf數(shù)據(jù)刷出到指定設(shè)備。

這里先不關(guān)心printk如何處理log buf數(shù)據(jù)(比如添加內(nèi)容級別),只關(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來指定printk輸出唯一console,如果未指定,則向所有enable的console寫。

默認情況下execlusive_console=NULL,所以printk默認是向所有enable的console寫!

只有一種情況是指定execlusive_console,就是在console注冊時,下面會講到。

到這里就很明了了,kernel下每次printk打印,首先存log_buf,然后遍歷console_drivers,找到合適console(execlusive_console或所有enable的),刷出log。

console_drivers鏈表的成員是哪里來的,誰會指定execulsive_console?接著來看下一部分,kernel下console的注冊

linux start kernel的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux start kernel,Linux系統(tǒng)的內(nèi)核啟動,linux kernel 沒有輸出信息 怎么調(diào)試的信息別忘了在本站進行查找喔。

香港云服務(wù)器機房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)云服務(wù)器廠商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務(wù),提供一站式解決方案。香港服務(wù)器-免備案低延遲-雙向CN2+BGP極速互訪!


當前文章:Linux系統(tǒng)的內(nèi)核啟動(linuxstartkernel)
URL地址:http://www.dlmjj.cn/article/djehdsg.html