zoukankan      html  css  js  c++  java
  • Linux系统在嵌入式硬件上的移植

    =========================        基本常识       =========================

    一、 Linux系统的基本构成:

    1、 loader

    2、 kernel

    3、 filesystem

    二、 启动步骤:

    1、 CPUROM(如果有的话)的0x0地址开始读取代码,执行loader

    2、 Loader初始化ram,并从rom中拷贝ubootkernel的镜像到ram的指定地址,执行镜像;

    3、 如果有uboot,则uboot执行启动前的设置,可以初始化部分硬件,可以手动进入uboot环境,等等,最后拷贝kernel的镜像到ram的指定地址;如果没有uboot,那么跳过这一步;

    4、 前面的步骤称为loader部分。Kernel被加载到ram后,kernelbootargs会被覆盖,kernel启动;

    5、 加载驱动程序;

    6、 加载文件系统,读取并执行/etc/inittab.

    三、 交叉编译器:

    arm-linux-gnueabihf-gcc

    四、 Makefile文件和make的使用

    (太容易了,,,,另行说明)

    =========================        移植系统       =========================

    一、 交叉编译器的配置:

    修改 ~/.bashrc

    export PATH=/home/hexh/toolchain/hfcctool/bin:$PATH  #shell任意目录下均可执行gcc

    export CROSS_COMPILE=arm-linux-gnueabihf-   # 编译loaderkernel所需要的一个变量

    重启下shell,或者source ~/.bashrc

    二、 编译loader和内核:

    1、 公司一般基于开发板修改得到自己的产品,因此第一次编译要严格参照官方资料(这个资料都没有,或者编不过,那就是扯蛋了),熟悉后可自行修改源码;

    2、 内核配置命令:make ARCH=arm menuconfig

    三、 最简易的文件系统:

    1、 编译busybox

    执行 make menuconfig

    (1) 修改Build Options --> Cross Compiler prefix

    (2) 菜鸟必须选中Build Options --> no shared libs

    (3) 修改 Installation Options ("make install" behavior) à BusyBox installation prefix ../target,将会在工程目录的target下生成最小根文件系统;

    make && make install

    进入target目录,补齐文件系统的文件夹,标黄的部分必须确保存在:

    bin  etc   lib      mnt  proc  run   sys  usr

    dev  home  linuxrc  opt  root  sbin  tmp  var

    /bin  /sbin  /usr, 这几个文件夹已经被busybox配置过了,不需要自行添加东西,/etc目录需要包含所有的配置信息,busybox没有对这个文件夹进行处理,需要自行定制。

    2、 /etc/inittab

    该文件配置系统启动的默认动作,如果该文件无法读取,会导致kernel panic

    busybox中,和PC机略有不同,文件格式:

    输出设备::运行等级:命令

    常用运行等级:sysinit(开机自启动项)   respawn(保持运行)

    例:

    # 初始化根文件系统

    null::sysinit:/bin/mkdir -p /dev/pts

    null::sysinit:/bin/mkdir -p /dev/shm

    null::sysinit:/bin/mount –a

    # 初始化hostname(需要在/etc/hostname文件中存入机器名称)

    null::sysinit:/bin/hostname -F /etc/hostname

    # 执行启动脚本(可自由订制)

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

    # 在串口0开放登录,并自动登录root(无密码的情况下)

    ttyS0::respawn:/bin/login -f root

     

    3、 /etc/fstab

    命令 mount –a 需要使用的文件,在init初始化工作结束前,需要在/proc /tmp /sys /dev 创建对应的文件系统

    内容:

    proc    /proc   proc    defaults                0       0

    tmpfs   /tmp    tmpfs   defaults                0       0

    sysfs   /sys    sysfs   defaults                0       0

    tmpfs   /dev    tmpfs   defaults                0       0

     

    4、 /etc/passwd /etc/shadow

    这两个文件为账户数据,对inittab中的工作不重要,但登入用户环境有利于调试工作,设置密码也能有效阻止外部破解产品的途径。

    这两个文件每行的第二段数据决定

    例:Root用户无密码的配置

    [root@A5 /etc]# cat passwd

    root:x:0:0:root:/mnt/root:/bin/sh

    [root@A5 /etc]# cat shadow

    root::10933:0:99999:7:::

     

    5、 /etc/profile

    Profile这个脚本会在用户登录的时候自动执行,对inittab阶段不会产生影响。

    内容:

    # 初始化shell

    USER="$(id -un)"

    LOGNAME=$USER

    PS1='[u@h w]# '

    PATH=$PATH:/mnt/bin:/mnt/usr/bin:/mnt/sbin:/mnt/usr/sbin

    HOSTNAME='/bin/hostname'

    export USER LOGNAME PS1 PATH LD_LIBRARY_PATH

     

    四、 文件系统镜像的制作:

    在此会介绍4种文件系统镜像的制作方法:fat   ext4   cramfs   ubifs

    1、 格式化工具 fdisk

    例:格式化U--> fdisk /dev/sdb

    常用命令:

    m:帮助;

    p:打印分区列表;

    n:新建分区;

    t:修改分区格式(但不格式化);

    a:设置可启动分区;

    2、 Fat格式制作方法(在sd卡上运行系统)

    例:格式化uà mkfs.vfat /dev/sdb1

    3、 Ext4格式制作方法(在sd卡上运行系统)

    例:格式化uà mkfs.ext4 /dev/sdb1

    4、 Cramfs制作方法(启动镜像)

    例:mkfs.cramfs -b 4096 -N little ${SOURCE} ${IMAGE}

    5、 Ubifs制作方法

    需要使用两个工具:mkfs.ubifs  ubinize

    先用mkfs.ubifs将根文件目录制作成ubifs文件系统,再用ubinizeubifs文件系统制作成ubi镜像;

    例:

    mkfs.ubifs -r ${SRC} -e 0x1f000 -c 2048 -m 0x800 -o rootfs.ubifs

    ubinize -o rootfs.ubi -m 0x800 -p 0x20000 -s 2048 ubinize.cfg

    ubinize.cfg的内容:

    [ubifs]

    mode=ubi

    image=rootfs.ubifs

    vol_id=0

    vol_type=dynamic

    vol_name=rootfs

    vol_alignment=1

    vol_flags=autoresize

     

  • 相关阅读:
    坚持--从今天开始
    51系列单片机的精确延时的解释(文章如有问题之处,请劳烦指正,谢谢!) 可以看看采纳下。
    利用宏定义实现C++程序在Unix和Win32环境下的通用性
    [转]浅谈C++指针直接调用类成员函数
    类间调用inline函数的效率
    C++ inline函数与编译器设置
    GNU的makefile文件编写说明
    Windows Live Writer 2012 Test
    测试Windows Live Writer
    Mathematica学习笔记2
  • 原文地址:https://www.cnblogs.com/chencanjian/p/5983986.html
Copyright © 2011-2022 走看看