LINUX移植——内核移植(一)

时间:2021-01-09 12:22:26

 这两天在友善的tiny210的实验板上移植了linux内核,正好和大家分享,同时也算是做个记录吧!首先介绍一下开发环境吧,这个在做移植的时候还是挺重要的。

主机linux:Fedora9   安装在VMware虚拟机上;

开发板   :友善的tiny210,256M的FLASH;

移植linux:LINUX-3.3.5;

交叉编译环境:arm-linux-gcc-4.4.3 这个是友善2440里带的;

u-boot  :是网上找的,待会我给出源文件。

1.烧写启动文件

    要移植操作系统,肯定是需要启动代码了,也就是u-boot了。我自己没有移植u-boot,是从网上现找的。好吧,我上传一下,也方便大家下载。连接地址:http://download.csdn.net/detail/xie0812/6189627 是在windows下压缩的,里面包含两文件,分别为u-boot的源文件和直接用于下载用的.bin文件。u-boot有了,现在说说怎么把.bin文件烧写到sd上吧。首先把.bin文件拷贝到linux系统中,随便在一个文件夹下就行。下来就是往sd里烧写了,当然了sd是必须的嘛。这里给个插曲,把sd插到电脑后,windows下发现了,但虚拟里的linux系统发现不了,后来是通过这么解决的,点击VMware的VM----->Rmovables Devices------->USB Device------>Rmovable disk,当然这是在发现不了sd的情况下才这样滴,而且可能跟虚拟机和主机上的linux系统有关,环境不一样可能会不同。当发现了sd后,就进入你放tiny210v2--uboot.bin的文件夹。这时你通过cat /proc/partitions 命令查看你的sd卡对应的设备文件的名字,这里我的是sdb,可能会有不同。好吧,现在文件准备好了,sd也发现了,就差烧写了。通过sudo dd iflag=dsync oflag=dsync if=tiny210v2-uboot.bin of=/dev/sdb seek=1 ,这个命令把.bin烧写到sd中,这里注意命令中的/dev/sdb一定是你sd卡在linux系统中的名字。

2.下载linux源代码

 咱们去linux官网上下载吧,这个是连接:https://www.kernel.org/   在这里下载linux-3.3.5。

3.修改Makefile文件

 下载到源代码后,首先是解压,解压的命令是 tar xvzf linux-3.3.5.tar.gz 这样就完成了解压。现在修改一些设置,为编译做准备。首先,修改linux下的Makfile文件,进入解压后的linux-3.3.5,通过vi Makefile 命令打开修改文件。在文件的195行和196行处修改,没修改以前的代码为:

ARCH		?= $(SUBARCH)
CROSS_COMPILE	?= $(CONFIG_CROSS_COMPILE:"%"=%)
修改后的代码为:

ARCH		?= arm
CROSS_COMPILE	?= /opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-
第一行的修改大家肯定是明白的嘛,因为咱们需要移植到arm上,所以是arm嘛。第二行的是你的交叉编译器所处的位置,可能每个人的目录会不同,看具体的情况来吧。这里简单的插入一句题外话,通过vi Makefile时,通过命令set nu可以使Makefile文件显示行数。

4.编译内核

   把smdk210v板子的config文件拷过来了,进行内核编译。简单的说一下,咱们在这里的移植是属于板级的移植,一般来说移植操作系统分为:体系结构级的移植、soc级的移植和板级的移植。板级的移植是最简单的,往往是在芯片制作厂商提供的样板的基础上做移植。当然一般来说,这就够了。好吧,不扯了。在linux-3.3.5目录下,通过cp arch/arm/configs/s5pv210_defconfig .config 把对smdkv210板的配置文件拷贝到linux-3.3.5目录下,并且保存为.config文件。现在把配置文件拷贝过了,通过命令:make menuconfig 进入配置界面进行配置吧。进入后的界面为:LINUX移植——内核移植(一)

这就是刚进入的界面,这时选择General setup 进入另外一个界面:LINUX移植——内核移植(一)

在图中选择可以看到的Cross-compiler tool prefix(new),然后输入交叉编译器的路径,输入后的结果为:LINUX移植——内核移植(一)

注意输入最后的是arm-linux-gcc,接下来退到刚开始的界面下,选择System Types------->这个选项LINUX移植——内核移植(一)

看到图中高亮的部分了,选中这个选项,把1改成0,为什么要改了,因为开发板上是用UART0输出信息的,如果不修改,会在启动内核的时候,无法显示信息。也就是在 Start kenel....之后不显示信息的缘故。修改后的效果图为:

LINUX移植——内核移植(一)

接下来的工作是继续退到刚进入的界面,选择Boot options-------->选项,进入后的效果图为:LINUX移植——内核移植(一)

同样看到图中高亮的部分了吧,用Enter键选择它,把里面的console=ttySAC1改为console=ttySAC0,其他的不变,由于也看不到效果,就不贴图了,这样就完成了内核的基本配置,很简单吧,当然这只是一个内核的雏形,其他的都没配置,所以简单了。现在开始编译吧,你也等不急了吧。运行 make uImage 命令,开始内核的编译。可惜,出现了下面的错误,没事,慢慢解决嘛

  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
  UIMAGE  arch/arm/boot/uImage
"mkimage" command not found - U-Boot images will not be built
make[1]: *** [arch/arm/boot/uImage] Error 1
make: *** [uImage] Error 2
看上面的提示是说找不到mkimage,原因就不说了,这个问题是这样解决的。拷贝一个mkimage文件到相应的交叉编译器的相应的目录下,mkimage是bootloader里tools目录下的一个文件,我这里提供的这个文件也是友善2440带的,给大家一个链接吧: http://download.csdn.net/detail/xie0812/6191183因为我的交叉编译器的在/opt/FriendlyARM/toolschain/4.4.3,所以应该把它拷贝到 /opt/FriendlyARM/toolschain/4.4.3/bin目录下,同时把名字改为arm-linux-mkimage。对于这个问题,可能网上有许多解决的办法,我都试,但不行,最是这么解决的。如果你用这种办法不行的话,那就在网上在找找吧。看,这就顺利的编译完成了:

Image Name:   Linux-3.3.5
Created:      Sun Sep  1 11:14:07 2013
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    1181392 Bytes = 1153.70 kB = 1.13 MB
Load Address: 0x20008000
Entry Point:  0x20008000
  Image arch/arm/boot/uImage is ready
看到这个结果就证明已经编译通过了。不过现在只是内核编译通过,怎么样让它在tiny210上启动了,这个下一篇,咱们继续!