1、獲得Linux內(nèi)核源碼
獲得內(nèi)核源碼,將其拷貝到工作目錄,并解壓。
2、修改Makefile文件
為了交叉編譯內(nèi)核,需要修改內(nèi)核的底層Makefile:

找到下面的兩行(192行左右):
修改為:
上面這樣修改的意思是說我們的目標(biāo)平臺(tái)是arm,使用的交叉編譯器的前綴是
arm-linux-.
1、得到.config文件
編譯內(nèi)核時(shí)會(huì)依賴于源代碼目錄下的.config 文件。如果沒有這個(gè)文件,在make
menuconfig的時(shí)候,會(huì)默認(rèn)按照i386的配置生成.config文件,而這不是我們需要的。因
此我們要有自己的.config文件。
由于我們的配置和SMDK2410開發(fā)板的類似,因此可以使用它的.config文件,只需要
把它的.config文件拷貝到源代碼根目錄下的.config文件即可:
找到struct mtd_partitionsmdk_default_nand_part[]這個(gè)結(jié)構(gòu)體,并修改它。
改前的代碼:
static struct mtd_partition smdk_default_nand_part[] ={
[0] = {
.name = "BootAgent",
.size = SZ_16K,
.offset = 0,
},
[1] = {
.name = "S3C2410 flashpartition 1",
.offset= 0,
.size = SZ_2M,
},
[2] = {
.name = "S3C2410 flashpartition 2",
.offset = SZ_4M,
.size = SZ_4M,
},
[3] = {
.name = "S3C2410 flashpartition 3",
.offset = SZ_8M,
.size = SZ_2M,
},
[4] = {
.name = "S3C2410 flashpartition 4",
.offset = SZ_1M * 10,
.size = SZ_4M,
},
[5] = {
.name = "S3C2410 flashpartition 5",
.offset = SZ_1M * 14,
.size = SZ_1M *10,
},
[6] = {
.name = "S3C2410 flashpartition 6",
.offset = SZ_1M * 24,
.size = SZ_1M *24,
},
[7] = {
.name = "S3C2410 flashpartition 7",
.offset = SZ_1M * 48,
.size = SZ_16M,
}
};
修改后的結(jié)構(gòu)體如下面的代碼所示:
static struct mtd_partition smdk_default_nand_part[] ={
[0] = {
.name = "Bootloader",
.size = 0x80000,
.offset = 0,
},
[1] = {
.name = "Linux Kernel",
.offset = 0x80000,
.size = SZ_2M,
},
[2] = {
.name = "Root File System",
.offset = 0x280000,
.size = SZ_4M,
},
[3] =【】 {
.name = "User Space",
.offset = 0x680000,
.size = 0x3980000,
},
};
這樣就把我們的64M的NANDFlash分為四個(gè)區(qū):
第一個(gè)區(qū)從0x00000000到0x00080000,大小為0.5M
第二個(gè)區(qū)從0x00080000到0x00280000,大小為2M
第三個(gè)區(qū)從0x00280000到0x00680000,大小為4M
第四個(gè)區(qū)從0x00680000到0x04000000,大小為57.5M
5、添加網(wǎng)卡驅(qū)動(dòng)支持
開發(fā)板上配置了DM9000A網(wǎng)卡,內(nèi)核已經(jīng)有網(wǎng)卡驅(qū)動(dòng)的實(shí)現(xiàn)代碼,需要我們做一定的
配置。在arch/arm/mach-s3c2410/mach-smdk2410.c文件中添加如下內(nèi)容:
static struct resources3c_dm9ks_resource[] = {
[0] = {
.start = 0x10000000,
.end = 0x10000040,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_EINT2,
.end = IRQ_EINT2,
.flags = IORESOURCE_IRQ,
},
};
struct platform_devices3c_device_dm9ks = {
.name = "s3c2410-dm9ks",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_dm9ks_resource),
.resource = s3c_dm9ks_resource,
};
然后,把網(wǎng)卡數(shù)據(jù)加入smdk2410_devices數(shù)組:
static structplatform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
&s3c_device_dm9ks,
};
6、添加YAFFS文件系統(tǒng)支持
將我們提供的YAFFS的源代碼yaffs2.tar.gz拷貝到linux-2.6.24.4的同級(jí)目
錄下,解壓該源碼包,獲得YAFFS源碼:
然后進(jìn)入yaffs2目錄,運(yùn)行./patch-ker.sh給內(nèi)核打上補(bǔ)丁:
這樣打好補(bǔ)丁以后,再做正確的配置,內(nèi)核就可以支持YAFFS文件系統(tǒng)了。
7、配置和編譯內(nèi)核
到現(xiàn)在,一個(gè)簡(jiǎn)單的內(nèi)核就準(zhǔn)備好了,我們還需要做一些配置,然后編譯,內(nèi)核才能
正常使用。
在內(nèi)核源代碼的根目錄下運(yùn)行 make menuconfig命令,進(jìn)入配置界面:
01、選擇硬件系統(tǒng)
做如下選擇:
System Type --->
S3C2410 Machines --->
[*] SMDK2410/A9M2410
[ ] IPAQ H1940
[ ] Acer N30
[ ] Simtec Electronics BAST (EB2410ITX)
[ ] NexVision OTOM Board
[ ] AML M5900 Series
[ ] Thorcom VR1000
[ ] QT2410
其他的:
S3C2400 Machines --->
S3C2412 Machines --->
S3C2440 Machines --->
S3C2442 Machines --->
S3C2443 Machines --->
上面的四個(gè)選項(xiàng)下的所有選項(xiàng)都不要選,以減小內(nèi)核體積。
02、配置NAND Flash驅(qū)動(dòng)
做如下選擇:
Device Drivers --->
<*> MemoryTechnology Device (MTD) support --->
<*> NAND DeviceSupport --->
<*> NAND Flashsupport forS3C2410/S3C2440 SoC
03、配置文件系統(tǒng)
做如下配置,以支持CRAMFS文件系統(tǒng)和YAFFS文件系統(tǒng),為了調(diào)試方便,也
選上NFS文件系統(tǒng)的支持:
File systems--->
Miscellaneous filesystems--->
<*> YAFFS2 filesystem support
-*- 512 byte / page devices
[ ] Use older-style on-NAND data format withpageStatus byte
[ ] Lets Yaffs do its own ECC
-*- 2048 byte (or larger) / pagedevices
[*] Autoselect yaffs2 format
[ ] Disable lazy loading
[ ] Turn off wide tnodes
[ ] Force chunk erase check
[*] Cache short names in RAM
< > JournallingFlash File System v2 (JFFS2) support
<*> Compressed ROMfile system support (cramfs)
[*] Network File Systems--->
--- NetworkFile Systems
<*> NFS file systemsupport
[*] Provide NFSv3 client support
[*] Provideclient support for the NFSv3 ACL protocol
extension
[ ] ProvideNFSv4 client support (EXPERIMENTAL)
[*] Allowdirect I/O on NFS files
< > NFS serversupport
[*] Root filesystem on NFS
這樣,內(nèi)核的配置基本上就做好了。如果有興趣,可以自己查看內(nèi)核的其他配
置,并決定是否選擇某項(xiàng)功能,以適合自己的開發(fā)板。
在內(nèi)核源文件的根目錄下運(yùn)行make命令編譯內(nèi)核,編譯完成后,會(huì)在內(nèi)核linux-2.6.24.4/arch/arm/boot目錄下生成zImage文件。這個(gè)文件就是內(nèi)核的鏡像文件。經(jīng)過處理,可以啟動(dòng)。
8、用U-Boot啟動(dòng)內(nèi)核
編譯U-Boot時(shí)在源代碼的tools目錄下會(huì)生成一個(gè)mkimage可執(zhí)行文件,用這個(gè)工具
可以對(duì)前面編譯內(nèi)核時(shí)生成的zImage進(jìn)行處理,以供U-Boot啟動(dòng)。
cdlinux-2.6.24.4/arch/arm/boot
cp/up-Star2410/kernel/linux-2.6.24.4/mkimage .獲取mkimage工具
./mkimage -A arm -T kernel-C none -O linux -a 0x30008000 -e 0x30008040 -d
zImage -n 'Linux-2.6.24'uImage
l-Aarm指定CPU的體系結(jié)構(gòu),目標(biāo)平臺(tái)是ARM構(gòu)架的
l-T kernel 要處理的是內(nèi)核
l-Cnone 不采用任何壓縮方式-O linux要處理的Linux內(nèi)核
l-a0x30008000加載地址,包括mkimage工具給內(nèi)核添加的頭信息
l-e0x30008040真正的內(nèi)核入口地址,除掉mkimage添加的0x40長(zhǎng)度的頭信息
l-dzImage使用的源文件是編譯Linux內(nèi)核得到的zImage
l-n ‘linux-2.6.24’ 生成的內(nèi)核鏡像的名字
luImage生成的供U-Boot啟動(dòng)的二進(jìn)制內(nèi)核鏡像
這樣會(huì)在這個(gè)目錄下生成uImage,把uImage放入主機(jī)的TFTP目錄下,啟動(dòng)開發(fā)板,
用U-Boot的tftp命令下載uImage到SDRAM,并啟動(dòng)。
愛華網(wǎng)

