zoukankan      html  css  js  c++  java
  • 系统移植总结

    menu 简述嵌入式linux系统移植的主要内容有哪些?

    1> 搭建交叉开发环境

      2> 移植bootloader

      3> 移植linux内核

      4> 制作根文件系统

    一、搭建交叉开发环境

    1、交叉编译工具链的制作(GCC交叉编译器的生成)

    (1)       下载Binutils、GCC、Glibc源码

    (2)       配置并编译Binutils取得所需的汇编和链接程序(连接程序ld,汇编程序as,主要为GNU系统提供汇编和连接工具)

    (3)       配置并编译GCC源码生成GCC编译器。(主要为GNU系统提供C编译器)

    (4)       配置Glibc并编译生成Glibc的c函数库(一些基本的C函数和其他函数定义)

    (5)       再次配置和编译GCC源码,生成其他语言的编译器,如C++编译器(一般是C编译器首先生成,然后以这个为基础,结合生成的Glibc的C函数库,再编译生成其他编译器)

    【注】工具链依赖内核版本

    2、二进制工具Binutils

    ld:

    as:

    objcopy:objcopy   是用来进行目标格式转换的  

    objdump:objdump   是用来反汇编的

    strings:

    strip:strip  是丢弃目标文件的全部或者特定符号,减少文件体积的  

    addr2line: addr2line 是用来把程序地址转换为文件名和行号的 

    ar:ar 是用来将目标文件生成静态库的

    3、配置主机方必须的软件

    (1)tftp服务器

    Tftp用来下载远程文件的最简单网络协议,基于UDP协议实现

    (2)nfs服务器

         主要将本地的一个目录通过网络输出,其他计算机可以远程挂接这个目录并进行访问。

           Nfs有自己的协议和端口,但在文件传输或其他相关信息传递的时候,NFS使用远程过程调用协议(RPC),RPC负责管理端口号的对应与服务相关的工作。NFS本身没有传输文件的协议。

    二、 U BOOT

    2010.08版本之前的Uboot架构比较简单,之后的版本架构变复杂。

    1. 什么是bootloader,其作用是什么? 列举三种ARM平台常用的bootloader

    (1)bootloader是系统加电或复位时首先运行的一段代码,

    (2)作用:对系统的软硬件做相应的初始化,为操作系统的加载运行做好准备。

    (3)ARM平台常用的bootloader:u-boot、  redboot、  blob 、 vivi

     2.描述u-boot启动流程

     u-boot启动分为两个阶段:

    第一个阶段用汇编实现。设置中断向量表->设置SVC模式、中断和时钟 ->

    关闭看门狗、mmu和cache->初始化内存控制器->自搬移->设置堆栈、清空bss段

    第二个阶段用C实现。调用一系列初始化函数->初始化Flash设备和环境变量->

    初始化网络设备->进入循环

    3、Uboot移植
    (1)uboot移植中比较重要的几个目录。
      【90%的移植都在下面的6个目录】
      a .平台相关的(重要,关系到系统能不能正常启动,能不能用)
    /board     /cpu    /lib_arm    /include 
      b.  平台无关的(次重要,功能是否齐全,关系到uboot支持的命令。。。如:ping命令的支持)通用
          /common  /drivers    /include 
     (2)Uboot移植流程
      a.修改Makefile
        增加交叉编译工具链的路径:CROSS_COMPFILE:=
      b.make clean(清除之前的编译)
      c.配置Uboot(私有化,针对要移植的开发板做相应修改)
      d.编译Uboot
         make完生成一些文件(主要关注三个)
        Uboot(elf文件)、Uboot.bin(二进制文件)、System.map(符号映射表)
       
    4.Uboot相关知识点:

    (1).  bootloader向内核传参的方式有param_struct、 tag;

    (2)  u-boot的命令中,设置环境变量的命令是  setenv

    (3) u-boot中存放内核启动参数的环境变量是 bootargs

    (4)linux要求bootloader在运行内核前,让系统进入 SVC 模式 

     (5)linux要求bootloader将平台号保存在 r1

    5.uboot

    uboot倒计时,由自启动脚本决定

    bootargs:选择启动方式

    交叉调试:gdb_server(交叉编译工具链里有)

    CP到nfs挂载的路径下,

    三、linux内核移植

    1、内核概念

    2、功能(linux内核的五大任务)

    进程管理、内存管理、文件系统支持、设备管理(驱动)、网络协议

    3、组织结构

    4、配置内核(内核裁剪:make menuconfig)

           (1)顶层Makefile

    (2)kconfig(裁剪 菜单选项的来源,添加删除选项)

    (3)arch/arm…/mach/…板级信息

    (4)arch…/smdkc100.c 板级驱动配置信息

    5、编译内核(make zImage)

    6、添加驱动

      (1)网卡

    (2)LED

    (3)Nand分区

    (4)SD卡

    (5)LCD

    7、可能考的面试题

      配置内核时,保留了什么,裁剪了什么?

    项目中前期开发模式是nfs挂载的方式,所有配置了nfs服务,配置了DM9000的驱动,便于tftp下载;项目中主控端用到了zigbee模块,GPRS模块,所以分别配置了USB转串口驱动。项目中没有用到SPI驱动,所以把这部分裁剪了。

    【注】make zImage:编译生成内核的可移植镜像

          make modules:以M形式控制的部分才能编译

     8.linux内核启动流程

    (1)Bootloader:

    a.硬件上电后跳到一个固定位置执行相应的代码

    b.初始化相应的设备

    c.加载内核的代码到内存

    d.跳到内核代码起始位置执行

    (2)Kernel

    a.内核自解压

    b.初始化静态编译进内核的驱动模块(需要访问rootfs)

    c.挂载rootfs(需要访问、运行用户空间的程序)

    d.直接执行第一个用户空间程序

    (3)第一个用户空间程序

       配置用户环境,执行服务进程

    9.linux调试内核方法介绍

    当console初始化以后,一般最为简单的内核调试方式为 printk 

         printk支持几种打印级别?

    8种(0~7)

    10 .linux相关知识点
    (1)内核启动过程中,如果终端出现”Error:a”错误,可能出现的原因是:内核不支持当前开发平台
    (2)内核启动过程中,如果终端出现”Error:p”错误,可能出现的原因是:内核不支持当前处理器
    (3)内核解压后,console初始化以前使用的函数是:printascii

    11、内核相关问题: 

      (1)编译内核镜像命令 make  zImage 

           编译模块的命令 make  modules

      (2)第一次配置内核时,应使用的缺省内核配置文件是什么? 

        arch/arm/configs/s5pc100_defconfig

      (3)存放平台代码的文件是什么(完整路径)? 

        arch/arm/mach-s5pc100/mach-smdkc100.c

      (4)内核解压后的入口在哪个文件? 

        arch/arm/kernel/start.S

     四、rootfs的制作 

    1.概念  

          存放运行、维护系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件的地方,也可以安装各种软件包。  

     2.rootfs制作流程

    (1)采用bubybox创建基本命令

    (2)创建基本的目录/lib  /etc /var  /tmp /dev  /sys /proc等

    (3)添加glibc基本动态库

    (4)创建基本的设备节点

    (5)添加启动配置和脚本程序(一般etc下有此四个文件)/etc/inittab   /etc/fstab  /etc/init.d/rcS

    另外有一个文件profile也可以加,用来存放环境变量。

    【inittab:定义了各种action。

    如:在用busybox制作根文件系统时,如果要求在程序执行前按enter键进行确认,添加action:askfirst 】

    【rcS:init进程调用的第一个脚本

      一般都会有 mount -a(挂载所有fstab下的内容)】

    (6)测试根文件系统

    (7)制作根文件系统镜像,如ramdisk  cramfs jffs2......

     4、根文件系统特性 

    (1)内核挂载的第一个文件系统, 

    (2)根文件系统上存放有内核运行的第一个初始化程序init、命令、设备节点、配置文件以及共享库等等 

    (3)系统中只能有一个根文件系统 

    (4)嵌入式linux系统通常用bubybox工具集构建文件系统,以减小系统体积

     5.init进程  

     (1)所有进程的祖宗进程 

     (2)所有孤儿进程的父进程 

    6、不同的文件系统的区别 

    (1)yaffs2、jffs2 文件系统可以运行在nand flash上,并具有可读写特性 

    (2)cramfs  文件系统可以运行在nand flash上,并具只读特性  

    (3)tmpfs 不占用任何磁盘空间的文件系统 

    ubifs针对大容量磁盘的文件系统。

    yaffs,yaffs2的区别:yaffs按小页访问,yaffs2按大页访问。

    yaffs文件系统有一个致命的bug,在开机时会扫描整个磁盘,速度慢,耗时。所以适用于小容量的磁盘(兆级以下的)。

  • 相关阅读:
    GO語言基礎教程:數組,切片,map
    GO語言視頻教程下載
    GO語言基礎教程:流程控制
    GO語言基礎教程:數據類型,變量,常量
    GO語言基礎教程:Hello world!
    GO語言基礎教程:序章
    騰訊RTX的API開發,給RTX開個天窗
    RTX的api開發實例
    [轉]redis;mongodb;memcache三者的性能比較
    [轉載]史上最强php生成pdf文件,html转pdf文件方法
  • 原文地址:https://www.cnblogs.com/lemon-tree/p/5223021.html
Copyright © 2011-2022 走看看