




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 【學(xué)習(xí)目標(biāo)】l熟悉嵌入式系統(tǒng)開(kāi)發(fā)環(huán)境的構(gòu)建 l熟悉U-Boot的移植l掌握嵌入式Linux操作系統(tǒng)內(nèi)核編譯 嵌入式系統(tǒng)開(kāi)發(fā)環(huán)境的構(gòu)建嵌入式系統(tǒng)開(kāi)發(fā)環(huán)境的構(gòu)建3.1U-bootU-boot的移植的移植3.2嵌入式Linux操作系統(tǒng)內(nèi)核編譯3.3習(xí)題與練習(xí)習(xí)題與練習(xí)3.4 所謂交叉編譯,就是利用運(yùn)行在某臺(tái)計(jì)算所謂交叉編譯,就是利用運(yùn)行在某臺(tái)計(jì)算機(jī)(宿主機(jī))上的編譯器編譯某個(gè)源程序,生機(jī)(宿主機(jī))上的編譯器編譯某個(gè)源程序,生成在另一臺(tái)機(jī)器(目標(biāo)機(jī))上運(yùn)行的目標(biāo)代碼成在另一臺(tái)機(jī)器(目標(biāo)機(jī))上運(yùn)行的目標(biāo)代碼的過(guò)程。使用交叉編譯的原因主要有兩個(gè),一的過(guò)程。使用交叉編譯的原因主要有兩個(gè),一是目標(biāo)平臺(tái)所需要
2、的是目標(biāo)平臺(tái)所需要的Bootloader以及操作系統(tǒng)以及操作系統(tǒng)核心沒(méi)有建立起來(lái)時(shí),需要做交叉編譯;二是核心沒(méi)有建立起來(lái)時(shí),需要做交叉編譯;二是一般目標(biāo)板的資源都比較有限,不具備一定的一般目標(biāo)板的資源都比較有限,不具備一定的處理器能力和存儲(chǔ)空間,需要有強(qiáng)大的宿主處理器能力和存儲(chǔ)空間,需要有強(qiáng)大的宿主PC機(jī)為它完成大部分的調(diào)試編譯任務(wù)。機(jī)為它完成大部分的調(diào)試編譯任務(wù)。binutils : 是一組二進(jìn)制處理工具的集合,包是一組二進(jìn)制處理工具的集合,包括連接器,匯編器和其他用于目標(biāo)文件和檔案的括連接器,匯編器和其他用于目標(biāo)文件和檔案的工具工具 。binutils的主要工具介紹如下:的主要工具介紹如下
3、: addr2line:把程序地址轉(zhuǎn)換為文件名和行號(hào)。在命令:把程序地址轉(zhuǎn)換為文件名和行號(hào)。在命令行中給它一個(gè)地址和一個(gè)可執(zhí)行文件名,它就會(huì)使用這行中給它一個(gè)地址和一個(gè)可執(zhí)行文件名,它就會(huì)使用這個(gè)可執(zhí)行文件的調(diào)試信息指出在給出的地址上是哪個(gè)文個(gè)可執(zhí)行文件的調(diào)試信息指出在給出的地址上是哪個(gè)文件以及行號(hào)。件以及行號(hào)。 ar:建立、修改、提取檔案文件。檔案文件是包含多:建立、修改、提取檔案文件。檔案文件是包含多個(gè)文件內(nèi)容的一個(gè)大文件,其結(jié)構(gòu)保證了可以恢復(fù)原始個(gè)文件內(nèi)容的一個(gè)大文件,其結(jié)構(gòu)保證了可以恢復(fù)原始文件內(nèi)容。文件內(nèi)容。 as:主要用來(lái)編譯:主要用來(lái)編譯GNU C編譯器編譯器gcc輸出的匯編文件
4、,輸出的匯編文件,產(chǎn)生的目標(biāo)文件由連接器產(chǎn)生的目標(biāo)文件由連接器ld連接。連接。 c+filt:連接器使用它來(lái)過(guò)濾:連接器使用它來(lái)過(guò)濾 C+ 和和 Java 符符號(hào),防止重載函數(shù)沖突。號(hào),防止重載函數(shù)沖突。 gprof: 顯示程序調(diào)用段的各種數(shù)據(jù)。顯示程序調(diào)用段的各種數(shù)據(jù)。 ld:是連接器,它把一些目標(biāo)和歸檔文件結(jié)合:是連接器,它把一些目標(biāo)和歸檔文件結(jié)合在一起,重定位數(shù)據(jù),并鏈接符號(hào)引用。通常,在一起,重定位數(shù)據(jù),并鏈接符號(hào)引用。通常,建立一個(gè)新編譯程序的最后一步就是調(diào)用建立一個(gè)新編譯程序的最后一步就是調(diào)用ld。 nm:列出目標(biāo)文件中的符號(hào)。:列出目標(biāo)文件中的符號(hào)。 objcopy:把一種目標(biāo)文
5、件中的內(nèi)容復(fù)制到另一:把一種目標(biāo)文件中的內(nèi)容復(fù)制到另一種類型的目標(biāo)文件中種類型的目標(biāo)文件中. objdump: 顯示一個(gè)或者更多目標(biāo)文件的信息。顯示一個(gè)或者更多目標(biāo)文件的信息。使用選項(xiàng)來(lái)進(jìn)行控制。使用選項(xiàng)來(lái)進(jìn)行控制。 ranlib:產(chǎn)生歸檔文件索引,并將其保存到這:產(chǎn)生歸檔文件索引,并將其保存到這個(gè)歸檔文件中。在索引中列出了歸檔文件各成員個(gè)歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標(biāo)文件。所定義的可重分配目標(biāo)文件。 readelf:顯示:顯示ebf格式可執(zhí)行文件的信息。格式可執(zhí)行文件的信息。 size: 列出目標(biāo)文件每一段的大小以及總體的列出目標(biāo)文件每一段的大小以及總體的大小。
6、默認(rèn)情況下,對(duì)于每個(gè)目標(biāo)文件或者一個(gè)大小。默認(rèn)情況下,對(duì)于每個(gè)目標(biāo)文件或者一個(gè)歸檔文件中的每個(gè)模塊只產(chǎn)生一行輸出。歸檔文件中的每個(gè)模塊只產(chǎn)生一行輸出。 size: 列出目標(biāo)文件每一段的大小以及總體的列出目標(biāo)文件每一段的大小以及總體的大小。默認(rèn)情況下,對(duì)于每個(gè)目標(biāo)文件或者一個(gè)大小。默認(rèn)情況下,對(duì)于每個(gè)目標(biāo)文件或者一個(gè)歸檔文件中的每個(gè)模塊只產(chǎn)生一行輸出。歸檔文件中的每個(gè)模塊只產(chǎn)生一行輸出。 strings:打印某個(gè)文件的可打印字符串,這些:打印某個(gè)文件的可打印字符串,這些字符串最少字符串最少4個(gè)字符長(zhǎng),也可以使用選項(xiàng)個(gè)字符長(zhǎng),也可以使用選項(xiàng)-n設(shè)置設(shè)置字符串的最小長(zhǎng)度。默認(rèn)情況下,它只打印目標(biāo)字符
7、串的最小長(zhǎng)度。默認(rèn)情況下,它只打印目標(biāo)文件初始化和可加載段中的可打印字符;對(duì)于其文件初始化和可加載段中的可打印字符;對(duì)于其它類型的文件它打印整個(gè)文件的可打印字符,這它類型的文件它打印整個(gè)文件的可打印字符,這個(gè)程序?qū)τ诹私夥俏谋疚募膬?nèi)容很有幫助。個(gè)程序?qū)τ诹私夥俏谋疚募膬?nèi)容很有幫助。 strip:丟棄目標(biāo)文件中的全部或者特定符號(hào)。:丟棄目標(biāo)文件中的全部或者特定符號(hào)。 libiberty:包含許多:包含許多GNU程序都會(huì)用到的函數(shù),程序都會(huì)用到的函數(shù),這些程序有:這些程序有: getopt, obstack, strerror, strtol 和和 strtoul等。等。 libbfd :二進(jìn)
8、制文件描述庫(kù)。:二進(jìn)制文件描述庫(kù)。 libopcodes: 用來(lái)處理用來(lái)處理opcodes的庫(kù)的庫(kù), 在生成一在生成一些應(yīng)用程序的時(shí)候也會(huì)用到它。些應(yīng)用程序的時(shí)候也會(huì)用到它。windres:一個(gè)一個(gè)windows資源的編譯器。資源的編譯器。GCC :工具是編譯程序的最為主要的工具。工具是編譯程序的最為主要的工具。GCC包括以下幾個(gè)主要的工具:包括以下幾個(gè)主要的工具:Cpp:C預(yù)處理器。預(yù)處理器。g+:C+編譯器。編譯器。gcc:C編譯器。編譯器。gccbug:創(chuàng)建:創(chuàng)建bug報(bào)告的報(bào)告的Shell腳本。腳本。gcov:分析在程序中哪里做優(yōu)化效果好。:分析在程序中哪里做優(yōu)化效果好。libgcc*
9、:gcc的運(yùn)行庫(kù)。的運(yùn)行庫(kù)。libstdc+:標(biāo)準(zhǔn):標(biāo)準(zhǔn)C+庫(kù),包含許多常用函庫(kù),包含許多常用函數(shù)。數(shù)。libsupc+:提供支持:提供支持C+語(yǔ)言的庫(kù)函數(shù)。語(yǔ)言的庫(kù)函數(shù)。 Glibe:是提供系統(tǒng)調(diào)用和基本函數(shù)的是提供系統(tǒng)調(diào)用和基本函數(shù)的 C 庫(kù),庫(kù),比如比如open(), malloc(), printf()等等。所有動(dòng)態(tài)連等等。所有動(dòng)態(tài)連接的程序都要用到它接的程序都要用到它 。Glibc 中主要有以下程序:中主要有以下程序:l catchsegv:當(dāng)程序發(fā)生:當(dāng)程序發(fā)生segmentation fault的的時(shí)候時(shí)候, 用來(lái)建立一個(gè)堆棧跟蹤。用來(lái)建立一個(gè)堆棧跟蹤。l gencat:建立消息
10、列表。:建立消息列表。l getconf:針對(duì)文件系統(tǒng)的指定變量顯示其系:針對(duì)文件系統(tǒng)的指定變量顯示其系統(tǒng)設(shè)置值。統(tǒng)設(shè)置值。l getent:從系統(tǒng)管理數(shù)據(jù)庫(kù)獲取一個(gè)條目。:從系統(tǒng)管理數(shù)據(jù)庫(kù)獲取一個(gè)條目。l glibcbug:建立:建立glibc的的bug報(bào)告并且發(fā)送到報(bào)告并且發(fā)送到bug報(bào)告的郵件地址。報(bào)告的郵件地址。l iconv:轉(zhuǎn)化字符集。:轉(zhuǎn)化字符集。l iconvconfig:建立快速讀取的:建立快速讀取的iconv模塊所使模塊所使用的設(shè)置文件。用的設(shè)置文件。l ldconfig:設(shè)置動(dòng)態(tài)鏈接庫(kù)的實(shí)時(shí)綁定。:設(shè)置動(dòng)態(tài)鏈接庫(kù)的實(shí)時(shí)綁定。l ldd:列出每個(gè)程序或者命令需要的共享庫(kù)。:
11、列出每個(gè)程序或者命令需要的共享庫(kù)。l lddlibc4: 輔助輔助 ldd 操作目標(biāo)文件。操作目標(biāo)文件。l locale: 是一個(gè)是一個(gè) Perl 程序,可以告訴編譯器程序,可以告訴編譯器打開(kāi)或關(guān)閉內(nèi)建的打開(kāi)或關(guān)閉內(nèi)建的locale支持。支持。l localedef: 編譯編譯locale標(biāo)準(zhǔn)。標(biāo)準(zhǔn)。l nscd:提供對(duì)常用名稱設(shè)備調(diào)用的緩存的守護(hù):提供對(duì)常用名稱設(shè)備調(diào)用的緩存的守護(hù)進(jìn)程。進(jìn)程。l nscd_nischeck:檢查在進(jìn)行:檢查在進(jìn)行NIS+偵查時(shí)是否需偵查時(shí)是否需要安全模式。要安全模式。l pcprofiledump:打印:打印PC profiling產(chǎn)生的信息。產(chǎn)生的信息。l
12、 pt_chown:是一個(gè)輔助程序,幫助:是一個(gè)輔助程序,幫助grantpt設(shè)置設(shè)置子虛擬終端的屬主,用戶組和讀寫權(quán)限。子虛擬終端的屬主,用戶組和讀寫權(quán)限。l rpcgen:產(chǎn)生實(shí)現(xiàn):產(chǎn)生實(shí)現(xiàn)RPC協(xié)議的協(xié)議的C代碼。代碼。l rpcinfo:對(duì):對(duì)RPC服務(wù)器產(chǎn)生一個(gè)服務(wù)器產(chǎn)生一個(gè)RPC呼叫。呼叫。l sln:用來(lái)創(chuàng)建符號(hào)鏈接,由于它本身是靜態(tài):用來(lái)創(chuàng)建符號(hào)鏈接,由于它本身是靜態(tài)連接的,在動(dòng)態(tài)連接不起作用的時(shí)候,連接的,在動(dòng)態(tài)連接不起作用的時(shí)候,sln仍然可仍然可以建立符號(hào)鏈接。以建立符號(hào)鏈接。l sprof:讀取并顯示共享目標(biāo)的特征描述數(shù)據(jù)。:讀取并顯示共享目標(biāo)的特征描述數(shù)據(jù)。l tzse
13、lect:對(duì)用戶提出關(guān)于當(dāng)前位置的問(wèn)題:對(duì)用戶提出關(guān)于當(dāng)前位置的問(wèn)題,并并輸出時(shí)區(qū)信息到標(biāo)準(zhǔn)輸出。輸出時(shí)區(qū)信息到標(biāo)準(zhǔn)輸出。l xtrace:通過(guò)打印當(dāng)前執(zhí)行的函數(shù)跟蹤程序執(zhí):通過(guò)打印當(dāng)前執(zhí)行的函數(shù)跟蹤程序執(zhí)行情況。行情況。l zdump:顯示時(shí)區(qū)。:顯示時(shí)區(qū)。l zic:時(shí)區(qū)編譯器。:時(shí)區(qū)編譯器。l ld.so:幫助動(dòng)態(tài)鏈接庫(kù)的執(zhí)行。:幫助動(dòng)態(tài)鏈接庫(kù)的執(zhí)行。l libBrokenLocale:幫助程序處理破損:幫助程序處理破損locale,如如Mozilla。l libSegFault:處理:處理 segmentation fault 信號(hào),信號(hào),試圖捕捉試圖捕捉segfaults。l lib
14、anl:異步名稱查詢庫(kù)。:異步名稱查詢庫(kù)。l L ibbsd-compat:為了在:為了在linux下執(zhí)行一些下執(zhí)行一些BSD程序程序,libbsd-compat提供了必要的可移植性。提供了必要的可移植性。llibc:是主要的:是主要的C庫(kù)庫(kù)-常用函數(shù)的集成。常用函數(shù)的集成。llibcrypt:加密編碼庫(kù)。:加密編碼庫(kù)。llibdl:動(dòng)態(tài)連接接口。:動(dòng)態(tài)連接接口。llibg:g+的運(yùn)行時(shí)。的運(yùn)行時(shí)。llibieee:IEEE浮點(diǎn)運(yùn)算庫(kù)。浮點(diǎn)運(yùn)算庫(kù)。llibm:數(shù)學(xué)函數(shù)庫(kù)。:數(shù)學(xué)函數(shù)庫(kù)。llibmcheck:包括了啟動(dòng)時(shí)需要的代碼。:包括了啟動(dòng)時(shí)需要的代碼。llibmemusage:幫助:幫助
15、memusage 搜集程序運(yùn)行時(shí)搜集程序運(yùn)行時(shí)內(nèi)存占用的信息。內(nèi)存占用的信息。llibnsl:網(wǎng)絡(luò)服務(wù)庫(kù)。:網(wǎng)絡(luò)服務(wù)庫(kù)。llibnss*: 是名稱服務(wù)切換庫(kù),包含了解釋主機(jī)是名稱服務(wù)切換庫(kù),包含了解釋主機(jī)名,用戶名,組名,別名,服務(wù),協(xié)議等等的函名,用戶名,組名,別名,服務(wù),協(xié)議等等的函數(shù)。數(shù)。llibpcprofile:幫助內(nèi)核跟蹤在函數(shù):幫助內(nèi)核跟蹤在函數(shù), 源碼行和命源碼行和命令中令中CPU使用時(shí)間。使用時(shí)間。llibpthread:POSIX 線程庫(kù)。線程庫(kù)。llibresolv:創(chuàng)建:創(chuàng)建,發(fā)送及解釋到互聯(lián)網(wǎng)域名服務(wù)發(fā)送及解釋到互聯(lián)網(wǎng)域名服務(wù)器的數(shù)據(jù)包。器的數(shù)據(jù)包。llibrpcsv
16、c:提供:提供RPC的其他服務(wù)。的其他服務(wù)。llibrt: 提供了大部分的提供了大部分的POSIX.1b實(shí)時(shí)擴(kuò)展的接實(shí)時(shí)擴(kuò)展的接口???。llibthread_db: 對(duì)建立多線程程序的調(diào)試很有對(duì)建立多線程程序的調(diào)試很有用。用。llibutil: 包含了在很多不同的包含了在很多不同的 Unix程序中使用程序中使用的的“標(biāo)準(zhǔn)標(biāo)準(zhǔn)”函數(shù)。函數(shù)。 Bootloader 就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過(guò)這段小程序,可以初始化行的一段小程序。通過(guò)這段小程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境
17、帶到一個(gè)合適的狀態(tài),以便為最終的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。 針對(duì)針對(duì)ARM處理器,常見(jiàn)的處理器,常見(jiàn)的Bootloader有有U-Boot、RedBoot、ARMBoot等:等:lU-Boot :它是它是sourceforge上的一個(gè)開(kāi)放源代碼的項(xiàng)上的一個(gè)開(kāi)放源代碼的項(xiàng)目,可對(duì)目,可對(duì)PowerPC、ARM、MIPS、x86等處理器提供等處理器提供支持,它支持的嵌入式操作系統(tǒng)有支持,它支持的嵌入式操作系統(tǒng)有Linux、VxWorks、NetBSD、QNX、RTEMS等,是目前支持最廣泛、使用等,是目前支持最廣泛、
18、使用最多的最多的Bootloader。 3.2.1 3.2.1 BootloaderBootloader概述概述lRedBoot : RedBoot是是Redhat公司隨公司隨eCos (Embedded Configurable Operating System)發(fā)布的)發(fā)布的一個(gè)一個(gè)Boot方案,是一個(gè)開(kāi)源項(xiàng)目。方案,是一個(gè)開(kāi)源項(xiàng)目。lARMBoot:是是sourceforge上的一個(gè)開(kāi)放源代碼的項(xiàng)上的一個(gè)開(kāi)放源代碼的項(xiàng)目,它最初的設(shè)計(jì)只是針對(duì)目,它最初的設(shè)計(jì)只是針對(duì)ARM處理器體系結(jié)構(gòu),所處理器體系結(jié)構(gòu),所以它可以很容易地被移植到各種以以它可以很容易地被移植到各種以ARM為核心的平臺(tái)為核
19、心的平臺(tái)上。上。 圖圖3-1是一個(gè)同時(shí)裝有是一個(gè)同時(shí)裝有 Bootloader、內(nèi)核的啟動(dòng)參數(shù)、內(nèi)核的啟動(dòng)參數(shù)、內(nèi)核映像和根文件系統(tǒng)映像的固態(tài)存儲(chǔ)設(shè)備的典型空間內(nèi)核映像和根文件系統(tǒng)映像的固態(tài)存儲(chǔ)設(shè)備的典型空間分配結(jié)構(gòu)圖。分配結(jié)構(gòu)圖。 圖3-1 固態(tài)存儲(chǔ)設(shè)備的典型空間分配結(jié)構(gòu)3.2.2 3.2.2 BootloaderBootloader的啟動(dòng)流程的啟動(dòng)流程 Bootloader 的啟動(dòng)過(guò)程有單階段(的啟動(dòng)過(guò)程有單階段(Single Stage)和多)和多階段(階段(Multi-Stage)兩種形式。通常多階段的)兩種形式。通常多階段的 Bootloader 能能提供更為復(fù)雜的功能,以及更好的可
20、移植性。從固態(tài)存儲(chǔ)設(shè)提供更為復(fù)雜的功能,以及更好的可移植性。從固態(tài)存儲(chǔ)設(shè)備上啟動(dòng)的備上啟動(dòng)的 Bootloader 大多都是大多都是2 階段的啟動(dòng)過(guò)程,也即啟階段的啟動(dòng)過(guò)程,也即啟動(dòng)過(guò)程可以分為動(dòng)過(guò)程可以分為 stage 1 和和 stage 2 兩部分。兩部分。 stage1 通常包括以下步驟(按執(zhí)行的先后順序):通常包括以下步驟(按執(zhí)行的先后順序): (1)硬件設(shè)備初始化。)硬件設(shè)備初始化。 這是這是 Bootloader 一開(kāi)始就執(zhí)行的操作,其目的是為一開(kāi)始就執(zhí)行的操作,其目的是為 stage2 的執(zhí)行以及隨后的的執(zhí)行以及隨后的 kernel 的執(zhí)行準(zhǔn)備好一些基本的的執(zhí)行準(zhǔn)備好一些基本的
21、硬件環(huán)境。它通常包括以下步驟:硬件環(huán)境。它通常包括以下步驟: l屏蔽所有的中斷。為中斷提供服務(wù)通常是屏蔽所有的中斷。為中斷提供服務(wù)通常是OS 設(shè)備驅(qū)動(dòng)程設(shè)備驅(qū)動(dòng)程序的責(zé)任,因此在序的責(zé)任,因此在Bootloader 的執(zhí)行全過(guò)程中可以不必響的執(zhí)行全過(guò)程中可以不必響應(yīng)任何中斷。中斷屏蔽可以通過(guò)寫應(yīng)任何中斷。中斷屏蔽可以通過(guò)寫 CPU 的中斷屏蔽寄存的中斷屏蔽寄存器或狀態(tài)寄存器(比如器或狀態(tài)寄存器(比如 ARM 的的 CPSR 寄存器)來(lái)完成。寄存器)來(lái)完成。 l設(shè)置設(shè)置 CPU 的速度和時(shí)鐘頻率。的速度和時(shí)鐘頻率。 l RAM 初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控
22、制器的功能寄存器以及各內(nèi)存庫(kù)控制寄存器等。制器的功能寄存器以及各內(nèi)存庫(kù)控制寄存器等。 l初始化初始化 LED。典型地,通過(guò)。典型地,通過(guò) GPIO 來(lái)驅(qū)動(dòng)來(lái)驅(qū)動(dòng) LED,其目的是表明系統(tǒng)的狀態(tài)是其目的是表明系統(tǒng)的狀態(tài)是 OK 還是還是 Error。如。如果板子上沒(méi)有果板子上沒(méi)有 LED,那么也可以通過(guò)初始化,那么也可以通過(guò)初始化 UART 向串口打印向串口打印 Bootloader 的的 Logo 字符信息字符信息來(lái)完成這一點(diǎn)。來(lái)完成這一點(diǎn)。 l 關(guān)閉關(guān)閉 CPU 內(nèi)部指令數(shù)據(jù)內(nèi)部指令數(shù)據(jù) cache。 (2)為加載)為加載 Bootloader 的的 stage2 準(zhǔn)備準(zhǔn)備 RAM 空間???/p>
23、間。 為了獲得更快的執(zhí)行速度,通常把為了獲得更快的執(zhí)行速度,通常把 stage2 加載到加載到 R A M 空 間 中 來(lái) 執(zhí) 行 , 因 此 必 須 為 加 載空 間 中 來(lái) 執(zhí) 行 , 因 此 必 須 為 加 載 Bootloader 的的 stage2 準(zhǔn)備好一段可用的準(zhǔn)備好一段可用的RAM 空空間范圍。間范圍。 (3)拷貝)拷貝 Bootloader 的的 stage2 到到 RAM 空間中??臻g中。 拷貝時(shí)要確定拷貝時(shí)要確定stage2 的可執(zhí)行映象在固態(tài)的可執(zhí)行映象在固態(tài)存儲(chǔ)設(shè)備的存放起始地址和終止地址一級(jí)存儲(chǔ)設(shè)備的存放起始地址和終止地址一級(jí)RAM 空間的起始地址??臻g的起始地址。
24、 (4)設(shè)置好堆棧。)設(shè)置好堆棧。 堆棧指針的設(shè)置是為了執(zhí)行堆棧指針的設(shè)置是為了執(zhí)行 C 語(yǔ)言代碼作好準(zhǔn)語(yǔ)言代碼作好準(zhǔn)備。此外,在設(shè)置堆棧指針備。此外,在設(shè)置堆棧指針 sp 之前,也可以關(guān)閉之前,也可以關(guān)閉 LED 燈,以提示用戶準(zhǔn)備跳轉(zhuǎn)到燈,以提示用戶準(zhǔn)備跳轉(zhuǎn)到 stage2。經(jīng)過(guò)上述。經(jīng)過(guò)上述這些執(zhí)行步驟后,系統(tǒng)的物理內(nèi)存布局應(yīng)該如下圖這些執(zhí)行步驟后,系統(tǒng)的物理內(nèi)存布局應(yīng)該如下圖3-2所示。所示。圖3-2 Bootloader 的 stage2 可執(zhí)行映象剛被拷貝到 RAM 空間時(shí)的系統(tǒng)內(nèi)存布局(5)跳轉(zhuǎn)到)跳轉(zhuǎn)到 stage2 的的 C 入口點(diǎn)。入口點(diǎn)。 在上述一切都就緒后,就可以跳轉(zhuǎn)到
25、在上述一切都就緒后,就可以跳轉(zhuǎn)到 Bootloader 的的 stage2 去執(zhí)行了。比如,在去執(zhí)行了。比如,在 ARM 系統(tǒng)中,可以通過(guò)修改系統(tǒng)中,可以通過(guò)修改 PC 寄存器為合寄存器為合適的地址來(lái)實(shí)現(xiàn)。適的地址來(lái)實(shí)現(xiàn)。 stage2 通常包括以下步驟(按執(zhí)行的先后順序):通常包括以下步驟(按執(zhí)行的先后順序):(1)初始化本階段要使用到的硬件設(shè)備。)初始化本階段要使用到的硬件設(shè)備。 通常包括:初始化至少一個(gè)串口,以便和終通常包括:初始化至少一個(gè)串口,以便和終端用戶進(jìn)行端用戶進(jìn)行 I/O 輸出信息;初始化計(jì)時(shí)器等。在初輸出信息;初始化計(jì)時(shí)器等。在初始化這些設(shè)備之前,也可以重新把始化這些設(shè)備之前
26、,也可以重新把 LED 燈點(diǎn)亮,以燈點(diǎn)亮,以表明已經(jīng)進(jìn)入表明已經(jīng)進(jìn)入 main()函數(shù)執(zhí)行。設(shè)備初始化完成后,函數(shù)執(zhí)行。設(shè)備初始化完成后,可以輸出一些打印信息,程序名字字符串、版本號(hào)可以輸出一些打印信息,程序名字字符串、版本號(hào)等。等。 (2)檢測(cè)系統(tǒng)內(nèi)存映射()檢測(cè)系統(tǒng)內(nèi)存映射(memory map)。)。 所謂內(nèi)存映射就是指在整個(gè)所謂內(nèi)存映射就是指在整個(gè) 4GB 物理物理地址空間中有哪些地址范圍被分配用來(lái)尋地址空間中有哪些地址范圍被分配用來(lái)尋址系統(tǒng)的址系統(tǒng)的 RAM 單元。單元。 (3)將)將kernel 映像和根文件系統(tǒng)映像從映像和根文件系統(tǒng)映像從 Flash 上讀上讀到到 RAM 空間中
27、。空間中。 首先規(guī)劃內(nèi)存占用的布局,這里包括兩個(gè)方面:首先規(guī)劃內(nèi)存占用的布局,這里包括兩個(gè)方面:內(nèi)核映像所占用的內(nèi)存范圍;根文件系統(tǒng)所占用的內(nèi)核映像所占用的內(nèi)存范圍;根文件系統(tǒng)所占用的內(nèi)存范圍。在規(guī)劃內(nèi)存占用的布局時(shí),主要考慮基內(nèi)存范圍。在規(guī)劃內(nèi)存占用的布局時(shí),主要考慮基地址和映像的大小兩個(gè)方面。地址和映像的大小兩個(gè)方面。 對(duì)于內(nèi)核映像,一般將其拷貝到從基地址開(kāi)始對(duì)于內(nèi)核映像,一般將其拷貝到從基地址開(kāi)始的大約的大約1MB大小的內(nèi)存范圍內(nèi)。大小的內(nèi)存范圍內(nèi)。(4)為內(nèi)核設(shè)置啟動(dòng)參數(shù)。)為內(nèi)核設(shè)置啟動(dòng)參數(shù)。 在將內(nèi)核映像和根文件系統(tǒng)映像拷貝到在將內(nèi)核映像和根文件系統(tǒng)映像拷貝到RAM空間中后,就可以
28、準(zhǔn)備啟動(dòng)空間中后,就可以準(zhǔn)備啟動(dòng) Linux 內(nèi)核了。但是內(nèi)核了。但是在調(diào)用內(nèi)核之前,應(yīng)該作一步準(zhǔn)備工作,即設(shè)置在調(diào)用內(nèi)核之前,應(yīng)該作一步準(zhǔn)備工作,即設(shè)置 Linux 內(nèi)核的啟動(dòng)參數(shù)。內(nèi)核的啟動(dòng)參數(shù)。 (5)調(diào)用內(nèi)核。)調(diào)用內(nèi)核。 Bootloader 調(diào)用調(diào)用 Linux 內(nèi)核的方法是直接跳內(nèi)核的方法是直接跳轉(zhuǎn)到內(nèi)核的第一條指令處,也即直接跳轉(zhuǎn)到轉(zhuǎn)到內(nèi)核的第一條指令處,也即直接跳轉(zhuǎn)到 MEM_START0 x8000 地址處。在跳轉(zhuǎn)時(shí),下列地址處。在跳轉(zhuǎn)時(shí),下列條件要滿足:條件要滿足: lCPU 寄存器的設(shè)置:寄存器的設(shè)置:R00;R1機(jī)器類型機(jī)器類型 ID;關(guān)于關(guān)于 Machine Typ
29、e Number,可以參見(jiàn),可以參見(jiàn) linux/arch/arm/tools/mach-types;R2啟動(dòng)參數(shù)啟動(dòng)參數(shù)標(biāo)記列表在標(biāo)記列表在 RAM 中起始基地址。中起始基地址。 lCPU 模式:必須禁止中斷(模式:必須禁止中斷(IRQs和和FIQs););CPU 必須必須 SVC 模式。模式。 lCache 和和 MMU 的設(shè)置:的設(shè)置:MMU 必須關(guān)閉;指必須關(guān)閉;指令令 Cache 可以打開(kāi)也可以關(guān)閉;數(shù)據(jù)可以打開(kāi)也可以關(guān)閉;數(shù)據(jù) Cache 必必須關(guān)閉。須關(guān)閉。Bootloader的系統(tǒng)啟動(dòng)方案流程如圖3-3所示。圖3-3 Bootloader系統(tǒng)啟動(dòng)方案流圖3.2.3 U-Boot
30、 3.2.3 U-Boot 分析與移植分析與移植 U-Boot (Universal Bootloader),即),即通用通用Bootloader,是遵循,是遵循GPL條款的開(kāi)放條款的開(kāi)放源碼項(xiàng)目。從源碼項(xiàng)目。從FADSROM、8xxROM、PPCBOOT逐步發(fā)展演化而來(lái)。其前身是逐步發(fā)展演化而來(lái)。其前身是由德國(guó)由德國(guó)DENX軟件工程中心的軟件工程中心的Wolfgang D e n k 基 于基 于 8 x x R O M 的 源 碼 創(chuàng) 建 的的 源 碼 創(chuàng) 建 的PPCBOOT工程。工程。 U-Boot不僅僅支持嵌入式不僅僅支持嵌入式Linux系統(tǒng)的系統(tǒng)的引導(dǎo),當(dāng)前,它還支持引導(dǎo),當(dāng)前,它
31、還支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作嵌入式操作系統(tǒng)。其目前要支持的目標(biāo)操作系統(tǒng)是系統(tǒng)。其目前要支持的目標(biāo)操作系統(tǒng)是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。 U-Boot有如下特性:有如下特性:l開(kāi)放源碼開(kāi)放源碼,支持多種嵌入式操作系統(tǒng)內(nèi)核,支持多種嵌入式操作系統(tǒng)內(nèi)核,如如Linux、NetBSD, VxWorks, QNX,
32、RTEMS, ARTOS, LynxOS;l支持多個(gè)處理器系列,如支持多個(gè)處理器系列,如PowerPC、ARM、x86、MIPS、XScale;l較高的可靠性和穩(wěn)定性較高的可靠性和穩(wěn)定性;l高度靈活的功能設(shè)置,適合高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等;系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等;l豐富的設(shè)備驅(qū)動(dòng)源碼,如串口、以太網(wǎng)、豐富的設(shè)備驅(qū)動(dòng)源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;、鍵盤等;l較為豐富的開(kāi)發(fā)調(diào)試文檔與強(qiáng)大的網(wǎng)絡(luò)技術(shù)支較為豐富的開(kāi)發(fā)調(diào)試文檔與強(qiáng)大的網(wǎng)絡(luò)技術(shù)支持;持;l支持支持NFS掛載、
33、掛載、RAMDISK(壓縮或非壓縮)(壓縮或非壓縮)形式的根文件系統(tǒng);形式的根文件系統(tǒng);l支持支持NFS掛載、從掛載、從Flash中引導(dǎo)壓縮或非壓縮系統(tǒng)內(nèi)核;中引導(dǎo)壓縮或非壓縮系統(tǒng)內(nèi)核;l可靈活設(shè)置、傳遞多個(gè)關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)可靈活設(shè)置、傳遞多個(gè)關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開(kāi)發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤其對(duì)在不同開(kāi)發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤其對(duì)Linux支支持最強(qiáng);持最強(qiáng);l支持目標(biāo)板環(huán)境變量多種存儲(chǔ)方式,如支持目標(biāo)板環(huán)境變量多種存儲(chǔ)方式,如Flash、NVRAM、EEPROM;lCRC32校驗(yàn),可校驗(yàn)校驗(yàn),可校驗(yàn)Flash中內(nèi)核、中內(nèi)核、RAMDISK鏡像文鏡像文件是否
34、完好。件是否完好。l上電自檢功能:上電自檢功能:SDRAM、Flash大小自動(dòng)檢測(cè),大小自動(dòng)檢測(cè),SDRAM故障檢測(cè),故障檢測(cè),CPU型號(hào)。型號(hào)。l特殊功能:特殊功能:XIP內(nèi)核引導(dǎo)。內(nèi)核引導(dǎo)。 U-Boot源碼結(jié)構(gòu):源碼結(jié)構(gòu): 從網(wǎng)站上下載得到從網(wǎng)站上下載得到U-Boot源碼包,例如:源碼包,例如:U-Boot-1.1.26tar.bz2,解壓就可以得到全部,解壓就可以得到全部U-Boot源程序。在頂源程序。在頂層目錄下有層目錄下有26個(gè)子目錄,分別存放和管理不同的源程序。個(gè)子目錄,分別存放和管理不同的源程序。這些目錄中所要存放的文件有其規(guī)則,可以分為這些目錄中所要存放的文件有其規(guī)則,可以分
35、為4類。類。l第第1類目錄與處理器體系結(jié)構(gòu)或者開(kāi)發(fā)板硬件直接相關(guān);類目錄與處理器體系結(jié)構(gòu)或者開(kāi)發(fā)板硬件直接相關(guān);l第第2類目錄是一些通用的函數(shù)或者驅(qū)動(dòng)程序;類目錄是一些通用的函數(shù)或者驅(qū)動(dòng)程序;l第第3類目錄是通用的設(shè)備驅(qū)動(dòng)程序。類目錄是通用的設(shè)備驅(qū)動(dòng)程序。l第第4類目錄是類目錄是U-Boot的應(yīng)用程序、工具或者文檔。的應(yīng)用程序、工具或者文檔。目 錄特 性解 釋 說(shuō) 明board平臺(tái)依賴存放電路板相關(guān)的目錄文件,例如:RPXlite(mpc8xx)、smdk2410(arm920t)、sc520_cdp(x86) 等目錄cpu平臺(tái)依賴存放CPU相關(guān)的目錄文件,例如:mpc8xx、ppc4xx、a
36、rm720t、arm920t、 xscale、i386等目錄lib_ppc平臺(tái)依賴存放對(duì)PowerPC體系結(jié)構(gòu)通用的文件,主要用于實(shí)現(xiàn)PowerPC平臺(tái)通用的函數(shù)lib_arm平臺(tái)依賴存放對(duì)ARM體系結(jié)構(gòu)通用的文件,主要用于實(shí)現(xiàn)ARM平臺(tái)通用的函數(shù)lib_i386平臺(tái)依賴存放對(duì)X86體系結(jié)構(gòu)通用的文件,主要用于實(shí)現(xiàn)X86平臺(tái)通用的函數(shù)include通用頭文件和開(kāi)發(fā)板配置文件,所有開(kāi)發(fā)板的配置文件都在configs目錄下common通用通用的多功能函數(shù)實(shí)現(xiàn)表3-1 U-Boot頂層目錄說(shuō)明lib_generic通用通用庫(kù)函數(shù)的實(shí)現(xiàn)Net通用存放網(wǎng)絡(luò)的程序Fs通用存放文件系統(tǒng)的程序Post通用存放
37、上電自檢程序drivers通用通用的設(shè)備驅(qū)動(dòng)程序,主要有以太網(wǎng)接口的驅(qū)動(dòng)Disk通用硬盤接口程序Rtc通用RTC的驅(qū)動(dòng)程序Dtt通用數(shù)字溫度測(cè)量器或者傳感器的驅(qū)動(dòng)examples應(yīng)用例程一些獨(dú)立運(yùn)行的應(yīng)用程序的例子,例如helloworldtools工具存放制作S-Record 或者 U-Boot格式的映像等工具,例如mkimageDoc文檔開(kāi)發(fā)使用文檔U-Boot的編譯:的編譯: U-Boot的源碼是通過(guò)的源碼是通過(guò)GCC和和Makefile組織組織編譯的。頂層目錄下的編譯的。頂層目錄下的Makefile首先可以設(shè)置開(kāi)首先可以設(shè)置開(kāi)發(fā)板的定義,然后遞歸地調(diào)用各級(jí)子目錄下的發(fā)板的定義,然后遞歸
38、地調(diào)用各級(jí)子目錄下的Makefile,最后把編譯過(guò)的程序鏈接成,最后把編譯過(guò)的程序鏈接成U-Boot映映像。像。表3-2 U-Boot編譯生成的映像文件文件名稱說(shuō)明System.mapU-Boot映像的符號(hào)表u-bootU-Boot映像的ELF格式u-boot.binU-Boot映像原始的二進(jìn)制格式u-boot.srecU-Boot映像的S-Record格式U-Boot的移植:的移植: U-Boot能夠支持多種體系結(jié)構(gòu)的處理器,能夠支持多種體系結(jié)構(gòu)的處理器,支持的開(kāi)發(fā)板也越來(lái)越多。因?yàn)橹С值拈_(kāi)發(fā)板也越來(lái)越多。因?yàn)锽ootloader是完是完全依賴硬件平臺(tái)的,所以在新電路板上需要移植全依賴硬件平
39、臺(tái)的,所以在新電路板上需要移植U-Boot程序。程序。移植移植U-Boot的基本步驟如下:的基本步驟如下:(1)在頂層)在頂層Makefile中為開(kāi)發(fā)板添加新的配置選項(xiàng)。中為開(kāi)發(fā)板添加新的配置選項(xiàng)。(2)創(chuàng)建一個(gè)新目錄存放開(kāi)發(fā)板相關(guān)的代碼,并且添加)創(chuàng)建一個(gè)新目錄存放開(kāi)發(fā)板相關(guān)的代碼,并且添加文件。文件。(3)為開(kāi)發(fā)板添加新的配置文件)為開(kāi)發(fā)板添加新的配置文件(4)配置開(kāi)發(fā)板)配置開(kāi)發(fā)板(5)編譯)編譯U-Boot(6)添加驅(qū)動(dòng)或者功能選項(xiàng)。在能夠編譯通過(guò)的基礎(chǔ)上,)添加驅(qū)動(dòng)或者功能選項(xiàng)。在能夠編譯通過(guò)的基礎(chǔ)上,還要實(shí)現(xiàn)還要實(shí)現(xiàn)U-Boot的以太網(wǎng)接口、的以太網(wǎng)接口、Flash擦寫等功能。擦寫
40、等功能。(7)調(diào)試)調(diào)試U-Boot源代碼,直到源代碼,直到U-Boot在開(kāi)發(fā)板上能夠正在開(kāi)發(fā)板上能夠正常啟動(dòng)。常啟動(dòng)。3.2.4 VIVI 分析 VIVI是韓國(guó)是韓國(guó)MIZI Research公司為其開(kāi)發(fā)的公司為其開(kāi)發(fā)的SMDK2410開(kāi)發(fā)板編寫的一款開(kāi)發(fā)板編寫的一款Bootloader。VIVI也也有前面說(shuō)過(guò)的兩種工作模式,啟動(dòng)加載模式可以在有前面說(shuō)過(guò)的兩種工作模式,啟動(dòng)加載模式可以在一段時(shí)間(這個(gè)時(shí)間可更改)后自行啟動(dòng)一段時(shí)間(這個(gè)時(shí)間可更改)后自行啟動(dòng)Linux內(nèi)內(nèi)核,這是核,這是VIVI的默認(rèn)模式。在下載模式下,的默認(rèn)模式。在下載模式下,VIVI為為用戶提供一個(gè)命令行接口,通過(guò)該接口
41、可以使用用戶提供一個(gè)命令行接口,通過(guò)該接口可以使用VIVI提供的一些命令,見(jiàn)表提供的一些命令,見(jiàn)表3-3。表3-3 VIVI的命令命令功能Load把二進(jìn)制文件載入Flash或RAMPart操作MTD分區(qū)信息Param設(shè)置參數(shù)Boot啟動(dòng)系統(tǒng)Flash管理Flash配置VIVI使用的命令如下:make distclean; make menuconfig; 編 譯 之 前 , 要 先 指 定 M a k e f i l e 文 件 中 的LINUX_INCLUDE_DIR、CROSS_COMPILE和ARM_GCC_LIBS。配置并保存后,使用make命令開(kāi)始編譯VIVI。 VIVI的代碼包括的
42、代碼包括arch, init, lib, drivers和和include等幾個(gè)目錄,共有等幾個(gè)目錄,共有200多個(gè)文件。多個(gè)文件。VIVI包包括下面幾個(gè)目錄。括下面幾個(gè)目錄。l arch:此目錄包括了所有:此目錄包括了所有VIVI支持的目標(biāo)板支持的目標(biāo)板的子目錄,這里只有的子目錄,這里只有s3c2410目錄。目錄。l drivers:其中包括了引導(dǎo)內(nèi)核需要的設(shè)備的:其中包括了引導(dǎo)內(nèi)核需要的設(shè)備的驅(qū)動(dòng)程序(驅(qū)動(dòng)程序(mtd和串口)。和串口)。mtd目錄下的目錄下的maps、nand和和nor三個(gè)目錄分別是內(nèi)存映射、三個(gè)目錄分別是內(nèi)存映射、NAND Flash驅(qū)動(dòng)和驅(qū)動(dòng)和NOR Flash驅(qū)動(dòng)。
43、驅(qū)動(dòng)。linit:這個(gè)目錄只有:這個(gè)目錄只有main.c和和version.c兩個(gè)文件。兩個(gè)文件。和普通的和普通的C程序一樣,程序一樣,VIVI將從將從main函數(shù)開(kāi)始執(zhí)函數(shù)開(kāi)始執(zhí)行。行。llib:一些平臺(tái)公共的接口代碼,比如:一些平臺(tái)公共的接口代碼,比如time.c里里的的udelay( )和和mdelay( )。linclude:頭文件的公共目錄,其中的:頭文件的公共目錄,其中的s3c2410.h定義了這塊處理器的一些寄存器,以及定義了這塊處理器的一些寄存器,以及NAND Flash的一些寄存器等。的一些寄存器等。platform/smdk2410.h定定義了與開(kāi)發(fā)板相關(guān)的資源配置參數(shù),我
44、們往往只義了與開(kāi)發(fā)板相關(guān)的資源配置參數(shù),我們往往只需修改這個(gè)文件就可以配置目標(biāo)板的參數(shù),如波需修改這個(gè)文件就可以配置目標(biāo)板的參數(shù),如波特率、引導(dǎo)參數(shù)、物理內(nèi)存映射等。特率、引導(dǎo)參數(shù)、物理內(nèi)存映射等。 Linux內(nèi)核是指內(nèi)核是指Linux源代碼經(jīng)過(guò)編譯和鏈接源代碼經(jīng)過(guò)編譯和鏈接生成的映像文件(生成的映像文件(Image)。通常編譯嵌入式)。通常編譯嵌入式Linux內(nèi)核都是通過(guò)不同的內(nèi)核都是通過(guò)不同的make命令來(lái)實(shí)現(xiàn)的命令來(lái)實(shí)現(xiàn)的,它的執(zhí)行配置文件就是通常所說(shuō)的它的執(zhí)行配置文件就是通常所說(shuō)的Makefile,而而不同的不同的Makefile又通過(guò)互相的依賴關(guān)系構(gòu)成一又通過(guò)互相的依賴關(guān)系構(gòu)成一個(gè)統(tǒng)
45、一的整體去完成建立依存關(guān)系、建立內(nèi)核個(gè)統(tǒng)一的整體去完成建立依存關(guān)系、建立內(nèi)核等功能。等功能。3.3.1 Linux3.3.1 Linux內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)1、進(jìn)程調(diào)度(、進(jìn)程調(diào)度(SCHED) 控制進(jìn)程對(duì)控制進(jìn)程對(duì)CPU的訪問(wèn)。當(dāng)需要選擇下一個(gè)進(jìn)程運(yùn)的訪問(wèn)。當(dāng)需要選擇下一個(gè)進(jìn)程運(yùn)行時(shí),由調(diào)度程序選擇最值得運(yùn)行的進(jìn)程??蛇\(yùn)行進(jìn)程行時(shí),由調(diào)度程序選擇最值得運(yùn)行的進(jìn)程??蛇\(yùn)行進(jìn)程實(shí)際上是僅等待實(shí)際上是僅等待CPU資源的進(jìn)程,如果某個(gè)進(jìn)程在等待資源的進(jìn)程,如果某個(gè)進(jìn)程在等待其它資源,則該進(jìn)程是不可運(yùn)行進(jìn)程。其它資源,則該進(jìn)程是不可運(yùn)行進(jìn)程。Linux使用了比使用了比較簡(jiǎn)單的基于優(yōu)先級(jí)的進(jìn)程調(diào)度算法選擇新
46、的進(jìn)程。較簡(jiǎn)單的基于優(yōu)先級(jí)的進(jìn)程調(diào)度算法選擇新的進(jìn)程。2、內(nèi)存管理(、內(nèi)存管理(MM) 允許多個(gè)進(jìn)程安全的共享主內(nèi)存區(qū)域。允許多個(gè)進(jìn)程安全的共享主內(nèi)存區(qū)域。Linux的內(nèi)存管理支持虛擬內(nèi)存,即在計(jì)算機(jī)中的內(nèi)存管理支持虛擬內(nèi)存,即在計(jì)算機(jī)中運(yùn)行的程序,其代碼,數(shù)據(jù),堆棧的總量可以運(yùn)行的程序,其代碼,數(shù)據(jù),堆棧的總量可以超過(guò)實(shí)際內(nèi)存的大小,操作系統(tǒng)只是把當(dāng)前使超過(guò)實(shí)際內(nèi)存的大小,操作系統(tǒng)只是把當(dāng)前使用的程序塊保留在內(nèi)存中,其余的程序塊則保用的程序塊保留在內(nèi)存中,其余的程序塊則保留在磁盤中。必要時(shí),操作系統(tǒng)負(fù)責(zé)在磁盤和留在磁盤中。必要時(shí),操作系統(tǒng)負(fù)責(zé)在磁盤和內(nèi)存間交換程序塊。內(nèi)存管理從邏輯上分為硬內(nèi)
47、存間交換程序塊。內(nèi)存管理從邏輯上分為硬件無(wú)關(guān)部分和硬件有關(guān)部分。硬件無(wú)關(guān)部分提件無(wú)關(guān)部分和硬件有關(guān)部分。硬件無(wú)關(guān)部分提供了進(jìn)程的映射和邏輯內(nèi)存的對(duì)換;硬件相關(guān)供了進(jìn)程的映射和邏輯內(nèi)存的對(duì)換;硬件相關(guān)的部分為內(nèi)存管理硬件提供了虛擬接口。的部分為內(nèi)存管理硬件提供了虛擬接口。3、虛擬文件系統(tǒng)(、虛擬文件系統(tǒng)(VirtualFileSystem,VFS) 隱藏了各種硬件的具體細(xì)節(jié),為所有的設(shè)備隱藏了各種硬件的具體細(xì)節(jié),為所有的設(shè)備提供了統(tǒng)一的接口,提供了統(tǒng)一的接口,VFS提供了多達(dá)數(shù)十種不提供了多達(dá)數(shù)十種不同的文件系統(tǒng)。虛擬文件系統(tǒng)可以分為邏輯文同的文件系統(tǒng)。虛擬文件系統(tǒng)可以分為邏輯文件系統(tǒng)和設(shè)備驅(qū)動(dòng)
48、程序。邏輯文件系統(tǒng)指件系統(tǒng)和設(shè)備驅(qū)動(dòng)程序。邏輯文件系統(tǒng)指Linux所支持的文件系統(tǒng),如所支持的文件系統(tǒng),如ext2,fat等,設(shè)備驅(qū)動(dòng)程等,設(shè)備驅(qū)動(dòng)程序指為每一種硬件控制器所編寫的設(shè)備驅(qū)動(dòng)程序指為每一種硬件控制器所編寫的設(shè)備驅(qū)動(dòng)程序模塊。序模塊。4、網(wǎng)絡(luò)接口(、網(wǎng)絡(luò)接口(NET) 提供了對(duì)各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的存取和各種網(wǎng)絡(luò)硬提供了對(duì)各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的存取和各種網(wǎng)絡(luò)硬件的支持。網(wǎng)絡(luò)接口可分為網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)件的支持。網(wǎng)絡(luò)接口可分為網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動(dòng)程序。網(wǎng)絡(luò)協(xié)議部分負(fù)責(zé)實(shí)現(xiàn)每一種可能的動(dòng)程序。網(wǎng)絡(luò)協(xié)議部分負(fù)責(zé)實(shí)現(xiàn)每一種可能的網(wǎng)絡(luò)傳輸協(xié)議。網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序負(fù)責(zé)與硬件網(wǎng)絡(luò)傳輸協(xié)議。網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序負(fù)責(zé)與硬件設(shè)
49、備通訊,每一種可能的硬件設(shè)備都有相應(yīng)的設(shè)備通訊,每一種可能的硬件設(shè)備都有相應(yīng)的設(shè)備驅(qū)動(dòng)程序。設(shè)備驅(qū)動(dòng)程序。5、 進(jìn)程間通訊進(jìn)程間通訊(IPC) 支持進(jìn)程間各種通信機(jī)制。支持進(jìn)程間各種通信機(jī)制。 各個(gè)子系統(tǒng)之間的依賴關(guān)系如下:各個(gè)子系統(tǒng)之間的依賴關(guān)系如下:l 進(jìn)程調(diào)度與內(nèi)存管理之間的關(guān)系:這兩進(jìn)程調(diào)度與內(nèi)存管理之間的關(guān)系:這兩個(gè)子系統(tǒng)互相依賴。在多道程序環(huán)境下,個(gè)子系統(tǒng)互相依賴。在多道程序環(huán)境下,程序要運(yùn)行必須為之創(chuàng)建進(jìn)程,而創(chuàng)建進(jìn)程序要運(yùn)行必須為之創(chuàng)建進(jìn)程,而創(chuàng)建進(jìn)程的第一件事情,就是將程序和數(shù)據(jù)裝入程的第一件事情,就是將程序和數(shù)據(jù)裝入內(nèi)存。內(nèi)存。l進(jìn)程間通信與內(nèi)存管理的關(guān)系:進(jìn)程間通信子進(jìn)程
50、間通信與內(nèi)存管理的關(guān)系:進(jìn)程間通信子系統(tǒng)要依賴內(nèi)存管理支持共享內(nèi)存通信機(jī)制,這系統(tǒng)要依賴內(nèi)存管理支持共享內(nèi)存通信機(jī)制,這種機(jī)制允許兩個(gè)進(jìn)程除了擁有自己的私有空間,種機(jī)制允許兩個(gè)進(jìn)程除了擁有自己的私有空間,還可以存取共同的內(nèi)存區(qū)域。還可以存取共同的內(nèi)存區(qū)域。l虛擬文件系統(tǒng)與網(wǎng)絡(luò)接口之間的關(guān)系:虛擬文虛擬文件系統(tǒng)與網(wǎng)絡(luò)接口之間的關(guān)系:虛擬文件系統(tǒng)利用網(wǎng)絡(luò)接口支持網(wǎng)絡(luò)文件系統(tǒng)件系統(tǒng)利用網(wǎng)絡(luò)接口支持網(wǎng)絡(luò)文件系統(tǒng)(NFS),也也利用內(nèi)存管理支持利用內(nèi)存管理支持RAMDISK設(shè)備。設(shè)備。l內(nèi)存管理與虛擬文件系統(tǒng)之間的關(guān)系:內(nèi)內(nèi)存管理與虛擬文件系統(tǒng)之間的關(guān)系:內(nèi)存管理利用虛擬文件系統(tǒng)支持交換,交換存管理利用
51、虛擬文件系統(tǒng)支持交換,交換進(jìn)程進(jìn)程(swapd)定期由調(diào)度程序調(diào)度,這也是定期由調(diào)度程序調(diào)度,這也是內(nèi)存管理依賴于進(jìn)程調(diào)度的唯一原因。當(dāng)內(nèi)存管理依賴于進(jìn)程調(diào)度的唯一原因。當(dāng)一個(gè)進(jìn)程存取的內(nèi)存映射被換出時(shí),內(nèi)存一個(gè)進(jìn)程存取的內(nèi)存映射被換出時(shí),內(nèi)存管理向文件系統(tǒng)發(fā)出請(qǐng)求,同時(shí),掛起當(dāng)管理向文件系統(tǒng)發(fā)出請(qǐng)求,同時(shí),掛起當(dāng)前正在運(yùn)行的進(jìn)程。前正在運(yùn)行的進(jìn)程。 Linux內(nèi)核的配置系統(tǒng)由內(nèi)核的配置系統(tǒng)由3部分組成:部分組成:(1)Makefile:分布在:分布在Linux內(nèi)核源代碼中的內(nèi)核源代碼中的Makefile,定義,定義Linux內(nèi)核的編譯規(guī)則;內(nèi)核的編譯規(guī)則;(2)配置文件()配置文件(conf
52、ig.in):給用戶提供配置):給用戶提供配置選擇的功能。選擇的功能。(3)配置工具,包括配置命令解釋器(對(duì)配置)配置工具,包括配置命令解釋器(對(duì)配置腳本中使用的命令進(jìn)行解釋)和配置用戶界面腳本中使用的命令進(jìn)行解釋)和配置用戶界面(提供基于字符界面、基于(提供基于字符界面、基于Ncurses圖形界面和圖形界面和基于基于Xwindows圖形界面的用戶配置界面)。圖形界面的用戶配置界面)。內(nèi)核配置方法有以下幾種:內(nèi)核配置方法有以下幾種:(1) make config: 基于文本的最為傳統(tǒng)的配置基于文本的最為傳統(tǒng)的配置界面界面, 進(jìn)入命令行進(jìn)入命令行, 可以一行一行的配置可以一行一行的配置,該方法該
53、方法較煩瑣。較煩瑣。(2) make menuconfig: 基于文本菜單的配置界基于文本菜單的配置界面面, 是字符終端下常用的方式。是字符終端下常用的方式。(3) make xconfig: 基于圖形窗口模式的配置界基于圖形窗口模式的配置界面面, Xwindow下推薦使用。下推薦使用。(4) make oldconfig:自動(dòng)讀入自動(dòng)讀入“config”配置文配置文件件,并且只要求用戶設(shè)定前次沒(méi)有設(shè)定過(guò)的選項(xiàng)。并且只要求用戶設(shè)定前次沒(méi)有設(shè)定過(guò)的選項(xiàng)。3.3.3 3.3.3 內(nèi)核編譯的過(guò)程內(nèi)核編譯的過(guò)程# make clean#make dep) #make zImage注意:如果在配置內(nèi)核時(shí)選擇了對(duì)內(nèi)核模塊的支持,還注意:如果在配置內(nèi)核時(shí)選擇了對(duì)內(nèi)核模塊的支持,還需要使用如下命令單獨(dú)地編譯內(nèi)核模塊:需要
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GA/T 2184-2024法庭科學(xué)現(xiàn)場(chǎng)截干樹木材積測(cè)定規(guī)程
- 豪華裝修轉(zhuǎn)讓協(xié)議書范本
- 設(shè)備搬運(yùn)托運(yùn)合同協(xié)議
- 赴日工作勞務(wù)合同協(xié)議
- 購(gòu)買保密協(xié)議合同模板
- 購(gòu)買足球干貨合同協(xié)議
- 訪談保密協(xié)議書范本
- asp面試題目及答案
- 2025年中考物理模擬考試物理試題二及答案
- 2025年考古學(xué)專業(yè)研究生入學(xué)考試試題及答案
- GB/T 17937-2024電工用鋁包鋼線
- MOOC 英語(yǔ)語(yǔ)法與寫作-暨南大學(xué) 中國(guó)大學(xué)慕課答案
- 2024年山東省濟(jì)南市歷下區(qū)中考二模地理試題
- 電子書 -《商業(yè)的底層邏輯》
- 外貿(mào)談判知識(shí)分享課件
- 教學(xué)課件-思想政治教育心理學(xué)-楊芷英
- 網(wǎng)絡(luò)互連設(shè)備-交換機(jī)VLAN配置
- 國(guó)際企業(yè)的財(cái)務(wù)管理完整版
- 2023年浙江省高考滿分作文:科技的新秀人文的毒酒
- 藥品召回函和通知單
- NY/T 405-2000脫毒大款種蒜(苗)病毒檢測(cè)技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論