日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

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ò)程。沒(méi)有引導(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 沒(méi)有輸出信息 怎么調(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 沒(méi)有輸出信息 怎么調(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極速互訪!


分享標(biāo)題:Linux系統(tǒng)的內(nèi)核啟動(dòng)(linuxstartkernel)
當(dāng)前鏈接:http://m.5511xx.com/article/djehdsg.html