基于smdk2440 linux-3.0内核移植

 ##################################

 #内核下载地址:https://www.kernel.org/pub/linux/kernel/

 #参考板子:smdk2440   mini2440              #

 #参考cpu:s3c2440                                       #

#自己使用的板子:fl2440                              # 

##################################

首先我们需要知道内核的基本作用:
(linux )内核是(linux)操作系统的核心,一般包含五大部分:进程管理存储管理文件管理设备管理网络管理,是一组程序模块,具有访问硬件设备和所有主存空间的权限,是仅有的能够执行特权指令的程序。主要功能是:资源抽象资源分配资源共享。(资源是指CPU、内存等。)在内核基础上挂载第三方软件便构成操作系统,Ubuntu、RedHat、Fedora、Debian等都是基于Linux内核(版本号可能不同)的不同操作系统

**************************************************************************************************************

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 图形化的内核配置

*****************************************************************************************************************************************************************************************


1.配置顶层的Makefile


这里修改的原因是:指明体系结构为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 (加上@后屏幕不会打印出来这条语句)

2.修改晶振频率


[liuzijiang@centos6 linux-3.0]$vim arch/arm/mach-s3c2440/mach-smdk2440.c 



3.对串口进行修改

[liuzijiang@centos6 linux-3.0]$vim drivers/tty/serial/samsung.c 


改这个名字是因为三星板子的串口命名叫ttySAC而我们习惯上命名为ttyS0,ttyS1....所以为了以后夸平台我们方便认出来,最好改一下这个名字.

(ttyS是linux系统里面的串口名字,ttyS1,ttyS2就相当与windows里面的com1,com2.)

4.修改机器ID

[liuzijiang@centos6 linux-3.0]$vim arch/arm/tools/mach-types 




原因:在内核文件arch/arm/mach-s3c2440/mach-smdk2440.c中的 MACHINE_START(S3C2440,”SMDK2440”)中要使用该机器码,同时它还应该与uboot中的机器码一致,uboot中我们使用的是mini2440的机器码,所以这里我们要将mini2440和s3c2440的机器码换一下,我们需要启动的是smdk2440        
大家可以参考这个博客,如果上面那些没有改的话很有可能没和会卡在下面这句话,不会让下继续。
Uncompressing Linux... done, booting the kernel      http://www.aichengxu.com/view/34791

5.添加nand flash分区

vim linux-3.0-s3c2440/arch/arm/plat-s3c24xx/common-smdk.c

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,

        }

};



6.进行make menuconfig操作

用mini2440的Kconfig配置来进行内核的配置(因为2者相差不大)

[liuzijiang@centos6 linux-3.0]$cp arch/arm/configs/mini2440_defconfig .config

[liuzijiang@centos6 linux-3.0]$make menuconfig
ps:如果里面有数字不能修改或者路径无法用键盘修改的话则用下面的命令进行操作
[liuzijiang@centos6 linux-3.0]$export TERM=vt100
先设置一下这个环境变量然后再make menuconfig









6.Make编译






另外:

当我们生成内核文件后,如果还想对内核进行修改的话,我们只需要修改文件后再make一下即可,不用再配置menucnfig


当你make menuconfig时可能会遇到这个错误:


是因为你选择的字体大小过大,整个屏幕不能显示这个图形化界面,所以我们只需要改一下字体大小即可



你可能感兴趣的:(基于smdk2440 linux-3.0内核移植)