【系统移植】基础理论与环境搭建

来源:互联网 发布:淘宝 投诉未生产扣分吗 编辑:程序博客网 时间:2024/04/29 14:18

系统组成


  1. windows系统
    BIOS(引导系统) windows系统核心 应用程序 驱动 文件系统(程序 就是维护我们自己存储文件)

  2. linux系统
    bootloader(引导系统) kernel(linux内核) 应用程序 驱动 文件系统

开发环境


  • 交叉工具链
  • tftp服务器
  • nfs服务器
  • ubuntu系统(命令)

linux特点


  1. linux系统有硬件限制
  2. linux系统比较复杂
  3. 开源不免费,涉及到一些技术问题还是要自行解决
  4. 有各种资源,需要自行移植优化是比较复杂

系统移植要点


  1. 搭建交叉开发环境
  2. bootloader 的选择和移植
  3. kernel 的配置、编译、移植和调试
  4. 根文件系统的制作

交叉开发环境


硬件环境

  1. fs4412/串口线(显示调试信息)/网线(传输数据)
  2. 当前PC(ubuntu)
  3. 拨码开关
    • 0110 : EMMC启动模式
    • 1000 : SD卡启动模式

软件环境

交叉编译: 当前程序编译的处理器架构与执行的处理器架构不同,因此需要使用交叉编译来编译一个可以在arm架构下执行的可执行程序

交叉编译工具链: 交叉编译使用的工具

获取交叉编译工具链

  1. 可以自己制作交叉编译工具链(crosstools-ng)
  2. 可以进行交叉工具链的下载
  3. 使用厂家提供的交叉编译工具链

安装交叉工具链方法

  1. 在ubuntu中创建一个文件夹将gcc-4.6.4.tar 拷贝到当前目录下
  2. 解压当前文件(其中有几个目录bin目录下有很多可执行程序)

    tar xvf gcc-4.6.4.tar
  3. 对PATH变量进行赋值(原有的PATH值和当前交叉工具链接下后的bin目录)

    sudo vi /etc/bash.bashrcexport PATH=$PATH:/home/lf/sys/gcc-4.6.4/bin (个人路径)

    export:导出为全局
    注:将当前bin目录下的可执行程序变成全局的命令,PATH变量就是表示系统中可执行命令路径的全局变量

  4. 重新执行当前脚本程序

        source /etc/bash.bashrc

gcc的编译过程

  1. 预处理 (头文件包含/宏替换/条件编译) —->.i

        cpp main.c > main.i
  2. 编译 将.i文件(c语言)翻译成汇编文件 —->.s

    sudo ./cc1 main.i(/usr/lib/gcc/i686-linux-gnu/4.8
  3. 汇编 将.s生成.o文件(二进制文件) ——>.o

    as main.s -o main.o
  4. 链接 主要是链接库文件(库函数)—>生成可执行文件

    ld  main.o -I 指定所有的头文件路径  -L 指定需要的库文件路径

elf相关命令

elf格式文件:就是linux/unix中常见的可执行文件格式(二进制文件格式)

  • 补充命令:

    readelf  -h a.out(elf) 查看elf文件的头部信息magic 魔数(标识的当前文件的类型的一串数据)machine/typereadelf -a  a.out(elf) 查看elf文件的全部信息size a.out 查看对应的各个段的大小nm a.out 查看符号表(表示各个段的开始和结束)    符号表的目的:表示编译的链接时,需要以何种方式进行链接
  • 重要命令:

    file a.out  查看文件的信息strip a.out 瘦身命令(减小可执行程序的大小/删除的是静态库符号表)    注:不要对中间文件瘦身objdump -d a.out 反汇编    我们可以去看init中的执行内容(是调用main函数等c语言执行内容)    注:当前会提供虚拟地址,如果可以知道问题的地址,我们可以通过地址找到执行位置(pc寄存器)objdump -D a.out 更加详细的信息(.dis表示反汇编文件后缀)objcopy 格式转换(  将elf格式文件转换为其他二进制格式)objcopy  --gap-fill=0xff   -O  binary      a.out      main.bin             字节对齐填充为1   指明修改的格式  elf源文件   目标文件objcopy  --gap-fill=0xff   -O  srec     a.out      main.srec(摩托罗拉格式)

tftp服务器

文件传输服务器(网络)存储一些文件,提供给客户端下载

  1. 重启tftp服务器(监测当前是否包含tftp服务器)

    sudo service tftpd-hpa restart
  2. 在线安装服务器

    sudo apt-get install tftpd-hpa(tftp服务器端) tftp-hpa(tftp客户端) 
  3. 配置(指定对应下载上传的目录)

    sudo vi /etc/default/tftpd-hpaTFTP_USERNAME="tftp"           tftp服务器的用户名TFTP_DIRECTORY="/tftpboot"        tftp的服务器目录(自行指定/自行创建/并且需要给目录最大权限)  注:最好tftp服务器目录放在根目录下TFTP_ADDRESS="0.0.0.0:69"  tftp协议地址,特定端口号TFTP_OPTIONS="-c -s -l" tftp服务器权限选项(表示最大权限,可上传,可下载,可连接)
  4. 重启服务器生效当前配置

    sudo service tftpd-hpa restart 
  5. 本机测试

    tftp + ip地址(发起连接的作为客户端)tftp 127.0.0.1 get + 文件名    上传 (上传文件为当前连接目录下的文件,上传位置为对应的tftp服务器目录)put +文件名   下载(从对应服务器目录中下载到当前路径)q 退出

nfs服务器(网络文件系统)

  1. 重启nfs服务器

    sudo service nfs-kernel-server restart
  2. 在线安装

    sudo apt-get install nfs-kernel-server
  3. 配置

    sudo vi /etc/exports/source/rootfs *(rw,sync,no_subtree_check,no_root_squash)

    指定目录(放文件系统) 可读可写
    source/rootfs 需要自行创建并加最大权限

  4. 重启nfs服务器

    sudo service nfs-kernel-server restart 
阅读全文
0 0
原创粉丝点击