免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6569 | 回复: 5
打印 上一主题 下一主题

嵌入式应用程序移植过程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-24 15:36 |只看该作者 |倒序浏览
1 构造目标板的根目录及文件系统

1.1 建立一个目标板的空根目录
我们将在这里构建构建根文件系统,创建基础目录结构. 存放交叉编译后生成的目标应用程序(BUSYBOX,TINYLOGIN),存放库文件等。
    # mkdir rootfs
    # cd rootfs
    # pwd
    /home/arm/dev_home/rootfs
   

1.2 在rootfs中建立Linux目录树
    #mkdir bin dev etc home lib mnt proc sbin sys tmp root usr
    #mkdir mnt/etc
    #mkdir usr/bin usr/lib usr/sbin
    #touch linuxrc
    #tree
    .
    | --­bin
    | --­dev
    | --etc
    | --home
    | --­lib
    | --­linuxrc /* 此文件为启动脚本,是一shell脚本文件。本文后面有专门介绍*/
    | --­mnt
    | ` --­etc
    | --­proc
    | --­sbin
    | --­sys
    | --­tmp
    | --­root
    ` --usr
            | --bin
            | --lib
            ` --sbin
权限参照你的linux工作站即可,基础目录介绍参见本文参考资料(未尾)。
需要说明的一点就是etc目录存放配置文件,这个目录通常是需要修改的,所以在linuxrc脚本当中将etc目录
挂载为ramfs文件系统,然后将mnt/etc目录中的所有配置文件拷贝到etc目录当中,这在下一节的linuxrc脚本
文件当中会有体现。

1.3 创建linuxrc文件
1. 创建linuxrc,加入如下内容:
    #vi linuxrc

    !/bin/sh

    echo "mount /etc as ramfs"
    /bin/mount ­-n -­t ramfs ramfs /etc
    /bin/cp ­-a /mnt/etc/* /etc

    echo "recreate the /etc/mtab entries"   
    /bin/mount ­-f  -t cramfs ­-o remount,ro /dev/mtdblock/2 /

    echo "­mount /dev/shm as tmpfs"
    /bin/mount ­-n -t tmpfs tmpfs /dev/shm

    echo "­mount /proc as proc"
    /bin/mount ­-n -t proc none /proc

    echo "­mount /sys as sysfs"
    /bin/mount ­-n -­t sysfs none /sys

    /bin/mount -n -t usbdevfs none /proc/bus/usb
    /bin/mount -n -t yaffs /dev/mtdblock/3 /var
    /bin/mount -n -t yaffs /dev/mtdblock/4 /home

    exec /sbin/init
2. 修改权限
    #chmod 775 linuxrc
    #ls linuxrc ­-la
    -rwxrwxr-x 1 root root 533 Jun 4 11:19 linuxrc
当编译内核时,指定命令行参数如下
Boot options ­-->Default kernel command string: 我的命令行参数如下
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
其中的init指明kernel执行后要加载的第一个应用程序,缺省为/sbin/init,此处指定为/linuxrc


2 移植Busybox

2.1 下载busybox
http://www.busybox.net/downloads/busybox-1.1.3.tar.gz  下载busybox1.1.3到/tmp目录当中,并解压.

2.2 进入解压后的目录,配置Busybox
    #make menuconfig
    Busybox Settings ­-->
            General Configuration ­-->
                    
  • Support for devfs
                Build Options ­-->
                        
  • Build BusyBox as a static binary (no shared libs)
                        /* 如果只安装busybox 将busybox编译设为静态连接 */
                        
  • Do you want to build BusyBox with a Cross Compiler?
                        (/usr/local/arm/3.3.2/bin/arm-linux-)Cross Compiler prefix
                        /* 指定交叉编译工具路径*/
                Installation options -->
                            
  • Don't usr /usr
                            /*之前没有选择这个选项,kernel始终都没有cramfs加载成功,不知道原因是什么?如果你知道的话请告诉我*/
                           (/home/arm/dev_home/rootfs/) BusyBox Installation prefix
        Init Utilities ­-->
                
  • init
                
  • Support reading an inittab file
                /* 支持init读取/etc/inittab配置文件,一定要选上*/
        Shells ­-->
                Choose your default shell (ash) ­>
                /* (X) ash 选中ash,这样生成的时候才会生成bin/sh文件
                * 看看我们前头的linuxrc脚本的头一句:
                * #!/bin/sh 是由bin/sh来解释执行的
                */
                
  • ash
        Coreutils ­-->
                
  • cp
                
  • cat
                
  • ls
                
  • mkdir
                
  • echo (basic SuSv3 version taking no options)
                
  • env
                
  • mv
                
  • pwd
                
  • rm
                
  • touch
        Editors ­-->
                
  • vi
        Linux System Utilities ­>
                
  • mount
                
  • umount
                
  • Support loopback mounts
                
  • Support for the old /etc/mtab file
        Networking Utilities ­>
                
  • inetd
                /** 支持inetd超级服务器
                * inetd的配置文件为/etc/inetd.conf文件,
                * "在该部分的4: 相关配置文件的创建"一节会有说明
                */

    2.3 编译并安装Busybox
        #make TARGET_ARCH=arm all install

    *这里需要注意一点的是,只要install busybox,我们根文件系统下先前建好的linuxrc就会被覆盖为一同名二进
    制文件。所以要事先备份我们自己的linuxrc,在安装完busybox后,将linuxrc复制回去就好。

    3 移植TinyLogin

    3.1 下载
    http://tinylogin.busybox.net/downloads/tinylogin1.4.tar.bz2 下载tinylogin1.4到/tmp目录当中,并解压.

    3.2 修改tinyLogin的Makefile
        #vi Makefile
    修改记录如下:
    指明静态编译,不连接动态库
        DOSTATIC = true
    指明tinyLogin使用自己的算法来处理用户密码
        USE_SYSTEM_PWD_GRP = false
        USE_SYSTEM_SHADOW = false

    3.3 编译并安装
        #make CROSS=/usr/local/arm/3.3.2/bin/arm-linux- \
        PREFIX=/home/arm/dev_home/rootfs all install
    PREFIX指明根文件路径

    4 相关配置文件的创建

    进入mnt/etc中, 这里是我们存放配置文件的路径
    4.1 创建帐号及密码文件
        #cp /etc/passwd .
        #cp /etc/shadow .
        #cp /etc/group .
    这3个文件是从你工作站当中拷贝过来的,删除其中绝大部分不需要的用户,经过删减后的上述3个文件如下。
    那么现在root的登陆密码和你工作站上的登陆口令一致了,这可能透露你工作站的信息
    1.     #cat passwd
    2.     root:x:0:0:root:/root:/bin/sh /* 改为/bin/sh */
    3.     bin:x:1:1:bin:/bin:/sbin/nologin
    4.     daemon:x:2:2:daemon:/sbin:/sbin/nologin
    5.     #cat shadow
    6.     root:$1$2LG20u89$UCEEUzBhElYpKMNZQPU.e1:13303:0:99999:7:::
    7.     bin:*:13283:0:99999:7:::
    8.     daemon:*:13283:0:99999:7:::
    9.     #cat group
    10.     root:x:0:root
    11.     bin:x:1:root,bin,daemon
    12.     daemon:x:2:root,bin,daemon
    复制代码


    4.2 创建profile文件
        #vi profile
        # Set search library path
        # 这条语句设置动态库的搜索路径,极其重要!!!
        echo "Set search library path int /etc/profile"
        export LD_LIBRARY_PATH=/lib:/usr/lib
        # Set user path
        echo "Set user path in /etc/profile"
        PATH=/bin:/sbin:/usr/bin:/usr/sbin
        export PATH

    4.3创建fstab文件
        # vi fstab
        none /proc proc defaults 0 0
        none /dev/pts devpts mode=0622 0 0
        tmpfs /dev/shm tmpfs defaults 0 0

    5 移植inetd

    5.1 inetd的选择及获取
    Busybox1.1.3提供了inetd支持。如果读者使用的是较低版本的不提供inetd的Busybox,那么可以考虑使用netkit套件来提供网络服务。强烈建议使用高版本的Busybox。此节后半部分介绍如果编译布署netkit当中的inetd。

    5.1.1 获取inetd
    Netkit套件可以从ftp://ftp.uk.linux.org/pub/linux/Networking/netkit/ 下载。
    其中netkitbase0.17中包括inetd程序。下载netkitbase0.17到/tmp目录并解压。

    5.2 编译inetd
    5.2.1 修改configure 文件
    开始配置netkitbase
    之前需要先修改configure脚本以免它在主机上执行测试程序。
        #vi configure
    将每一行出现的.
        /__conftest || exit 1;
    修改成:
        # ./__conftest || exit 1;

    5.2.2 编译
        #CC=/usr/local/arm/3.3.2/bin/arm-linux-gcc ./configure
        #make

    5.3 配置inetd
    5.3.1 拷贝inetd 到根文件系统的usr/sbin 目录中
        #cp inetd/inetd /home/arm/dev_home/rootfs/usr/sbin/
    拷贝inetd的配置文件inetd.conf到根文件系统的/mnt/etc目录中
        #cp etc.sample/inetd.conf /home/arm/dev_home/rootfs/mnt/etc

    5.3.2 根据需要,修改inetd.conf 配置文件
    例如:支持telnetd的inetd.conf配置文件如下
        # <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
        telnet stream tcp nowait root /usr/sbin/telnetd

    5.3.3 拷贝配置文件
    etc.sample目录下有许多网络相关配置文件,其中有一些需要拷贝到根文件系统的etc目录当中,记录如下:
        #cd etc.sample/
        #cp host.conf /home/arm/dev_home/rootfs/mnt/etc/
        #cp hosts /home/arm/dev_home/rootfs/mnt/etc/
        #cp networks /home/arm/dev_home/rootfs/mnt/etc/
        #cp protocols /home/arm/dev_home/rootfs/mnt/etc/
        #cp resolv.conf /home/arm/dev_home/rootfs/mnt/etc/
        #cp services /home/arm/dev_home/rootfs/mnt/etc/
    以上重要配置文件说明如下:
    host.conf:在系统中同时存在着DNS域名解析和/etc/hosts的主机表机制时,由文件/etc/host.conf来说明了解析器
    的查询顺序
    hosts:记录主机名到IP地址的映射
    protocols:记录常用网络协议及端口别名关系,网络应用程序依赖于此文件
    resolv.conf:指定DNS服务器
    services:记录知名网络服务及端口,网络编程依赖于此文件

    6 移植thttpd Web 服务器

    6.1 下载
    http://www.acme.com/software/thttpd/ 下载thttpd到/tmp目录当中,并解压.

    6.2 编译thttpd
        #CC=/usr/local/arm/3.3.2/bin/arm-linux-gcc ./configure ­--host=arm-linux
        #vi Makefile
        指定静态链接二进制文件
        LDFLAGS = ­-static
        #make

    6.3 配置
    6.3.1 拷贝thttpd 二进制可执行文件到根文件系统/usr/sbin/目录中
        #cp thttpd /home/arm/dev_home/rootfs/usr/sbin/
    6.3.2 修改thttpd 配置文件
        #vi contrib/redhat-rpm/thttpd.conf
        # This section overrides defaults
        dir=/etc/thttpd/html #指明WebServer存放网页的根目录路径
        chroot
        user=root #以root身份运行thttpd
        logfile=/etc/thttpd/log/thttpd.log #日志文件路径
        pidfile=/etc/thttpd/run/thttpd.pid #pid文件路径
    拷贝thttpd.conf配置文件到根文件系统的mnt/etc/目录,
    系统加载后,linuxrc脚本会自动将mnt/etc/下的所有文件拷贝到/etc目录中。
        #cp contrib/redhat-rpm/thttpd.conf /home/arm/dev_home/rootfs/mnt/etc/
    6.3.3 转移到根文件系统目录,创建相应的文件
        #cd /home/arm/dev_home/rootfs
        #cd mnt/etc/
    创建thttpd目录
        #mkdir thttpd
        #cd thttpd
    thttpd目录下的目录结构
        | --html
        |    ` --index.html Web Server网页根目录下的默认HTML文件
        | --log
        |    ` --thttpd.log 创建一个空文件就可
        ` ­--run
                `--thttpd.pid 创建一个空文件就可
    html目录下的index.html文件内容如下:
    <html>
    <head>
            <title> Welcome to here^^ </title>
    </head>
    <body>
            <marquee>
                    <font color=red>
                        Welcome to here^^!!!
                    </font>
            </marquee>
    </body>
    </html>

    7 建立根目录文件系统包

    7.1 建立CRAMFS包
    7.1.1 下载cramfs 工具
    http://prdownloads.sourceforge.net/cramfs/cramfs-1.1.tar.gz 下载源代码包.把下载包拷贝到dev_home/tools下.
    1.     #tar ­-xzvf cramfs1.1.tar.gz
    2.     #cd cramfs1.1
    3.     #make
    4.     #su root
    5.     #cp mkcramfs /usr/bin
    6.     #exit
    复制代码

    注意:如果你的系统中已经安装了mkcramfs工具, 则在/usr/bin目录下是一个软link, 请先删除该文件之后, 再拷
    贝该mkcramfs到/usr/bin下.
    7.1.2 制作cramfs 包
        #mkcramfs rootfs rootfs.cramfs
    7.1.3 写cramfs 包到Nand Flash
        #su root
        #cp rootfs.cramfs /tftpboot/

    打开minicom, 进行ARM板的终端模式:


    8 参考资料
    1. <<BUILDING EMBEDDED LINUX SYSTEMS>>
    中文名:<<构建嵌入式Linux系统>>

    轉自:http://blog.csdn.net/wawuta/archive/2007/01/23/1491163.aspx

    [ 本帖最后由 bitmilong 于 2008-6-24 15:38 编辑 ]
  • 论坛徽章:
    3
    CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52
    2 [报告]
    发表于 2008-06-24 20:54 |只看该作者
    收藏了,呵呵,慢慢玩

    论坛徽章:
    0
    3 [报告]
    发表于 2008-06-30 21:36 |只看该作者
    我现在比较疑惑
    这个直接用uClinux
    是不是就不用这么麻烦了!!
    还得做跟文件系统什么的!???

    论坛徽章:
    0
    4 [报告]
    发表于 2008-06-30 21:48 |只看该作者
    原帖由 zhq_xue 于 2008-6-30 21:36 发表
    我现在比较疑惑
    这个直接用uClinux
    是不是就不用这么麻烦了!!
    还得做跟文件系统什么的!???




    這個不用想了,都是這個過程,要相信kernel就是kernel

    论坛徽章:
    0
    5 [报告]
    发表于 2008-07-14 18:14 |只看该作者
    写的挺详细的

    论坛徽章:
    0
    6 [报告]
    发表于 2011-07-01 16:53 |只看该作者
    不错,先收藏了。。。。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP