新聞中心
深入分析Linux MIPS的啟動(dòng)過(guò)程

Linux是一種流行的開(kāi)源操作系統(tǒng),被廣泛用于各種設(shè)備上。其中,MIPS是一種常見(jiàn)的處理器架構(gòu),因此,有很多設(shè)備使用Linux MIPS作為操作系統(tǒng)。本文將深入分析Linux MIPS的啟動(dòng)過(guò)程,以幫助讀者了解Linux MIPS在啟動(dòng)時(shí)做了什么。
Boot Loader
在開(kāi)機(jī)時(shí),處理器會(huì)從ROM中讀取之一個(gè)指令,這通常是一個(gè)Boot Loader。Boot Loader是一種小型程序,通常用于引導(dǎo)操作系統(tǒng)。在Linux MIPS中,Boot Loader通常是u-boot,它是由Denx開(kāi)發(fā)的一款通用Boot Loader。
在運(yùn)行Boot Loader時(shí),它會(huì)首先進(jìn)行硬件初始化,例如初始化DRAM和一些I/O設(shè)備。然后,它會(huì)檢查存儲(chǔ)設(shè)備,包括閃存,硬盤(pán)和SD卡等,找到Linux內(nèi)核的二進(jìn)制文件。Boot Loader將這個(gè)文件加載到內(nèi)存中的一個(gè)地址,然后跳轉(zhuǎn)到該地址,以使內(nèi)核開(kāi)始運(yùn)行。
Linux內(nèi)核
一旦Boot Loader完成了它的任務(wù),它就會(huì)跳轉(zhuǎn)到內(nèi)核的入口點(diǎn)。在Linux MIPS中,內(nèi)核的入口點(diǎn)通常為0x80010000。在跳轉(zhuǎn)到內(nèi)核時(shí),Boot Loader會(huì)傳遞一些參數(shù),例如內(nèi)核和文件系統(tǒng)的地址。特別是,它會(huì)傳遞一個(gè)參數(shù)initrd,指向一個(gè)稱為initramfs的文件系統(tǒng)。這個(gè)文件系統(tǒng)是一個(gè)臨時(shí)文件系統(tǒng),用于在加載根文件系統(tǒng)之前提供必要的驅(qū)動(dòng)程序和文件。
一旦內(nèi)核開(kāi)始運(yùn)行,它將初始化各種硬件設(shè)備并加載驅(qū)動(dòng)程序。它還會(huì)解壓縮initrd,并將其掛載到內(nèi)核中。這個(gè)臨時(shí)文件系統(tǒng)包含了許多驅(qū)動(dòng)程序和其他配置文件,以便內(nèi)核可以在加載根文件系統(tǒng)之前對(duì)硬件進(jìn)行正確地初始化。內(nèi)核還會(huì)檢查并啟動(dòng)各種基礎(chǔ)服務(wù),例如系統(tǒng)日志和網(wǎng)絡(luò)服務(wù)。
根文件系統(tǒng)
經(jīng)過(guò)上述步驟后,內(nèi)核將加載根文件系統(tǒng)。根文件系統(tǒng)是一個(gè)至關(guān)重要的部分,它包含了操作系統(tǒng)的所有用戶空間程序和配置文件。在Linux MIPS中,根文件系統(tǒng)通常是一個(gè)ramdisk,即一個(gè)保存在內(nèi)存中的文件系統(tǒng)。當(dāng)然,也可以使用硬盤(pán)或網(wǎng)絡(luò)文件系統(tǒng)等其他類(lèi)型的根文件系統(tǒng)。
一旦根文件系統(tǒng)加載完畢,內(nèi)核將啟動(dòng)init進(jìn)程。init是Linux中的之一個(gè)用戶進(jìn)程,它是所有其他用戶進(jìn)程的祖先。init為啟動(dòng)和管理其他進(jìn)程提供了必要的服務(wù)。例如,它會(huì)啟動(dòng)shell程序,并在必要時(shí)加載其他服務(wù)和守護(hù)進(jìn)程。
在Linux MIPS的啟動(dòng)過(guò)程中,Boot Loader從存儲(chǔ)設(shè)備中找到內(nèi)核并將其加載到內(nèi)存中。內(nèi)核初始化硬件設(shè)備并加載驅(qū)動(dòng)程序,然后解壓縮initrd并掛載它。之后,內(nèi)核加載根文件系統(tǒng),并啟動(dòng)init進(jìn)程。init進(jìn)程為其他用戶進(jìn)程提供了服務(wù),實(shí)現(xiàn)了系統(tǒng)的正常運(yùn)行。
深入分析Linux MIPS的啟動(dòng)過(guò)程可以幫助我們更好地了解操作系統(tǒng)在啟動(dòng)時(shí)做了什么。只有深入了解操作系統(tǒng)的啟動(dòng)過(guò)程,我們才能更好地調(diào)試和優(yōu)化它們。
相關(guān)問(wèn)題拓展閱讀:
- 怎樣在 1 秒內(nèi)啟動(dòng) Linux
怎樣在 1 秒內(nèi)啟動(dòng) Linux
Linux內(nèi)核的最初部分代碼是用匯編語(yǔ)言寫(xiě)的(文件是boot/bootsect.s)。(我的匯編水平有限,暫且不看),它首先把自身這部分代碼移到絕對(duì)地址0x90000,把下面的2K代碼從引導(dǎo)設(shè)備加載到地址0x90200上,內(nèi)核的其余部分加載到地址0x10000處。在加載系統(tǒng)時(shí)顯示“l(fā)oading”.然后,程序控制權(quán)交給另一個(gè)實(shí)模式匯編程序(boot/Setup.S)。接下來(lái),此程序把整個(gè)系統(tǒng)從地址0x10000移到地址0x1000,進(jìn)入保護(hù)模式。程序控制轉(zhuǎn)給系統(tǒng)的其余部分即地址0x1000。下一個(gè)步驟是系統(tǒng)內(nèi)核的解壓過(guò)程,這部分代碼在地址0x1000(文件/Boot/head.S),該段程序初始化寄存器,然后執(zhí)行decompress_kernel(),這個(gè)函數(shù)源于zBoot/inflate.c、zBoot/unzip.c和zBoot/misc.c三個(gè)文件Loading .uncompress ..main.c —> start_kernel() 開(kāi)始.開(kāi)始 printk(banner);Linux version 2.2.6 (root@lance) (gcc version 2.7.2.3) (檢查一下GCC 的版本號(hào), 在/init/main.c 中如果gcc 的版本號(hào)不夠,時(shí)不允許編譯內(nèi)核的)#40 Sun Apr 18 17:44:20 CST 1999調(diào)用init_time()打印出以下內(nèi)容:DetectedHz processor.然后運(yùn)行 console_init() –> drivers/char/tty_io.c */Console: colour VGA+ 80×25運(yùn)行一個(gè)循環(huán),測(cè)量一下 MIPS – 據(jù)說(shuō)是要用一個(gè)確定的機(jī)器指令周期來(lái)實(shí)現(xiàn)實(shí)時(shí)的延遲.Calibrating delay loop 199.48 BogoMIPS初始化內(nèi)存/* init_mem */Memory: 63396k/65536k available (848k kernel code, 408k reserved, 856k data, 28k/** dquote_init() **/VFS: Diskquotas version dquot_6.4.0 initialized察看cpu 的類(lèi)型(在2.2.14 以后聽(tīng)說(shuō)增加了對(duì)多種cpu 的支持, 以后我可得用心看看,if I can find a bug of intel then ……)CPU: Intel Pentium Pro stepping 09初始或處理器與協(xié)處理器,對(duì)于比較老的處理器, linux 會(huì)用軟件模擬協(xié)處理器?Checking 386/387 coupling OK, FPU using exception 16 error reporting.檢查治理的合法性Checking ‘hlt’ instruction OK.POSIX conformance testing by UNIFIX此后調(diào)用 linux_thread(init ,..,..,)(arch/i386/kernel/process.c)創(chuàng)建一個(gè)運(yùn)行 init 的進(jìn)程.進(jìn)入了第二階段用戶模式 ( user_mode )End of start_kerne最后進(jìn)入cpu_idle ( arch/i386/kernel/process.c )第二部分 設(shè)備的初始化對(duì)設(shè)備的初始化調(diào)用. init()—>do_basic_init()–+pci_init() 對(duì)pci 設(shè)備的初始化( 在main.c文件中有這樣一段 ifdef PCI …..需要看一下)下面打印出結(jié)果:PCI: PCI BIOS revision 2.10 entry at 0xfd8d1PCI: Using configuration type 1PCI: Probing PCI hardware對(duì)Socket的初始化,socket_init() (這里也許就是linux 的網(wǎng)絡(luò)秘密所在吧,以后我的注意) -Linux NET4.0 for Linux 2.2Based upon Swansea University Computer Society NET3.039NET4: Unix domain sockets 1.0 for Linux NET4.0.NET4: Linux TCP/IP 1.0 for NET4.0IP Protocols: ICMP, UDP, TCPStarting kswapd v 1.5 kswapd_setup()調(diào)用 device_setup()Detected PS/2 Mouse Port.初始化 聲卡Sound initialization startedSound initialization complete初始化 軟驅(qū)Floppy drive(s): fd0 is 1.44MFDC 0 is a National Semiconductor PC87306SCSI 設(shè)備的初始化(scsi0) found at PCI 13/0(scsi0) Wide Channel, SCSI ID=7, 16/255 SCBs(scsi0) Downloading sequencer code 419 instructions downloadedscsi0 : Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast SCSI) 5.1.10/3.2.4scsi : 1 host.Vendor: SEAGATE Model: ST32155W Rev: 0596ype: Direct-Access ANSI SCSI revision: 02Detected scsi disk sda at scsi0, channel 0, id 0, lun 0Vendor: SEAGATE Model: ST32155W Rev: 0596Type: Direct-Access ANSI SCSI revision: 02Detected scsi disk sdb at scsi0, channel 0, id 1, lun 0scsi : detected 2 SCSI disks total.(scsi0:0:0:0) Synchronous at 40.0 Mbyte/sec, offset 8.SCSI device sda: hdwr sector= 512 bytes. Sectors= (scsi0:0:1:0) Synchronous at 40.0 Mbyte/sec, offset 8.SCSI device sdb: hdwr sector= 512 bytes. Sectors= Partition check: sda: sda1 |sdb: sdb1 sdb2 |安裝 文件系統(tǒng) filesystem_setup()安裝設(shè)備驅(qū)動(dòng)程序 mount_root()VFS: Mounted root (ext2 filesystem) readonly.Freeing unused kernel memory: 28k freedAdding Swap: 66540k swap-space (priority -1)Soundblaster audio driver Copyright (C) by Hannu SavolainenSB 3.01 detected OK (220)at 0x220 irq 5 dma 1YM3812 and OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooftat 0x388NET4: AppleTalk 0.18 for Linux NET4.0eth0: Intel EtherExpress Pro 10/100 at 0xf800, 00:A0:C9:49:2F:FF, IRQ 9.Board assembly, Physical connectors present: RJ45Primary interface chip DP83840 PHY #1.DP83840 specific setup, setting register 23 to 8462.General self-test: passed.Serial sub-system self-test: passed.Internal registers self-test: passed.ROM checksum self-test: passed (0x49caa8d6).Receiver lock-up workaround activated.NET4: AppleTalk 0.18 for Linux NET4.0結(jié)束 do_basic_setup()open(“/dev/console”, O_RDWR, 0)開(kāi)始執(zhí)行 /in/init ( execv() )內(nèi)核就此啟動(dòng)完畢
數(shù)據(jù)中心級(jí)別的硬件可以,主要是需要一個(gè)超強(qiáng)的pcie接口的固態(tài)硬盤(pán),和一個(gè)足夠強(qiáng)大的cpu,還要一個(gè)夠大的內(nèi)存。這樣就可以瞬間啟動(dòng)linux,不過(guò)受限于linux啟動(dòng)流程,再快也不可能一秒完成,除非自定制Linux系統(tǒng)。
另外一個(gè)比較取巧的方法是不徹底關(guān)機(jī),只讓linux休眠,使用的時(shí)候按一下電源鍵,甚至動(dòng)一下鼠標(biāo)鍵盤(pán),linux就可以被瞬間喚醒,并顯示登陸界面或桌面
linux-mips啟動(dòng)分析的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux-mips啟動(dòng)分析,深入分析LinuxMIPS的啟動(dòng)過(guò)程,怎樣在 1 秒內(nèi)啟動(dòng) Linux的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)公司提供專(zhuān)業(yè)的建站服務(wù),為您量身定制,歡迎來(lái)電(028-86922220)為您打造專(zhuān)屬于企業(yè)本身的網(wǎng)絡(luò)品牌形象。
成都創(chuàng)新互聯(lián)品牌官網(wǎng)提供專(zhuān)業(yè)的網(wǎng)站建設(shè)、設(shè)計(jì)、制作等服務(wù),是一家以網(wǎng)站建設(shè)為主要業(yè)務(wù)的公司,在網(wǎng)站建設(shè)、設(shè)計(jì)和制作領(lǐng)域具有豐富的經(jīng)驗(yàn)。
網(wǎng)站欄目:深入分析LinuxMIPS的啟動(dòng)過(guò)程(linux-mips啟動(dòng)分析)
本文來(lái)源:http://www.5511xx.com/article/cdepoig.html


咨詢
建站咨詢
