修改分区:
根据内核所打印的信息找到分区所在的文件:
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
重新编译内核即可