##################################
#内核下载地址:https://www.kernel.org/pub/linux/kernel/
#参考板子:smdk2440 mini2440 #
#参考cpu:s3c2440 #
#自己使用的板子:fl2440 #
##################################
首先我们需要知道内核的基本作用:**************************************************************************************************************
ps:内核上本身不包含文件系统和应用程序,而且内存的初始化工作是uboot来执行的并不是kernel。
Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 29
EXTRAVERSION = .1
其中的“VERSION”和“PATCHLEVEL”组成主版本号,比如2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核), 开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布 一个稳定版本。“EXTRAVERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。
这个是我内核的版本号
在这里我们就有必要知道一下:
****************************************************************************************************************************************************************************************
Makefile:一个文本形式的文件,其中包含一些规则告诉make编译哪些文件以及怎样编译这些文件。
Kconfig:一个文本形式的文件,其中主要作用是在内核配置时候,作为配置选项。(make menuconfig里面的配置就在Kconfig里面)
.config:文件是在进行内核配置的时候,经过配置后生成的内核编译参考文件。(make menuconfig后就会生成这些.config文件<这些是隐藏文件,如果想查找可以用 find ".config" 命令>)
make menuconfig 图形化的内核配置
*****************************************************************************************************************************************************************************************
这里修改的原因是:指明体系结构为arm,采用的交叉编译器为arm-linux-,这一步一定要改完再执行make menuconfig,否则,用的是x86的make,打开的配置单不是arm的。
(下面为了是需要自己加上去的代码,所以我就不载图了,方便复制代码)
559 all:vmlinux(目标)
560 cp arch/arm/boot/zImage . -f (拷贝zImage文件到当前目录)
561 /home/lzj/linux-3.0.1/mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n "Linux Kernel" -d zImage linuxrom-s3c2440.bin(将zImage制作成启动映像文件,即:linuxrom-s3c2440.bin)
562 rm -f zImage
***********************************************************************************************************************************
zImage
Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。zImage是Image经过压缩 形成的,所以它的大小比 Image小。但为了能使用zImage,必须在它的开头加上解压缩的代码,将 zImage解压缩之后才能执行,因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用zImage可以占用较少的存储空 间,因此牺牲一点性能上的代价也是值得的,所以一般的嵌入式系统均采用压缩内核的方式。
编译完成后,会在内核目录arch/arm/boot/下生成zImage内核映像文件。
**********************************************************************************************************************************************************
**********************************************************************************************************************************************************
mkimage
uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。
mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么(这里我mkimage我就直接放到内核的根目录下面所以路径就是如上图所示,如果你mkimage没放到内核的根目录下,那么就要在使用的时候加上路径)
**********************************************************************************************************************************************************
然后对distclean加一句命令:
1207 @rm -f linuxrom-*.bin (加上@后屏幕不会打印出来这条语句)
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "mtdblock0 u-boot 1MB",
.size = SZ_1M*1,
.offset = 0,
},
[1] = {
.name = "mtdblock1 kernel 4MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*4,
},
[2] = {
.name = "mtdblock2 ramdisk 10MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*10,
},
[3] = {
.name = "mtdblock3 cramfs 15MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*15,
},
[4] = {
.name = "mtdblock3 jffs2 40MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*40,
},
[5] = {
.name = "mtdblock4 yaffs2 40MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*40,
},
[6] = {
.name = "mtdblock5 ubifs 40MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*40,
},
[7] = {
.name = "mtdblock6 info 1MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*1,
},
[8] = {
.name = "mtdblock7 apps 40MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*40,
},
[9] = {
.name = "mtdblock8 data 40MB",
.offset = MTDPART_OFS_NXTBLK,
.size = SZ_1M*40,
},
[10] = {
.name = "mtdblock9 backup 25MB",
.offset = MTDPART_OFS_NXTBLK,
.size = MTDPART_SIZ_FULL,
}
};