你好!这里是风筝的博客,
欢迎和我一起交流。
ubuntu版本:16.04
arm-linux-gcc版本:4.4.3
Linux kernel版本:4.4.66
u-boot版本:2016.11
祖师爷github:https://github.com/torvalds/linux
Linux Kernel下载地址:
https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.66.tar.xz
解压Kernel:
xz -d linux-4.4.66.tar.xz
tar xvf linux-4.4.66.tar
脱壳解压,可以看出外层是xz压缩方式,里层是tar打包方式.
cd linux-4.4.66/arch/arm/configs
ls *2440*
发现只有mini2440
ls *2410*
发现只有s3c2410
因为s3c2410的配置比mini2440的配置支持功能多,因此我们选择s3c2410配置.
cd ../../../
vi Makefile
修改:
ARCH=arm
CROSS_COMPILE?=arm-linux-
在arch/arm/mach-s3c24xx/mach-smdk2440.c的smdk2440_init_time函数里,
16934400改为12000000,否则启动Kernel会出现乱码,因为我们用的是12M的晶振.
cat include/generated/mach-types.h
可以看出我们s3c2440的机器id为362,也就是0x16a,这个我们要记住.
我们在移植uboot的时候写的机器id是193,现在我们知道了s3c2440的机器id是0x16a,所以boot启动时我们要设置为16a.
make s3c2410_defconfig
开始配置s3c2410文件.
make menuconfig
(这条命令会依赖ubuntu上的libncurses库,记得要先安装好这个库:sudo apt-get install libncurses5-dev)
但是这个我们先不修改,默认即可,直接退出保存.
把我们之前编译uboot时生成的mkimage工具复制到/usr/bin:
sudo cp /work/system/u-boot-2016.11/tools/mkimage /usr/bin/
make uImage
生成的uImage在arch/arm/boot/uImage里.
现在我们把uImage放到开发板上启动看能不能启动:
cp arch/arm/boot/uImage /work/nfs
因为我们的uImage有3M大,而uboot里kernel分区只划分了2M大小,所以我们用nfs从服务器上启动kernel.
在开发板uboot界面:
set machid 16a
save
nfs 32000000 192.168.1.106:/work/nfs/uImage
bootm 32000000
发现Kernel可以正常启动了,但是分区不对,kernel默认分区是:Boot Agent等.所以现在我们来修改分区:
grep "\"Boot Agent\"" * -nR
发现:
arch/arm/mach-s3c24xx/common-smdk.c:114: .name = "Boot Agent"
所以我们修改common-smdk.c的114行所在的smdk_default_nand_part数组:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = SZ_512K,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_4M,
},
[3] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
至此,Kernel能正常启动,现在我们就来制作根文件.
--------------------------------------------
后记:
发现一个可以在线看Linux源码的网站:https://elixir.bootlin.com/linux/latest/source
不仅支持Linux,uboot、qemu等也支持