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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
詳解Linux內(nèi)核的編譯和安裝

Linux內(nèi)核的作用是將應(yīng)用層序的請(qǐng)求傳遞給硬件,并充當(dāng)?shù)讓域?qū)動(dòng)程序,對(duì)系統(tǒng)中的各種設(shè)備和組件進(jìn)行尋址。目前支持模塊的動(dòng)態(tài)裝卸(裁剪)。Linux內(nèi)核就是基于這個(gè)策略實(shí)現(xiàn)的,下面為打擊詳細(xì)講解一下Linux內(nèi)核的編譯和安裝。

創(chuàng)新互聯(lián)主要從事網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、成都響應(yīng)式網(wǎng)站建設(shè)、程序開(kāi)發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、微信小程序開(kāi)發(fā)等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷(xiāo)經(jīng)驗(yàn),集策劃、開(kāi)發(fā)、設(shè)計(jì)、營(yíng)銷(xiāo)、管理等多方位專(zhuān)業(yè)化運(yùn)作于一體。

Linux內(nèi)核介紹

Linux發(fā)行版是在Linux內(nèi)核的基礎(chǔ)之上,與外帶的應(yīng)用軟件和工具打包配置之后發(fā)行的版本。最初的Linux內(nèi)核在1991年由當(dāng)時(shí)還在芬蘭赫爾辛基大學(xué)計(jì)算機(jī)系讀書(shū)的Linus Torvalds開(kāi)發(fā),之后Linus很快聚集了大量來(lái)自其他自由軟件項(xiàng)目的開(kāi)發(fā)者和用戶(hù)為L(zhǎng)inux內(nèi)核貢獻(xiàn)代碼。當(dāng)前估計(jì)有上千開(kāi)發(fā)者在為L(zhǎng)inux內(nèi)核貢獻(xiàn)代碼。

自2.6.0版本發(fā)布后,Linux內(nèi)核以A.B.C.D的方式命名。A和B的變化可以說(shuō)無(wú)關(guān)緊要,C是內(nèi)核的真實(shí)版本,每一個(gè)版本的變化都會(huì)帶來(lái)新的特性。例如內(nèi)部API的變化等等,改動(dòng)的數(shù)量常常上萬(wàn)。D是安全補(bǔ)丁和bug修復(fù)。如果你是Linux的初學(xué)者或用戶(hù),只需了解stable即可,它代表穩(wěn)定版的內(nèi)核更新。mainline指當(dāng)前的官方內(nèi)核,由Linus Torvalds進(jìn)行更新維護(hù),由開(kāi)發(fā)者們貢獻(xiàn)的代碼主要是合并到mainline當(dāng)中。linux-next和snapshot都是代碼提交周期結(jié)束之前生成的快照,用于給Linux代碼貢獻(xiàn)者們做測(cè)試使用。目前stable版本的更新周期為六到十周,下一個(gè)穩(wěn)定版本的rc基本上每周都會(huì)更新。新版本的內(nèi)核分兩種,一種是Full Source版本,完整的內(nèi)核版本。比較大,一般是tar.gz或者.bz2文件。另一種是patch文件,即補(bǔ)丁文件。patch文件一般只有及時(shí)K到幾百K,但是對(duì)于特定的版本來(lái)說(shuō),你要找到自己對(duì)應(yīng)的版本才能使用。

編譯安裝內(nèi)核

1.下載并解壓內(nèi)核

內(nèi)核下載官網(wǎng):https://www.kernel.org/
解壓內(nèi)核:tar xf linux-2.6.XX.tar.xz

2.定制內(nèi)核:make menuconfig

參見(jiàn)makefile menuconfig過(guò)程講解

3.編譯內(nèi)核和模塊:make

生成內(nèi)核模塊和vmlinuz,initrd.img,Symtem.map文件

4.安裝內(nèi)核和模塊:sudo make modules_install install

復(fù)制模塊文件到/lib/modules目錄下、復(fù)制config,vmlinuz,initrd.img,Symtem.map文件到/boot目錄、更新grub

5.其他命令:

make mrprobe:命令的作用是在每次配置并重新編譯內(nèi)核前需要先執(zhí)行“make mrproper”命令清理源代碼樹(shù),包括過(guò)去曾經(jīng)配置的內(nèi)核配置文件“.config”都將被清除。即進(jìn)行新的編譯工作時(shí)將原來(lái)老的配置文件給刪除到,以免影響新的內(nèi)核編譯。
make dep:生成內(nèi)核功能間的依賴(lài)關(guān)系,為編譯內(nèi)核做好準(zhǔn)備。

幾個(gè)重要的linux內(nèi)核介紹

config

使用make menuconfig 生成的內(nèi)核配置文件,決定將內(nèi)核的各個(gè)功能系統(tǒng)編譯進(jìn)內(nèi)核還是編譯為模塊還是不編譯。

vmlinuz 和 vmlinux

vmlinuz是可引導(dǎo)的、壓縮的內(nèi)核,“vm”代表“Virtual Memory”。Linux 支持虛擬內(nèi)存,不像老的操作系統(tǒng)比如DOS有640KB內(nèi)存的限制,Linux能夠使用硬盤(pán)空間作為虛擬內(nèi)存,因此得名“vm”。vmlinuz是可執(zhí)行的Linux內(nèi)核,vmlinuz的建立有兩種方式:一是編譯內(nèi)核時(shí)通過(guò)“make zImage”創(chuàng)建,zImage適用于小內(nèi)核的情況,它的存在是為了向后的兼容性;二是內(nèi)核編譯時(shí)通過(guò)命令make bzImage創(chuàng)建,bzImage是壓縮的內(nèi)核映像,需要注意,bzImage不是用bzip2壓縮的,bzImage中的bz容易引起誤解,bz表示“big zImage”,bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是一個(gè)壓縮文件,而且在這兩個(gè)文件的開(kāi)頭部分內(nèi)嵌有g(shù)zip解壓縮代碼,所以你不能用gunzip 或 gzip –dc解包vmlinuz。 內(nèi)核文件中包含一個(gè)微型的gzip用于解壓縮內(nèi)核并引導(dǎo)它。兩者的不同之處在于,老的zImage解壓縮內(nèi)核到低端內(nèi)存(第一個(gè)640K),bzImage解壓縮內(nèi)核到高端內(nèi)存(1M以上)。如果內(nèi)核比較小,那么可以采用zImage 或bzImage之一,兩種方式引導(dǎo)的系統(tǒng)運(yùn)行時(shí)是相同的。大的內(nèi)核采用bzImage,不能采用zImage。 vmlinux是未壓縮的內(nèi)核,vmlinuz是vmlinux的壓縮文件。

initrd.img

initrd是“initial ramdisk”的簡(jiǎn)寫(xiě)。initrd一般被用來(lái)臨時(shí)的引導(dǎo)硬件到實(shí)際內(nèi)核vmlinuz能夠接管并繼續(xù)引導(dǎo)的狀態(tài)。比如initrd- 2.4.7-10.img主要是用于加載ext3等文件系統(tǒng)及scsi設(shè)備的驅(qū)動(dòng)。如果你使用的是scsi硬盤(pán),而內(nèi)核vmlinuz中并沒(méi)有這個(gè) scsi硬件的驅(qū)動(dòng),那么在裝入scsi模塊之前,內(nèi)核不能加載根文件系統(tǒng),但scsi模塊存儲(chǔ)在根文件系統(tǒng)的/lib/modules下。為了解決這個(gè)問(wèn)題,可以引導(dǎo)一個(gè)能夠讀實(shí)際內(nèi)核的initrd內(nèi)核并用initrd修正scsi引導(dǎo)問(wèn)題,initrd-2.4.7-10.img是用gzip壓縮的文件。initrd映象文件是使用mkinitrd創(chuàng)建的,mkinitrd實(shí)用程序能夠創(chuàng)建initrd映象文件,這個(gè)命令是RedHat專(zhuān)有的,其它Linux發(fā)行版或許有相應(yīng)的命令。這是個(gè)很方便的實(shí)用程序。具體情況請(qǐng)看幫助:man mkinitrd

System.map

System.map是一個(gè)特定內(nèi)核的內(nèi)核符號(hào)表,由“nm vmlinux”產(chǎn)生并且不相關(guān)的符號(hào)被濾出。
下面幾行來(lái)自/usr/src/linux-2.4/Makefile:

nm vmlinux | grep -v '(compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI)' | sort > System.map

在進(jìn)行程序設(shè)計(jì)時(shí),會(huì)命名一些變量名或函數(shù)名之類(lèi)的符號(hào)。Linux內(nèi)核是一個(gè)很復(fù)雜的代碼塊,有許許多多的全局符號(hào), Linux內(nèi)核不使用符號(hào)名,而是通過(guò)變量或函數(shù)的地址來(lái)識(shí)別變量或函數(shù)名,比如不是使用size_t BytesRead這樣的符號(hào),而是像c0343f20這樣引用這個(gè)變量。 對(duì)于使用計(jì)算機(jī)的人來(lái)說(shuō),更喜歡使用那些像size_t BytesRead這樣的名字,而不喜歡像c0343f20這樣的名字。內(nèi)核主要是用c寫(xiě)的,所以編譯器/連接器允許我們編碼時(shí)使用符號(hào)名,而內(nèi)核運(yùn)行時(shí)使用地址。 然而,在有的情況下,我們需要知道符號(hào)的地址,或者需要知道地址對(duì)應(yīng)的符號(hào),這由符號(hào)表來(lái)完成,符號(hào)表是所有符號(hào)連同它們的地址的列表。

Linux 符號(hào)表使用到2個(gè)文件: /proc/ksyms 、System.map 。/proc/ksyms是一個(gè)“proc file”,在內(nèi)核引導(dǎo)時(shí)創(chuàng)建。實(shí)際上,它并不真正的是一個(gè)文件,它只不過(guò)是內(nèi)核數(shù)據(jù)的表示,卻給人們是一個(gè)磁盤(pán)文件的假象,這從它的文件大小是0可以看 出來(lái)。然而,System.map是存在于你的文件系統(tǒng)上的實(shí)際文件。當(dāng)你編譯一個(gè)新內(nèi)核時(shí),各個(gè)符號(hào)名的地址要發(fā)生變化,你的老的System.map 具有的是錯(cuò)誤的符號(hào)信息,每次內(nèi)核編譯時(shí)產(chǎn)生一個(gè)新的System.map,你應(yīng)當(dāng)用新的System.map來(lái)取代老的System.map。

雖然內(nèi)核本身并不真正使用System.map,但其它程序比如klogd, lsof和ps等軟件需要一個(gè)正確的System.map。如果你使用錯(cuò)誤的或沒(méi)有System.map,klogd的輸出將是不可靠的,這對(duì)于排除程序故障會(huì)帶來(lái)困難。沒(méi)有System.map,你可能會(huì)面臨一些令人煩惱的提示信息。 另外少數(shù)驅(qū)動(dòng)需要System.map來(lái)解析符號(hào),沒(méi)有為你當(dāng)前運(yùn)行的特定內(nèi)核創(chuàng)建的System.map它們就不能正常工作。

Linux的內(nèi)核日志守護(hù)進(jìn)程klogd為了執(zhí)行名稱(chēng)-地址解析,klogd需要使用System.map。System.map應(yīng)當(dāng)放在使用它的軟件能夠找到它的地方。執(zhí)行:man klogd可知,如果沒(méi)有將System.map作為一個(gè)變量的位置給klogd,那么它將按照下面的順序,在三個(gè)地方查System.map:/boot/System.map、/System.map、/usr/src/linux/System.map
System.map也有版本信息,klogd能夠智能地查找正確的映象(map)文件。

makefile menuconfig過(guò)程講解

當(dāng)我們?cè)趫?zhí)行make menuconfig這個(gè)命令時(shí),系統(tǒng)到底幫我們做了哪些工作呢?這里面一共涉及到了一下幾個(gè)文件我們來(lái)一一探討

1.Linux內(nèi)核根目錄下的scripts文件夾

2.arch/$ARCH/Kconfig文件、各層目錄下的Kconfig文件

3.Linux內(nèi)核根目錄下的makefile文件、各層目錄下的makefile文件

4.Linux內(nèi)核根目錄下的的.config文件、arch/$ARCH/configs/下的文件

5.Linux內(nèi)核根目錄下的 include/generated/autoconf.h文件
1)scripts文件夾存放的是跟make menuconfig配置界面的圖形繪制相關(guān)的文件,我們作為使用者無(wú)需關(guān)心這個(gè)文件夾的內(nèi)容

2)當(dāng)我們執(zhí)行make menuconfig命令出現(xiàn)上述藍(lán)色配置界面以前,系統(tǒng)幫我們做了以下工作:
首先系統(tǒng)會(huì)讀取arch/$ARCH/目錄下的Kconfig文件生成整個(gè)配置界面選項(xiàng)(Kconfig是整個(gè)linux配置機(jī)制的核心),那么ARCH環(huán)境變量的值等于多少呢?它是由linux內(nèi)核根目錄下的makefile文件決定的,在makefile下有此環(huán)境變量的定義:

SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
                  -e s/arm.*/arm/ -e s/sa110/arm/ \
                  -e s/s390x/s390/ -e s/parisc64/parisc/ \
                  -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
                  -e s/sh[234].*/sh/ )
      ..........
      export KBUILD_BUILDHOST := $(SUBARCH)
      ARCH        ?= $(SUBARCH)
      CROSS_COMPILE   ?=

或者通過(guò) make ARCH=arm menuconfig命令來(lái)生成配置界面比如教務(wù)處進(jìn)行考試,考試科數(shù)可能有外語(yǔ)、語(yǔ)文、數(shù)學(xué)等科,這里我們選擇了arm科可進(jìn)行考試,系統(tǒng)就會(huì)讀取arm/arm/kconfig文件生成配置選項(xiàng)(選擇了arm科的卷子),系統(tǒng)還提供了x86科、milps科等10幾門(mén)功課的考試題

3)假設(shè)教務(wù)處比較“仁慈”,為了怕某些同學(xué)做錯(cuò)試題,還給我們準(zhǔn)備了一份參考答案(默認(rèn)配置選項(xiàng)),存放在arch/$ARCH/configs/目錄下,對(duì)于arm科來(lái)說(shuō)就是arch/arm/configs文件夾:

此文件夾中有許多選項(xiàng),系統(tǒng)會(huì)讀取哪個(gè)呢??jī)?nèi)核默認(rèn)會(huì)讀取linux內(nèi)核根目錄下.config文件作為內(nèi)核的默認(rèn)選項(xiàng)(試題的參考答案),我們一般會(huì)根據(jù)開(kāi)發(fā)板的類(lèi)型從中選取一個(gè)與我們開(kāi)發(fā)板最接近的系列到Linux內(nèi)核根目錄下(選擇一個(gè)最接近的參考答案)

4).config
假設(shè)教務(wù)處留了一個(gè)心眼,他提供的參考答案并不完全正確(.config文件與我們的板子并不是完全匹配),這時(shí)我們可以選擇直接修改.config文件然后執(zhí)行make menuconfig命令讀取新的選項(xiàng)。但是一般我們不采取這個(gè)方案,我們選擇在配置界面中通過(guò)空格、esc、回車(chē)選擇某些選項(xiàng)選中或者不選中,最后保存退出的時(shí)候,Linux內(nèi)核會(huì)把新的選項(xiàng)(正確的參考答案)更新到.config中,此時(shí)我們可以把.config重命名為其它文件保存起來(lái)(當(dāng)你執(zhí)行make distclean時(shí)系統(tǒng)會(huì)把.config文件刪除),以后我們?cè)倥渲脙?nèi)核時(shí)就不需要再去arch/arm/configs下考取相應(yīng)的文件了,省去了重新配置的麻煩,直接將保存的.config文件復(fù)制為.config即可.

5)經(jīng)過(guò)以上兩步,我們可以正確的讀取、配置我們需要的界面了,那么他們?nèi)绾胃鷐akefile文件建立編譯關(guān)系呢?當(dāng)你保存make menuconfig選項(xiàng)時(shí),系統(tǒng)會(huì)除了會(huì)自動(dòng)更新.config外,還會(huì)將所有的選項(xiàng)以宏的形式保存在Linux內(nèi)核根目錄下的 include/generated/autoconf.h文件下

內(nèi)核中的源代碼就都會(huì)包含以上.h文件,跟宏的定義情況進(jìn)行條件編譯。當(dāng)我們需要對(duì)一個(gè)文件整體選擇如是否編譯時(shí),還需要修改對(duì)應(yīng)的makefile文件,例如:

我們選擇是否要編譯s3c2410_ts.c這個(gè)文件時(shí),makefile會(huì)根據(jù)CONFIG_TOUCHSCREEN_S3C2410來(lái)決定是編譯此文件,此宏是在Kconfig文件中定義,當(dāng)我們配置完成后,會(huì)出現(xiàn)在.config及autconf中,至此,我們就完成了整個(gè)linux內(nèi)核的編譯過(guò)程。最后我們會(huì)發(fā)現(xiàn),整個(gè)linux內(nèi)核配置過(guò)程中,留給用戶(hù)的接口其實(shí)只有各層Kconfig、makefile文件以及對(duì)應(yīng)的源文件。

比如我們?nèi)绻胍o內(nèi)核增加一個(gè)功能,并且通過(guò)make menuconfig控制其聲稱(chēng)過(guò)程首先需要做的工作是:修改對(duì)應(yīng)目錄下的Kconfig文件,按照Kconfig語(yǔ)法增加對(duì)應(yīng)的選項(xiàng);其次執(zhí)行make menuconfig選擇編譯進(jìn)內(nèi)核或者不編譯進(jìn)內(nèi)核,或者編譯為模塊,.config文件和autoconf.h文件會(huì)自動(dòng)生成;最后修改對(duì)應(yīng)目錄下的makefile文件完成編譯選項(xiàng)的添加;最后的最后執(zhí)行make命令進(jìn)行編譯。

Kconfig和Makefile

Linux內(nèi)核源碼樹(shù)的每個(gè)目錄下都有兩個(gè)文檔Kconfig和Makefile。分布到各目錄的Kconfig構(gòu)成了一個(gè)分布式的內(nèi)核配置數(shù)據(jù)庫(kù),每個(gè)Kconfig分別描述了所屬目錄源文檔相關(guān)的內(nèi)核配置菜單。在執(zhí)行內(nèi)核配置make menuconfig時(shí),從Kconfig中讀出菜單,用戶(hù)選擇后保存到.config的內(nèi)核配置文檔中。在內(nèi)核編譯時(shí),主Makefile調(diào)用這 個(gè).config,就知道了用戶(hù)的選擇。這個(gè)內(nèi)容說(shuō)明Kconfig就是對(duì)應(yīng)著內(nèi)核的每級(jí)配置菜單。

假如要想添加新的驅(qū)動(dòng)到內(nèi)核的源碼中,要修改Kconfig,這樣就能夠選擇這個(gè)驅(qū)動(dòng),假如想使這個(gè)驅(qū)動(dòng)被編譯,則要修改Makefile。添加新 的驅(qū)動(dòng)時(shí)需要修改的文檔有兩種(如果添加的只是文件,則只需修改當(dāng)前層Kconfig和Makefile文件;如果添加的是目錄,則需修改當(dāng)前層和目錄下 的共一對(duì)Kconfig和Makefile)Kconfig和Makefile。要想知道怎么修改這兩種文檔,就要知道兩種文檔的語(yǔ)法結(jié)構(gòu),Kconfig的語(yǔ)法參見(jiàn)參考文獻(xiàn)《【linux-2.6.31】kbuild》。
Makefile 文件包含 5 部分:

    Makefile                      頂層的 Makefile
    .config                       內(nèi)核配置文件
    arch/$(ARCH)/Makefile         體系結(jié)構(gòu) Makefile
    scripts/Makefile.*            適用于所有 kbuild Makefile 的通用規(guī)則等
    kbuild Makefiles              大約有 500 個(gè)這樣的文件

頂層 Makefile 讀取內(nèi)核配置操作產(chǎn)生的.config 文件,頂層 Makefile 構(gòu)建兩個(gè)主要的目標(biāo):vmlinux(內(nèi)核映像)和 modules(所有模塊文件)。它通過(guò)遞歸訪(fǎng)問(wèn)內(nèi)核源碼樹(shù)下的子目錄來(lái)構(gòu)建這些目標(biāo)。訪(fǎng)問(wèn)哪些子目錄取決于內(nèi)核配置。頂層 Makefile 包含一個(gè)體系結(jié)構(gòu) Makefile,由 arch/$(ARCH)/Makefile 指定。體系結(jié)構(gòu) Makefile 文件為頂層 Makefile 提供了特定體系結(jié)構(gòu)的信息。每個(gè)子目錄各有一個(gè) kbuild文件和Makefile 文件來(lái)執(zhí)行從上層傳遞下來(lái)的命令。kbuild和Makefile文件利用.config 文件中的信息來(lái)構(gòu)造由 kbuild 構(gòu)建內(nèi)建或者模塊對(duì)象使用的各種文件列表。scripts/Makefile.*包含所有的定義/規(guī)則,等等。這些信息用于使用 kbuild和 Makefile 文件來(lái)構(gòu)建內(nèi)核。


本文標(biāo)題:詳解Linux內(nèi)核的編譯和安裝
網(wǎng)頁(yè)網(wǎng)址:http://www.dlmjj.cn/article/dpsicoc.html