移植linux-4.15.12

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           ?= arm  
CROSS_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 root

7.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 f0fffff
tftp 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)

成功启动内核,如图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值