Linux内核3.0移植并基于Initramfs根文件系统启动
Linux內(nèi)核移植與啟動(dòng)
?
Target?borad:FL2440
?
Bootloader:U-boot-2010.09
交叉編譯器:buildroot-2012.08
?
?
1.linux內(nèi)核基礎(chǔ)知識(shí)
首先,磨刀不誤砍柴工。在動(dòng)手進(jìn)行l(wèi)inux內(nèi)核移植之前,我們有必要對(duì)linux內(nèi)核進(jìn)行一定的了解。
1.1?Linux內(nèi)核啟動(dòng)過程概述
一個(gè)嵌入式Linux系統(tǒng)從軟件角度看可以分為四個(gè)部分:?
引導(dǎo)加載程序(Bootloader),Linux內(nèi)核,文件系統(tǒng),應(yīng)用程序。
?
其中Bootloader是系統(tǒng)啟動(dòng)或復(fù)位以后執(zhí)行的第一段代碼,它主要用來初始化處理器及外設(shè),然后調(diào)用Linux內(nèi)核,linux內(nèi)核在完成系統(tǒng)的初始化之后需要掛載某個(gè)文件系統(tǒng)作為根文件系統(tǒng)(rootfs),根文件系統(tǒng)是linux系統(tǒng)的核心組成部分,也是內(nèi)核啟動(dòng)時(shí)首先要掛載的就是根文件系統(tǒng)。它可以作為linux系統(tǒng)中文件和數(shù)據(jù)的存儲(chǔ)區(qū)域,通常它還包括系統(tǒng)配置文件和運(yùn)行應(yīng)用程序需要的庫,保證了人和內(nèi)核的信息交互。應(yīng)用程序則是嵌入式系統(tǒng)所要達(dá)到的目標(biāo),一切的準(zhǔn)備都是為了實(shí)現(xiàn)程序。若是沒有應(yīng)用程序,硬件上再精良嵌入式系統(tǒng)都沒有實(shí)用意義。
?Bootloader:在嵌入式操作系統(tǒng)中,BootLoader是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行。可以初始化硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。Bootloader在它完成CPU和相關(guān)硬件的初始化之后,再將操作系統(tǒng)映像或固化的嵌入式應(yīng)用程序裝在到內(nèi)存中然后跳轉(zhuǎn)到操作系統(tǒng)所在的空間,啟動(dòng)操作系統(tǒng)運(yùn)行。它最根本的功能就是為了啟動(dòng)linux內(nèi)核.?為了啟動(dòng)內(nèi)核Bootloader要依次完成
初始化RAM—初始化串口—檢測(cè)處理器類型—設(shè)置Linux啟動(dòng)參數(shù)(bootargs)—調(diào)用Linux內(nèi)核鏡像。
?
文件系統(tǒng):Linux文件系統(tǒng)中的文件是數(shù)據(jù)的集合,文件系統(tǒng)不僅包含著文件中的數(shù)據(jù)而且還有文件系統(tǒng)的結(jié)構(gòu),所有Linux?用戶和程序看到的文件、目錄、軟連接及文件保護(hù)信息等都存儲(chǔ)在其中。
1.2?編譯環(huán)境交叉編譯器的制作
交叉編譯器本節(jié)不過多介紹。但我們必須知道若要實(shí)現(xiàn)人,虛擬機(jī),開發(fā)板之間的信息傳遞就必須首先制作交叉編譯器來幫助我們編譯。在做好交叉編譯器準(zhǔn)備好編譯環(huán)境之后我們就可以開始進(jìn)行純內(nèi)核移植了。(在此使用的交叉編譯器為buildroot-2012.08)
2.Linux內(nèi)核移植與啟動(dòng)
?
2.1下載并解壓縮linux-3.0.tar.bz2?源代碼
首先到?Linux?Kernel?官方網(wǎng)站www.kernel.org下載得到?linux-3.0-rc4.tar.bz2?文件,把它放到一個(gè)你有權(quán)限讀寫的文件夾,運(yùn)行下面命令解壓縮并進(jìn)入解壓后的文件夾:
$?tar?-xjf?linux-3.0.tar.bz2
$?cd?linux-3.0
?
?
2.2配置內(nèi)核編譯參數(shù)
?
1.?首先修改頂層目錄的Makefile文件
?$?vim??Makefile?
這里首要便是交叉編譯器環(huán)境變量和選擇開發(fā)平臺(tái)類型
然后要將生成的zimage拷貝到當(dāng)前目錄,再手動(dòng)增加mkimage工具來自動(dòng)把Zimage生成可執(zhí)行的.bin文。
注:內(nèi)核編譯之后會(huì)生成兩個(gè)文件。一個(gè)Image,一個(gè)Zimage。image為內(nèi)核映像文件,而Zimage為內(nèi)核映像壓縮文件。Image大約為4M,而Zimage不到2M。
===============================================================================?
@@?-192,8?+192,8?@@
?#?Default?value?for?CROSS_COMPILE?is?not?to?prefix?executables
?#?Note:?Some?architectures?assign?CROSS_COMPILE?in?their?arch/*/Makefile
?export?KBUILD_BUILDHOST?:=?$(SUBARCH)
-?ARCH????????=?$(SUBARCH)
-?CROSS_COMPILE???=?$(CONFIG_CROSS_COMPILE:"%"=%)
+ARCH????????=?arm
+CROSS_COMPILE?=?/opt/buildroot-2012.08.packet/buildroot-2012.08/arm920t/usr/bin/arm-linux-
?
?#?Architecture?as?present?in?compile.h
?UTS_MACHINE????:=?$(ARCH)
@@?-557,6?+557,9?@@
?#?This?allow?a?user?to?issue?only?'make'?to?build?a?kernel?including?modules
?#?Defaults?to?vmlinux,?but?the?arch?makefile?usually?adds?further?targets
?all:?vmlinux
+??cp?arch/arm/boot/zImage?.?-f
+?mkimage?-A?arm?-O?linux?-T?kernel?-C?none?-a?30008040?-n?"Linux?Kernel"?-d?zImage?\?linuxrom-s3c2440.bin
+???rm?-f?zImage
?
?
ifdef?CONFIG_CC_OPTIMIZE_FOR_SIZE
?KBUILD_CFLAGS??+=?-Os
@@?-1201,6?+1204,7?@@
????????-o?-name?'.*.rej'?-o?-size?0?\
????????-o?-name?'*%'?-o?-name?'.*.cmd'?-o?-name?'core'?\)?\
????????-type?f?-print?|?xargs?rm?-f
+???????@rm?-f?linuxrom-s3c2440.bin
?
2.修改晶振頻率
?
因?yàn)槲沂褂玫氖荈L2440的開發(fā)板,根據(jù)datesheet可知晶振頻率為12M。所以下一步修改晶振頻率。
$?vim?arch/arm/mach-s3c2440/mach-smdk2440.c
?
============================================================================?
@@?-160,7?+160,7?@@
?static?void?__init?smdk2440_map_io(void)
?{
????s3c24xx_init_io(smdk2440_iodesc,?ARRAY_SIZE(smdk2440_iodesc));
--???s3c24xx_init_clocks(16934400);
+???s3c24xx_init_clocks(12000000);
????s3c24xx_init_uarts(smdk2440_uartcfgs,?ARRAY_SIZE(smdk2440_uartcfgs));
?}
3.?修改驅(qū)動(dòng)的串口
?vim?drivers/tty/serial/samsung.c
===========================================================================
@@?-54,7?+54,7?@@
?
?/*?UART?name?and?device?definitions?*/
?
--?#define?S3C24XX_SERIAL_NAME????"ttySAC"
+?#define?S3C24XX_SERIAL_NAME????"ttyS"
??#define?S3C24XX_SERIAL_MAJOR???204
??#define?S3C24XX_SERIAL_MINOR???64
?
?
?
參考mini2440的.config文件作為我們的默認(rèn).config文件。改好之后再
?
?
?
?
$?Make?menuconfig
?
?
?
?
打開文本窗口來選定即將要編譯的模塊,保存后會(huì)將里面的信息保存到同時(shí)生成的.config配置文件中。
另外:make?menuconfig時(shí)出來的文本窗口中的信息是通過讀取在內(nèi)核源代碼目錄下的Kconfig文件來配置的。根據(jù)Makefile文件來編譯,而Makefile文件中的變量則通過.config來進(jìn)行賦值操作。僅僅在Kconfig中添加選項(xiàng)。
?
4.修改MACHINE?ID設(shè)備編號(hào)
同樣因?yàn)槭亲鯢L2440的內(nèi)核,所以我們選擇三星SMDK2440這個(gè)開發(fā)板。因?yàn)槲襏-boot中使用的machine?id為1999,而且我使用的是s3c2440這個(gè)板子。
將mini2440和和s3c2440的machineID對(duì)調(diào)。
?$?vim?arch/arm/tools/mach-types
配置就緒之后
?
Make
?
顯示成功
此時(shí)已經(jīng)會(huì)生成一個(gè)linux-s3c2440.bin的可執(zhí)行二進(jìn)制文件。
5.對(duì)nandflash進(jìn)行分區(qū)
?
=========================================================================================================
@@?-106,49?+106,39?@@
????},
?};
?
-/*?NAND?parititon?from?2.4.18-swl5?*/
+/*?NAND?parititon?from?2.4.18-swl5,modify?by?Handy?2014.11.30?*/
?
?static?struct?mtd_partition?smdk_default_nand_part[]?=?{
????[0]?=?{
-???????.name???=?"Boot?Agent",
-???????.size???=?SZ_16K,
+???????.name???=?"bootloader",
+???????.size???=?SZ_1M,
????????.offset?=?0,
????},
????[1]?=?{
-???????.name???=?"S3C2410?flash?partition?1",
-???????.offset?=?0,
-???????.size???=?SZ_2M,
+???????.name???=?"linux",
+???????.offset?=?MTDPART_OFS_NXTBLK,
+???????.size???=?SZ_1M*15,
????},
????[2]?=?{
-???????.name???=?"S3C2410?flash?partition?2",
-???????.offset?=?SZ_4M,
-???????.size???=?SZ_4M,
+???????.name???=?"rootfs",
+???????.offset?=?MTDPART_OFS_NXTBLK,
+???????.size???=?SZ_1M*40,
????},
????[3]?=?{
-???????.name???=?"S3C2410?flash?partition?3",
-???????.offset?=?SZ_8M,
-???????.size???=?SZ_2M,
+???????.name???=?"apps",
+???????.offset?=?MTDPART_OFS_NXTBLK,
+???????.size???=?SZ_1M*50,
????},
????[4]?=?{
-???????.name???=?"S3C2410?flash?partition?4",
-???????.offset?=?SZ_1M?*?10,
-???????.size???=?SZ_4M,
+???????.name???=?"data",
+???????.offset?=?MTDPART_OFS_NXTBLK,
+???????.size???=?SZ_1M*50,
????},
????[5]?=?{
-???????.name???=?"S3C2410?flash?partition?5",
-???????.offset?=?SZ_1M?*?14,
-???????.size???=?SZ_1M?*?10,
-???},
-???[6]?=?{
-???????.name???=?"S3C2410?flash?partition?6",
-???????.offset?=?SZ_1M?*?24,
-???????.size???=?SZ_1M?*?24,
-???},
-???[7]?=?{
-???????.name???=?"S3C2410?flash?partition?7",
-???????.offset?=?SZ_1M?*?48,
+???????.name???=?"backup",
+???????.offset?=?SZ_1M?*?100,
????????.size???=?MTDPART_SIZ_FULL,
-???}
+???},
?};
?
板子上nandflash是256M,給bootloader1M用來啟動(dòng),內(nèi)核15M以及40M的根文件系統(tǒng)。其他自由分配。
注意:此時(shí)若要再進(jìn)行分區(qū)就要選擇相應(yīng)的文件系統(tǒng)。Nandflash比較常用的有yaffs2,ubifs,cramfs以及initramfs等等。
?
$??make
此時(shí)能編譯成功,但是生成的linux-s3c2440.bin文件依舊不能在板子上跑起來。
因?yàn)閮?nèi)核啟動(dòng)時(shí)首先掛載的是根文件系統(tǒng),我們還沒有做根文件系統(tǒng)給予內(nèi)核支持,系統(tǒng)會(huì)出錯(cuò)而退出啟動(dòng)。
?
3.?添加根文件系統(tǒng)支持
1、根文件系統(tǒng)簡(jiǎn)介
文件系統(tǒng)是對(duì)一個(gè)存儲(chǔ)設(shè)備上的數(shù)據(jù)和元數(shù)據(jù)進(jìn)行組織的機(jī)制。這種機(jī)制有利于用戶和操作系統(tǒng)的交互。而根文件系統(tǒng)則是所有文件系統(tǒng)的根,我理解的是所有文件系統(tǒng)都是由根文件系統(tǒng)擴(kuò)展開來的。而若是沒有根文件系統(tǒng)則談不上其他的文件系統(tǒng)。根文件系統(tǒng)它包含系統(tǒng)引導(dǎo)以及其他文件系統(tǒng)所能掛載的必要文件。
?
什么是根文件系統(tǒng)?首先是一種文件系統(tǒng),但是相對(duì)于普通的文件系統(tǒng),它的特殊之處在于,它是內(nèi)核
啟動(dòng)時(shí)所mount的第一個(gè)文件系統(tǒng)。
?而Linux又支持多種文件系統(tǒng),包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,為了對(duì)各類文件系統(tǒng)?進(jìn)行統(tǒng)一管理,Linux引入了虛擬文件系統(tǒng)VFS(Virtual?File?System),為各類文件系統(tǒng)提供一個(gè)統(tǒng)一的操作界面和應(yīng)用編程接口。Linux啟動(dòng)時(shí),第一個(gè)必須掛載的是根文件系統(tǒng);若系統(tǒng)不能從指定設(shè)備上掛載根文件系統(tǒng),則系統(tǒng)會(huì)出錯(cuò)而退出啟動(dòng)。之后可以自動(dòng)或手動(dòng)掛載其他的文件系統(tǒng)。因此,一個(gè)系統(tǒng)中可以同時(shí)存在不同的文件系統(tǒng)。
不同的文件系統(tǒng)類型有不同的特點(diǎn),因而根據(jù)存儲(chǔ)設(shè)備的硬件特性、系統(tǒng)需求等有不同的應(yīng)用場(chǎng)合。在嵌入式Linux應(yīng)用中,主要的存儲(chǔ)設(shè)備為?RAM(DRAM,?SDRAM)和ROM(常采用FLASH存儲(chǔ)器),常用的基于存儲(chǔ)設(shè)備的文件系統(tǒng)類型包括:jffs2,?yaffs,?cramfs,?romfs,?ramdisk,?ramfs/tmpfs等。
?
2、根文件系統(tǒng)支持
本文主要寫內(nèi)核的移植與啟動(dòng),所以選擇了制作很簡(jiǎn)單的initramfs文件系統(tǒng)作為根文件系統(tǒng),它能伴隨內(nèi)核編譯時(shí)同時(shí)與內(nèi)核生成一個(gè)鏡像而能與之一起啟動(dòng)。
$?Make?menuconfig
進(jìn)去選擇General?setup編譯模塊
?
在下面選擇Initial?RAM?filesystem?.....即initramfs文件系統(tǒng),然后選擇支持initramfs的源文件系統(tǒng)包所處位置。這里為../../rootfs/rootfs_tree/
?
?
?
在選擇保存后即可連接開發(fā)板。重新編譯內(nèi)核后下載到板子上便可以啟動(dòng)了!
?
轉(zhuǎn)載于:https://www.cnblogs.com/Ph-one/p/4578814.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Linux内核3.0移植并基于Initramfs根文件系统启动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有一说一,张慧雯是你的理想型吗?
- 下一篇: TCP多进程并发服务端 Linux so