linux 2.6.24.4在S3C2410上的移植(根文件系统cramfs,ramdisk,jffs2)(基于GEC2410)

最新更新时间:2022-05-28来源: eefocus关键字:linux  S3C2410  移植  根文件系统 手机看文章 扫描二维码
随时随地手机看文章

内核可以跑起来,接下来就是移植根文件系统了.

我们使用BusyBox-1.10.1来创建根文件系统.下载地址为:http://www.busybox.net/downloads/

1.设置BusyBox

(1)解压

#tar -xvjf BusyBox-1.10.1.tar.bz2

#cd BusyBox-1.10.1

(2)修改Makefile,设置CROSS_COMPILE

ARCH  ?= arm

CROSS_COMPILE ?= /home/GEC2410/toolchain/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-

(根据自己的交叉编译环境路径)

(3)配置BusyBox

运行make menuconfig进行配置,在BusyBox Settings-Build Options里选择静态链接,这样BusyBox就可以直接运行不需要额外的运行库了.

Build Options:

    [*] Build BusyBox as a static binary (no shared libs)    │ │  

    [ ] Force NOMMU build                                                │ │  

    [ ] Build shared libbusybox                                          │ │  

    [*] Build with Large File Support (for accessing files > 2 GB) 

确保Init Utilities的如下选项被选择,以支持/etc/inittab配置文件和在真实串口中运行命令行.

Init Utilities—>

    [*] init

    [*] Supporting reading an inittab file

    [*] Supporting running commands with controlling-tty

其他选项使用默认即可.

(4)编译

[matt@localhost busybox-1.10.1]$ make

[matt@localhost busybox-1.10.1]$ make install

这时我们可以看到在Busybox-1.10.1下有_install这个目录,里面包含了应用程序的目录:bin、sbin、usr和脚本linuxrc.

2.创建根文件系统

为了方面起见,我们创建一个目录用来放置根文件系统的文件和目录.

(1)创建rootfs其他目录

[matt@localhost busybox-1.10.1]$ cd ..

[matt@localhost GEC2410]$ mkdir rootfs

[matt@localhost GEC2410]$ cd rootfs

[matt@localhost rootfs]$ mkdir bin dev etc home lib mnt proc root sbin sys tmp usr

[matt@localhost rootfs]$ mkdir mnt/etc

[matt@localhost rootfs]$ mkdir usr/bin usr/lib usr/sbin

[matt@localhost rootfs]$ mkdir proc/net/dev

(没有该目录,kernel会报cannot open /proc/net/dev的错误)

(2)将_install内容复制到rootfs

[matt@localhost rootfs]$ cd ..

[matt@localhost GEC2410]$ cp -r busybox-1.10.1/_install/* rootfs/

(3)在dev目录下创建设备节点

mknod ram0 b 1 0

mknod -m 660 console c 5 1

mknod -m 660 null c 1 3

mknod -m 660 zero c 1 3

mknod -m 666 ttySAC0 c 204 64

(4)编写etc/inittab脚本

# This is run first except when booting in single-user mode

::sysinit:/etc/init.d/rcS

# Start an "askfirst" shell on the console (whatever that may be)

::askfirst:-/bin/sh

# Stuff to do when restarting the init process

::restart:/sbin/init

# Stuff to do before rebooting

::ctrlaltdel:/sbin/reboot

注:使用::askfirst:-/bin/sh系统会询问输入Enter来启动shell,如果想直接启动shell,可以使用ttySAC0::respawn: /bin/sh


(5)编写etc/init.d/rcS

#!/bin/sh

#以读写模式重新安装根文件系统(需要/etc/fstab)

mount -n -o remount,rw /

#启动网络接口

/sbin/ifconfig eth0 192.168.1.5

(6)编写ect/fstab

proc /proc proc defaults 0 0

sysfs /sys sysfs defaults 0 0

none /dev/pts devpts mod=0622 0 0

tmpfs /dev/shm tmpfs defaults 0 0

3.生成文件系统

在内核中我们已经给nand分好区了:

0x000000000000-0x00000000FFFFF : "u-boot"        1M                                                                                   

0x000000100000-0x0000003FFFFFF : "kernel-linux-2.6.24"               3M                                                               

0x000000400000-0x000002BFFFFFF : "rootfs"                      40M                                                                     

0x000002C00000-0x000004000000 : "userdata"    20M

我们的文件系统就放到rootfs中.

(1)cramfs文件系统

CramFS(Compressed Rom File System)是针对Linux内核2.4之后的版本所设计的一种新型只读文件系统,采用了zlib 压缩,压缩比一般可以达到1:2,但仍可以作到高效的随机读取.

使用mkcramfs这个工具可以将上面的rootfs目录转换成一个cramfs文件,然后烧写到之前定义的rootfs分区(0x400000)就可以了.

[matt@localhost GEC2410]$ ./mkcramfs rootfs rootfs.cramfs

设置u-boot启动参数

GEC2410#setenv bootargs root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200

GEC2410#setenv bootcmd nand read 30008000 100000 200000/;bootm

GEC2410#saveenv

烧写根文件系统到开发板上:

GEC2410#tftp 30008000 rootfs.cramfs

GEC2410#nand erase 400000 100000

GEC2410#nand write 30008000 400000 100000

GEC2410#reset

重启可以看到cramfs文件系统已经被加载了,可以输入ls,ping命令测试了.

U-Boot 1.1.6 (May 14 2010 - 14:20:01)


DRAM:  64 MB

Flash: 512 kB

NAND:  nand flash :   64 MB

In:    serial

Out:   serial

Err:   serial

Hit any key to stop autoboot:  0


NAND read: device 0 offset 1048576, size 2097152 ...

 2097152 bytes read: OK

## Booting image at 30008000 ...

   Image Name:   linux-2.6.24

   Created:      2010-05-25   7:22:51 UTC

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    1572120 Bytes =  1.5 MB

   Load Address: 30008000

   Entry Point:  30008040

   Verifying Checksum ... OK

   XIP Kernel Image ... OK


Starting kernel ...


Uncompressing Linux.............................................................

.......................................... done, booting the kernel.

Linux version 2.6.24.4 (matt@localhost) (gcc version 3.4.5) #58 Tue May 25 15:20

:22 CST 2010

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177

Machine: SMDK2410

......

VFS: Mounted root (cramfs filesystem) readonly.

Freeing init memory: 136K

init started: BusyBox v1.10.1 (2010-05-26 13:19:35 CST)

starting pid 775, tty '': '/etc/init.d/rcS'

eth0: using half-duplex 10Base-T (RJ-45)


Please press Enter to activate this console.

starting pid 778, tty '': '-/bin/sh'

#

# ls

bin      etc      lib      mnt      root     sys      usr

dev      home     linuxrc  proc     sbin     tmp


(2)ramdisk文件系统

ramdisk存在于RAM中并且功能犹如块设备.由于ramdisk上的内容将因系统的重启而丢失,所以ramdisk通常会从经压缩的磁盘文件系统(例如ext2)加载其内容,这就是所谓的经压缩的ramdisk映像.

首先创建一个空的文件系统映像

[matt@localhost GEC2410]$ mkdir initrd

[matt@localhost GEC2410]$ dd if=/dev/zero of=initrd.img bs=1k count=8192

8192+0 records in

8192+0 records out

这就创建了一个8192KB的文件系统映像.

内核配置中ramdisk的默认大小是4096KB,可以根据需要修改成8192KB或者创建4096KB的initrd.img.

(8192) Device Drivers-Block Drivers-Deafult RAM disk size(kByte)

接着对它建立文件系统并且安装它:

[matt@localhost GEC2410]$ mke2fs -F -v -m0 initrd.img

mke2fs 1.41.4 (27-Jan-2009)

fs_types for mke2fs.conf resolution: 'ext2', 'small'

Filesystem label=

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

2048 inodes, 8192 blocks

0 blocks (0.00%) reserved for the super user

First data block=1

Maximum filesystem blocks=8388608

1 block group

8192 blocks per group, 8192 fragments per group

2048 inodes per group


Writing inode tables: done                           

Writing superblocks and filesystem accounting information: done


[matt@localhost GEC2410]$ sudo mount -o loop initrd.img initrd

将根文件系统文件(rootfs目录下内容)复制到initrd目录

[matt@localhost GEC2410]$ sudo cp -av rootfs/* initrd

[matt@localhost GEC2410]$ sudo umount initrd

用gzip压缩生成最终的ramdisk文件

[matt@localhost GEC2410]$ gzip -9 < initrd.img > ramdisk

ramdisk实际大小为875K,压缩了一半多.


设置u-boot启动参数

GEC2410#setenv bootargs initrd=0x31000000,0x200000 root=/dev/ram0 rw init=/linuxrc console=ttySAC0,115200

GEC2410#setenv bootcmd nand read 31000000 400000 200000/;nand read 30008000 100000 200000/;bootm

GEC2410#saveenv

烧写根文件系统到开发板上:

GEC2410#tftp 30008000 ramdisk

GEC2410#nand erase 400000 200000

GEC2410#nand write 30008000 400000 200000

GEC2410#reset


U-Boot 1.1.6 (May 14 2010 - 14:20:01)


DRAM:  64 MB

Flash: 512 kB

NAND:  nand flash :   64 MB

In:    serial

Out:   serial

Err:   serial

Hit any key to stop autoboot:  0


NAND read: device 0 offset 4194304, size 2097152 ...

 2097152 bytes read: OK


NAND read: device 0 offset 1048576, size 2097152 ...

 2097152 bytes read: OK

## Booting image at 30008000 ...

   Image Name:   linux-2.6.24

   Created:      2010-06-07   8:21:02 UTC

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    1572100 Bytes =  1.5 MB

   Load Address: 30008000

   Entry Point:  30008040

   Verifying Checksum ... OK

   XIP Kernel Image ... OK


Starting kernel ...


Uncompressing Linux.............................................................

.......................................... done, booting the kernel.

Linux version 2.6.24.4 (matt@localhost) (gcc version 3.4.5) #61 Mon Jun 7 16:18:

03 CST 2010

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177

Machine: SMDK2410

......

checking if image is initramfs...it isn't (no cpio magic); looks like an initrd

Freeing initrd memory: 2048K

.....

RAMDISK: Compressed image found at block 0

VFS: Mounted root (ext2 filesystem).

Freeing init memory: 136K

init started: BusyBox v1.10.1 (2010-05-26 13:19:35 CST)

starting pid 774, tty '': '/etc/init.d/rcS'

mount: cannot read /proc/mounts: No such file or directory

eth0: using half-duplex 10Base-T (RJ-45)


Please press Enter to activate this console.

starting pid 777, tty '/dev/ttySAC0': ' /bin/sh'

#


(3) jffs2文件系统

jffs2是在闪存上使用非常广泛的读/写文件系统, 在嵌入式系统中被普遍的应用.

我们使用mkfs.jffs2工具来制作jffs2文件系统, 该命令给时如下:

# 使用 mkfs.jffs2 工具,制作根文件系统映像

# -d rootfs :根文件系统的内容目录

# -e 0x4000:FLASH的eraseblock大小

# -p :以0xff填充文件尾部的空间对齐eraseblock

# -o rootfs_jffs2.img :输出映像文件名

创建jffs2文件系统映像, 我们设置大小为20M(1400000)

[matt@localhost GEC2410]$ sudo ~/bin/mkfs.jffs2 -e 0x4000 -s 0x200 -d rootfs -o rootfs_jffs2.img -p 1400000 -n


设置u-boot启动参数

[1] [2]
关键字:linux  S3C2410  移植  根文件系统 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic566299.html

上一篇:linux 2.6.24.4及根文件系统在S3C2410上的移植(使用4.3.2编译器支持eabi)(基于GEC2410)
下一篇:linux 2.6.24.4在S3C2410上的移植(内核配置)(基于GEC2410)

推荐阅读

OK6410A 开发板 (五) u-boot-2021.01 移植 到 ok6410a
用的代码是 https://github.com/u-boot/u-boot基于该代码的 TAG v2021.01 开发用的ok6410a相关代码来自于 https://blog.csdn.net/Golden_Chen/article/details/89077655代码已经上库 https://github.com/lisider/u-boot/tree/ok6410a目前做了三次提交提交 cb36d21d6276ac17507e19974ba974c2b0df87b0 完成了A. 目录角度 1. s3c6410 soc 的移植 arch/arm/mach-s3c64xx drivers/gpio drivers/mmc dri
发表于 2022-09-27
OK6410A 开发板 (六) 1 OK6410A linux-4.0 移植
增加 arch/arm/configs/forlinx6410_defconfig增加 firmware/sd8686.bin增加 firmware/sd8686_helper.bin用下面的编译器$ arm-none-linux-gnueabi-gcc --versionarm-none-linux-gnueabi-gcc (Sourcery CodeBench Lite 2014.05-29) 4.8.3 20140320 (prerelease)Copyright (C) 2013 Free Software Foundation, Inc.This is free software; see the source for c
发表于 2022-09-26
OK6410A 开发板 (六) 2 OK6410A linux-5.11 移植
$ arm-linux-gnueabi-gcc --versionarm-linux-gnueabi-gcc (Linaro GCC 7.4-2019.02) 7.4.1 20181213 [linaro-7.4-2019.02 revision 56ec6f6b99cc167ff0c2f8e1a2eed33b1edc85d4]Copyright (C) 2017 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTAB
发表于 2022-09-26
OK6410A 开发板 (七) 1 OK6410A 文件系统 busybox和buildroot 移植
存在问题,kernel 是用 Linaro GCC 7.4-2019.02) 7.4.1 20181213 编译的但是 Linaro GCC 7.4-2019.02) 7.4.1 20181213 编译 busybox和buildroot 出来, 执行 linuxrc 的时候 ,会出现 段错误VFS: Mounted root (ext3 filesystem) on device 179:2.Freeing unused kernel memory: 1024KRun /linuxrc as init processrandom: fast init doneKernel panic - not syncing: Attempte
发表于 2022-09-26
OK6410A 开发板 (七) 1 OK6410A <font color='red'>文件系统</font> busybox和buildroot <font color='red'>移植</font>
[单片机框架] main文件的实现和RTX移植
一、 新建工程选择芯片型号选择中间件,勾选RTX选择完毕后,ok解锁。main文件内容如下,由于我对RTX函数,再封装了一层,是为了方便切换其他OS。/********************************************************************************* @file main.c* @author jianqiang.xue* @Version V1.0.0* @Date 2021-04-03* @brief 无********************************************************************************
发表于 2022-09-23
[单片机框架] main文件的实现和RTX<font color='red'>移植</font>
OK6410A 开发板 (六) 3 OK6410A linux-5.11编译分析
订阅专栏linux编译对host环境的要求Documentation/process/changes.rst编译过程1. 杂项 SYSHDR arch/arm/include/generated/uapi/asm/unistd-common.h sh './arch/arm/tools/syscallhdr.sh' 'arch/arm/tools/syscall.tbl' 'arch/arm/include/generated/uapi/asm/unistd-common.h' 'common' '' '__NR_SYSCALL_BASE
发表于 2022-09-23

推荐帖子

ubuntu下简单方便的的FTP软件
apt-getinstallvsftpd就可以安装,安装后默认登陆FTP服务器的帐户名密码就是你用户的帐户名密码,但是只能下载没法上传,如果想上传需要根据以下内容进行进行设置就可以! vsftpd具体设置 建立虚拟账户:虚拟账号1、建立虚拟用户口令库文件口令库文件中奇数行设置用户名,偶数行设置口令#vi/etc/vsftpd/logins.txtmikepwabcdjohnpw12342、生成vsftpd的认证文件#db_load-T-thash
bjwang Linux与安卓
关于Wince中OnPaint函数的问题
本人在做wince时钟显示界面时遇到了点问题,希望能够在这里得到解答 这是OnPaint函数,设置了定时器每55ms刷新调用Invalidate(),强制发送消息WM_PAINT DrawNeedle()函数是用来绘制指针的,因为每55ms要绘制一直CPen,必须在OnPaint里做重绘的处理,否则会留下的痕迹 OnPaint中用了双缓冲防止闪烁,现在要显示的内容画到memDC对应的cBitmap上,最后在画到DC上 问题:程序运行了一段时间后,指针反映会变慢,原来以为是内存的问题,可是
315 WindowsCE
c# pocket pc 2003 dll 注册
我最近用c#写了一个扫描枪程序,其中调用了一个ActiveScan2800M.dll的文件,但是在执行的过程中他告诉我由于以下错误:类未注册,无法创建CLSID为“{58A21E64-D817-11D5-84F7-00E098035C9E}”的COM对象。我用regsvr32注册过了,说找不到dllinstall输入点。请问哪位高人能点拨下,感激涕零!c#pocketpc2003dll注册
chennan 嵌入式系统
可视化超级耳挖勺
功能上可放大3500倍的放大率不用担心眼花看不清的问题,照明度又可调节、操作简单便捷很是划算的一款产品。而且能看见里面的样子。但是因为耳朵里面像迷宫一样曲曲折折,要不时地调整一下角度才能让自己看清 具有3500万像素,五倍放大率,而且亮度可调。动力来源是一节9V电池。可视化超级耳挖勺
xyh_521 创意市集
电子主板线咱修复?
电子主板线咱修复? 电子主板线咱修复?
一梦千回 RF/无线
使用evc4.2开发的程序,原来是x86在,现在想直接使用在arm下如何移植?
CreatinglibraryemulatorRel/Draw2DGraph.libandobjectemulatorRel/Draw2DGraph.exp使用evc4.2开发的程序,原来是x86在,现在想直接使用在arm下如何移植?
kedou000007 ARM技术
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved