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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux系统分析之启动流程

發(fā)布時(shí)間:2025/5/22 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统分析之启动流程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

第一部分:內(nèi)核的引導(dǎo)(核內(nèi)引導(dǎo))

啟動(dòng)設(shè)備使用lilo或grub等引導(dǎo)程序開(kāi)始引導(dǎo)Linux系統(tǒng),當(dāng)引導(dǎo)程序成功完成引導(dǎo)任務(wù)后,Linux從它們手中接管了CPU的控制權(quán), 然后CPU就開(kāi)始執(zhí)行Linux的核心映象代碼,開(kāi)始了Linux啟動(dòng)過(guò)程。這里使用了幾個(gè)匯編程序來(lái)引導(dǎo)Linux,這一步涉及到Linux源代碼樹(shù)中的“arch/i386/boot”下的這幾個(gè)文件:bootsect.S、setup.S、video.S等。

?

其中bootsect.S是生成引導(dǎo)扇區(qū)的匯編源碼,它完成加載動(dòng)作后直接跳轉(zhuǎn)到setup.S的程序入口。setup.S的主要功能就是將系統(tǒng)參數(shù)(包括內(nèi)存、磁盤(pán)等,由BIOS返回)拷貝到特別內(nèi)存中,以便以后這些參數(shù)被保護(hù)模式下的代碼來(lái)讀取。此外,setup.S還將video.S中的代碼包含進(jìn)來(lái),檢測(cè)和設(shè)置顯示器和顯示模式。最后,setup.S將系統(tǒng)轉(zhuǎn)換到保護(hù)模式,并跳轉(zhuǎn)到 0x100000。

?

0x100000這個(gè)內(nèi)存地址存放的是解壓后的內(nèi)核,因?yàn)镽edHat提供的內(nèi)核包含了眾多驅(qū)動(dòng)和功能而顯得比較大,所以在內(nèi)核編譯中使用了“makebzImage”方式,從而生成壓縮過(guò)的內(nèi)核,在RedHat中內(nèi)核常常被命名為vmlinuz(也有類似initrd-2.6.11.12.img這樣的命名)。在Linux的最初引導(dǎo)過(guò)程中,是通過(guò)"arch/i386/boot/compressed/"中的head.S利用misc.c中定義的decompress_kernel()函數(shù),將內(nèi)核vmlinuz解壓到0x100000的。

?

當(dāng)CPU跳到0x100000時(shí),將執(zhí)行"arch/i386/kernel/head.S"中的 startup_32,它也是vmlinux的入口,然后就跳轉(zhuǎn)到start_kernel()中去了。start_kernel() 是"init/main.c"中的定義的函數(shù),start_kernel()中調(diào)用了一系列初始化函數(shù),以完成kernel本身的設(shè)置。如果順利執(zhí)行完start_kernel(),則基本的Linux核心環(huán)境已經(jīng)建立起來(lái)了。

?

在start_kernel()的最后,通過(guò)調(diào)用kernelthread()函數(shù),系統(tǒng)創(chuàng)建第一個(gè)核心線程init(),自身調(diào)用cpu_idle(NULL)休息。核心線程init()主要是來(lái)進(jìn)行一些外設(shè)初始化的工作的,包括緩存區(qū)管理初始化(fs/buffer.c),虛擬內(nèi)存管理初始化(mm/vmscan.c),文件系統(tǒng)初始化(fs/filesystems.c)和root文件系統(tǒng)的安裝,調(diào)用do_basic_setup()完成外設(shè)及其驅(qū)動(dòng)程序的初始化。

?

當(dāng)do_basic_setup()函數(shù)返回init(),init()又打開(kāi)了/dev/console設(shè)備,重定向三個(gè)標(biāo)準(zhǔn)的輸入輸出文件stdin、stdout和stderr到控制臺(tái),最后,搜索文件系統(tǒng)中的init程序(或者由init=命令行參數(shù)指定的程序),并使用execve()系統(tǒng)調(diào)用加載執(zhí)行init程序。到此init()函數(shù)結(jié)束,init進(jìn)程從內(nèi)核態(tài)切換到用戶態(tài)(進(jìn)程號(hào)1),內(nèi)核的引導(dǎo)部分也到此結(jié)束了。

?

第二部分:運(yùn)行init

init的進(jìn)程號(hào)是1,是系統(tǒng)所有進(jìn)程的起點(diǎn),Linux在完成核內(nèi)引導(dǎo)以后,就開(kāi)始運(yùn)行init程序(init()的最后一行)。init程序讀取并執(zhí)行配置文件/etc/inittab。

?

第三部分:系統(tǒng)初始化

在init的配置文件中有這么一行:

si::sysinit:/etc/rc.d/rc.sysinit

它調(diào)用執(zhí)行了/etc/rc.d/rc.sysinit,而rc.sysinit是一個(gè)bash shell的腳本,它主要是完成一些系統(tǒng)初始化的工作,rc.sysinit是每一個(gè)運(yùn)行級(jí)別都要首先運(yùn)行的重要腳本。它主要完成的工作有:激活交換分區(qū),檢查磁盤(pán),加載硬件模塊以及其它一些需要優(yōu)先執(zhí)行任務(wù)。

?

第四部分:啟動(dòng)對(duì)應(yīng)運(yùn)行級(jí)別的守護(hù)進(jìn)程

在rc.sysinit執(zhí)行后,將返回init繼續(xù)其它的動(dòng)作,通常接下來(lái)會(huì)執(zhí)行到/etc/rc.d/rc程序。以運(yùn)行級(jí)別3為例,init將執(zhí)行配置文件inittab中的以下這行:

l5:5:wait:/etc/rc.d/rc 5

?

這一行表示以5為參數(shù)運(yùn)行/etc/rc.d/rc,/etc/rc.d/rc是一個(gè)Shell腳本,它接受數(shù)字5作為參數(shù),去執(zhí)行/etc/rc.d/rc5.d/目錄下的所有的rc啟動(dòng)腳本。當(dāng)然,/etc/rc.d/rc5.d/目錄中的這些啟動(dòng)腳本實(shí)際上都是一些鏈接文件,而不是真正的rc啟動(dòng)腳本,真正的rc啟動(dòng)腳本實(shí)際上都是放在/etc/rc.d/init.d/目錄下。

?

第五部分:建立終端

rc執(zhí)行完畢后,返回init。這時(shí)基本系統(tǒng)環(huán)境已經(jīng)設(shè)置好了,各種守護(hù)進(jìn)程也已經(jīng)啟動(dòng)了。init接下來(lái)會(huì)打開(kāi)6個(gè)終端(定義在/etc/inittab中),以便用戶登錄系統(tǒng)。通過(guò)按Alt+Fn(n對(duì)應(yīng)1-6)可以在這6個(gè)終端中切換。

?

第六部分:登錄系統(tǒng),啟動(dòng)完成

Login程序會(huì)接收終端程序傳來(lái)的用戶名作為用戶名參數(shù),并進(jìn)行分析。如果用戶名不是root,且存在/etc/nologin文件,login將輸出nologin文件的內(nèi)容,然后退出。這通常用來(lái)系統(tǒng)維護(hù)時(shí)防止非root用戶登錄。

?

只有/etc/securetty中登記了的終端才允許root用戶登錄,如果不存在這個(gè)文件,則root可以在任何終端上登錄。/etc/usertty文件用于對(duì)用戶作出附加訪問(wèn)限制,如果不存在這個(gè)文件,則沒(méi)有其他限制。

?

在分析完用戶名后,login將搜索/etc/passwd以及/etc/shadow來(lái)驗(yàn)證密碼以及設(shè)置賬戶的其它信息,比如:主目錄是什么、使用何種shell。如果沒(méi)有指定主目錄,將默認(rèn)為根目錄;如果沒(méi)有指定shell,將默認(rèn)為/bin/bash。

?

login程序成功后,會(huì)向?qū)?yīng)的終端在輸出最近一次登錄的信息(在/var/log/lastlog中有記錄),并檢查用戶是否有新郵件(在/usr/spool/mail/的對(duì)應(yīng)用戶名目錄下)。然后開(kāi)始設(shè)置各種環(huán)境變量:對(duì)于bash來(lái)說(shuō),系統(tǒng)首先尋找/etc/profile腳本文件,并執(zhí)行它;然后如果用戶的主目錄中存在.bash_profile文件,就執(zhí)行它。

?

總結(jié)

以上是生活随笔為你收集整理的Linux系统分析之启动流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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