0.下载、解压:
在https://www.kernel.org/ 下载linux-4.15.12.tar.xz
xz -d linux-4.15.12.tar.xz
然后会发现文件的格式变成了.tar格式。再按照.tar格式解压:
tar -xvf linux-4.15.12.tar 就可以进行移植操作了。1.修改Makefile文件:
ARCH ?= armCROSS_COMPILE ?= arm-linux-gnueabi-
安装:sudo apt-get install gcc-arm-linux-gnueabi
2.配置内核
用arch/arm/configs目录下的s3c2410_defconfig配置内核:make s3c2410_defconfig
3.设置机器ID
在UBOOT里:set machid 16a // mach-smdk2440.c
调用过程分析:在UBOOT的bootm命令中,do_bootm_linux函数,kernel_entry(0,machid,r2).uboot的默认MACH ID:gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; // 193
如果s = getenv("machid");成功,则使用它,否则使用默认的
4. 修改时钟配置
使用上面的配置编译后,启动新内核可以看到串口输出乱码,原因是内核时钟配置有误。修改arch/arm/mach-s3c24xx/mach-smdk2440.c
static void __init smdk2440_init_time(void)
{
s3c2440_init_clocks(12000000);
samsung_timer_init();
}
5.生成uImage并启动内核
sudo make uImage 在arch/arm/boot目录下生成uImage
编译过程中发现的问题 :scripts/extract-cert.c:21:25: fatal error: openssl/bio.h: No such file or directory
解决方法是:sudo apt-get install libssl-dev
启动内核:tftp 30000000 uImage;bootm 30000000或者先写入nand再从nand启动内核:
nand erase 0 0x400000 //4M大小
nand write 30000000 0 0x400000
set bootcmd ‘nand read 30000000 0 0x400000;bootm 30000000’
启动内核Starting Kernel...后没有信息显示解决方法:set bootargs console=ttySAC0,115200 root=/dev/mtdblock1 rootfstype=jffs2
6.修改mtd分区
/linux-4.15.6/arch/arm/mach-s3c24xx/common-smdk.c文件中:static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "kernel",
.size = SZ_4M,
.offset = 0,
},
[1] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
7.制作根文件系统
7.1下载busybox-1.20.0,make menuconfig
Busybox Settings ===>Build Options ====>Build Busybox as a static binary(no shared libs)编为静态库7.2修改Makefile
修改Makefile 中的 ARCH 和 CROSS_COMPILE 为arm 和 arm-linux-直接进行make编译
7.3安装
执行命令:make CONFIG_PREFIX=../rootfs install
安装到指定目录位置,这里装到roofs目录底下,将出现bin sbin usr 目录和linuxrc文件7.4在etc文件夹底下创建fstab、inittab、/init.d/rcS文件。
inittab文件中的内容定义如下:
::sysinit:/etc/init.d/rcS
ttySAC0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
fstab文件中的内容定义如下:
#device mount-point type option dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
/etc/init.d/rcS 文件中的内容定义如下:
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
并加可执行权限:chmod +x etc/init.d/rcS
7.5使用mdev创建设备文件
需要在dev中创建console 和null节点:sudo mknod console c 5 1
sudo mknod null c 1 3
7.6创建其他目录
mkdir proc mnt tmp sys root7.7添加库文件
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib/ -d-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;
7.8 制作jffs2文件系统映像文件
7.8.1 zlib的编译
解压zlib-1.2.3.tar.bz2并进入zlib-1.2.3配置编译安装$ tar xzf zlib-1.2.3.tar.bz2
$ cd zlib-1.2.3
$ ./configure --shared --prefix=/usr
$ make
$ make install
7.8.2 mtd工具编译
$ tar xjf mtd-utils-05.07.23.tar.bz2$ cd mtd/util
$ make
$ make install
7.8.3 jffs2文件系统镜像制作
$ mkfs.jffs2 -n -s 2048 -e 128KiB -d rootfs -o rootfs.jffs2-s 2048指nand一页大小,-e 128KiB指nand一个擦除块大小
8.烧写rootfs
nand erase 400000 f0ffffftftp 30000000 rootfs.jffs2
nand write 30000000 400000 $filesize
set bootargs console=ttySAC0,115200 root=/dev/mtdblock1 rootfstype=jffs2
9. 重启
reset发现问题:Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
出现这个错误的原因是交叉编译器用的是EABI接口,所以内核也要用EABI接口才行:
解决办法:重新配置内核支持EABI
make menuconfig
Kernel Features --->
[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL)
成功启动内核,如图: