移植最新的内核之:修改分区和制作根文件系统

来源:互联网 发布:笔记本mac地址修改 编辑:程序博客网 时间:2024/06/05 07:39

修改分区:

根据内核所打印的信息找到分区所在的文件:

Common-smdk.c (arch\arm\mach-s3c24xx)40892013-5-8

根据bootloader设置的分区来设置kernel:如下所示

static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Bootloader",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_2M,
},
[3] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};

找一个之前的jffs2文件系统(目前内核还不支持jffs2,镜像文件链接:点击打开链接)镜像烧写到rootfs分区,重新启动内核即可。

设置的bootagrs:

bootargs=console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2


建立新的根文件系统(busybox下载)

一、编译安装busybox

shanl@shanl-Aspire-4740:~/Linux$ tar -xvf busybox-1.20.0.tar.bz2

make menuconfig修改交叉工具链(使用"\"来进行搜索):

  │   Location:                                                             │  
  │     -> Busybox Settings                                                 │  
  │       -> Build Options 

保存退出,

编译:make

安装:shanl@shanl-Aspire-4740:~/Linux/busybox-1.20.0$ make install CONFIG_PREFIX=../busybox

二、安装库文件:

1.找到编译器的安装路径:

shanl@shanl-Aspire-4740:~/Linux/busybox$ echo $PATH
/home/shanl/env/jdk1.6.0_37/bin:/home/shanl/bin:/home/shanl/env/usr/local/arm/4.3.2/bin:/home/shanl/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/shanl/Android_Sdk/android-sdk-linux/tools

2.拷贝库文件:

先找下库:

shanl@shanl-Aspire-4740:~/env/usr/local/arm/4.3.2$ find . -name "lib"
./arm-none-linux-gnueabi/libc/usr/lib
./arm-none-linux-gnueabi/libc/thumb2/usr/lib
./arm-none-linux-gnueabi/libc/thumb2/lib
./arm-none-linux-gnueabi/libc/armv4t/usr/lib
./arm-none-linux-gnueabi/libc/armv4t/lib

./arm-none-linux-gnueabi/libc/lib
./arm-none-linux-gnueabi/lib
./lib

使用上面加亮的库即可:

shanl@shanl-Aspire-4740:~/Linux/busybox$ mkdir -p usr/lib

shanl@shanl-Aspire-4740:~/Linux/busybox$ mkdir  lib

shanl@shanl-Aspire-4740:~/env/usr/local/arm/4.3.2$ cp ./arm-none-linux-gnueabi/libc/armv4t/lib/*so* ~/Linux/busybox/lib/-d
shanl@shanl-Aspire-4740:~/env/usr/local/arm/4.3.2$ cp ./arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* ~/Linux/busybox/usr/lib/-d

-d的意思:原来是链接文件,也当链接文件拷贝

3.构造etc,dev目录(链接:)

shanl@shanl-Aspire-4740:~/Linux/busybox$ mkdir dev
shanl@shanl-Aspire-4740:~/Linux/busybox$ ls -l /dev/console /dev/null 
crw------- 1 root root 5, 1  5月  8 13:34 /dev/console
crw-rw-rw- 1 root root 1, 3  5月  8 13:33 /dev/null
shanl@shanl-Aspire-4740:~/Linux/busybox$ sudo mknod dev/console c 5 1
[sudo] password for shanl: 
shanl@shanl-Aspire-4740:~/Linux/busybox$ sudo mknod dev/null c 1 3

4.创建其他目录:

shanl@shanl-Aspire-4740:~/Linux/busybox$ mkdir proc tmp mnt sys root

5.制作jffs2镜像文件:

shanl@shanl-Aspire-4740:~/Linux$ mkfs.jffs2 -n -s 2048 -e 128KiB -d busybox -o busybox.jffs2

有可能需要安装:mtd-utils (执行: sudo apt-get install mtd-utils )

将生成的文件系统镜像烧写到nandflash上: 

nand write.jffs2 30000000 260000  $filesize

重新启动内核出现下面的错误:

VFS: Mounted root (jffs2 filesystem) on device 31:3.   //这个说明已经挂接上去了  ,执行init应用程序的时候退出了                         
Freeing init memory: 172K                                                       
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004   

查找代码是由于SIGILL导致(非法指令)

再看看编译器的类型发现是eabi接口,只要内核支持eabi接口(嵌入式应用二进制接口),所以内核需要配置eabi接口

修改内核:

make menuconfig

选中:Use the ARM EABI to compile the kernel 

重新编译内核即可