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

时间:2021-11-17 16:29:28

上一篇咱们简单的编译了linux-3.3.5的内核,这一篇咱们让它在tiny210上启动。这一篇主要的内容为:

1.在linux下建立tftp服务器;

2.在tiny210上启动编译好的内核。

一.建立tftp服务器

     咱们为什么要建立tftp服务器呢?是因为咱们需要把编译好的内核下载到tiny210的内存上,因为这是在调试阶段嘛,这样做能提供开发的效率,所以需要建立了。首先,通过rpm -qa grep tftp 查看是否安装了tftp服务器。我这里就不具体讲解安装过程了,这个网上很多。我在这提供一下几个安装包吧,因为自己安装的时候这几个包不是很容易找,链接为:http://download.csdn.net/detail/xie0812/6191445当安装完后,一定要自己测试一下,负责到时候在启动内核是无法下载编译好的内核,还有一点就是在用tftp服务器时,一定要把linux的防火墙通过/etc/init.d/iptables stop关掉,我在这就耗了几个小时,当load内核的时候就停止不前了。

二.启动编译好的内核

    首先,需要把编译好的内核拷贝到上面建立的tftp服务器的根目录tftpboot下面。这就有个问题了,咱们编译好的内核到底放在什么地方啊,哈哈,在linux-3.3.5源代码目录下的arch/arm/boot/下面。进入建立好的tftp服务器的tftpboot目录下,通过 cp /tmp/LINUX/linux-3.3.5/arch/arm/boot/uImage uImage拷贝到tftpboot下,当然这个路径得根据你自己的实际来设置。

   然后,把已经烧写了tiny210v2-uboot.bin的sd卡,插到tiny210实验板上,这个时候打开你电脑上的超级终端,正确的效果图如:

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

看到了吧,咱们烧写到sd的u-boot简单得输出了tiny210的硬件资源,这时你可以在光标闪烁的位置输入print进一步查看一些参数。这些参数中包括什么串口波特率,服务器的ip地址,本机的ip地址等等,可以根据实际的情况把你的主机上的ip地址修改一下,这时就ping一下,看能不能跟咱们的主机,也就是服务器连通,比如我电脑上通过:ping 192.168.186.30,如果ping不通,这是可以用ctrl+c中断,然后再ping,实在不行了,重启开发板也行,下边是ping通的效果:

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

看到倒数第二行了吧,host 192.168.186.30 is alive ,这表明已经跟咱们的主机连通。这时输入tftp uImage ,把tftp服务器当中的uImage文件拷贝到tiny210上,uImage就是我之前编译过得内核文件,当然uImage只是里面文件的名字,这个名字根据你放到里面的文件的不同可以不同,如果这个时候下载不了指定的文件,这时可以看看你主机上的防火墙是否关闭,正常的效果图如下:

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

你看现在仅仅传输了不多的一些字节,比较小,因为仅仅编译了内核,什么驱动基本上没有,随着咱们移植驱动的增加,你就会发现,越来越大了。现在传输完成了,这时,你输入bootm命令,要是正常的话,就可以启动内核了,但是出现了错误,先看看错误吧:

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

通过上面的提示可以知道,是说内核的机器码不能识别,对,这时就需要继续改内核当中的一些文件了。为什么不在最初的时候一次性改好了,我感觉这样更能有一个感性的认识,要不然改了一大堆,不知道什么意思。首先改的第一个地方是在linux-3.3.5源文件下面的arch/arm/tools目录下的mach-types的文件,没修改前的代码为:

smdkv210		MACH_SMDKV210		SMDKV210		2456
把这里的最后的数字改成3466,这是u-boot中的机器码,当然你也可以通过setenv machid 2456命令修改u-boot当中机器码为2456,u-boot和内核是通过机器码以及名字相匹配的,随后我们将修改名字。修改后的效果为:

smdkv210		MACH_SMDKV210		SMDKV210		3466
上面修改了机器码,现在修改机器的名字,现在再次进入linux-3.3.5源文件当中,通过gedit mach-smdkv210.c命令打开源文件的arch/arm/mach-s5pv210下的mach-smdkv210.c文件,修改的内容在文件的最后边,看看修改前的效果吧:

	samsung_bl_set(&smdkv210_bl_gpio_info, &smdkv210_bl_data);

	platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices));
}

MACHINE_START(SMDKV210, "SMDKV210")
	/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
	.atag_offset	= 0x100,
	.init_irq	= s5pv210_init_irq,
看到红色的那行代码了吧,里面包含两个SMDKV210,第一个是用于与u-boot作名字匹配的,后面一个是用于编译的,咱们只改第一个,把它改为MINI210,为什么改成这个名字,因为u-boot里面是这样定义的,感兴趣的可以查看我传上去的u-boot的源码。修改后的效果为:

	platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices));
}

MACHINE_START(MINI210, "SMDKV210")
	/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
	.atag_offset	= 0x100,
修改完之后,退出到linux-3.3.5源文件目录下,再次进行编译,这次不需要配置了,执行make uImage就行了,因为是在上次的基础上进行的编译,所以应该很快就会编译完成。编译完成后再次把uImage拷贝到咱们建立的tftp服务器的tftpboot根目录下。完成这些后,重启开发板,再次ping,再次下载文件,再次bootm,就可以看到期待已久的结果了。看看效果吧。

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

看到Start kernel...之后的第三行linux的版本号了吧,这个表明你已经移植完成了linux内核。当然这也还是只是完成了一小步,因为你看你的超级终端的最后面的显示部分跟正常启动内核是有不同的,我将继续前进,不过咱们下一篇讲讲移植led灯的方法,先感受感受咱们的成果的实际效果,好吧,go on!