系统移植第二天

来源:互联网 发布:游戏美工培训 编辑:程序博客网 时间:2024/05/06 08:55
系统移植第二天
nfs挂载根文件系统
[1] 设置运行命令
    setenv bootcmd tftp 20008000 zImage\;go 20008000
    tftp 20008000 zImage 从虚拟机下载zImage到开发内存20008000
    go 20008000 直接在内存启动内核
[2] 拷贝rootfs.tar.gz到虚拟机的/source目录下
[3] 解压
    tar xvf rootfs.tar.gz
[4] nfs挂载,在u-boot下执行下面的命令:
setenv bootargs root=nfs(设置根文件系统为nfs) nfsroot=192.168.0.156(虚拟机ip地址):/source/rootfs(nfs的根,在虚拟机上) ip=192.168.0.201(开发板上的linux系统启动后使用的ip地址) init=/linuxrc console=ttySAC0,115200

/***********************************************************************************************/
ARM9网络文件系统启动参数:set bootargs noinitrd root=/dev/nfs nfsroot=192.168.0.163:/work/nfs_root/root_fs  ip=192.168.0.12:192.168.0.163:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
内核网络文件系统标准参数:noinitrd root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>             
A8 网络文件系统启动参数:set bootargs root=nfs nfsroot=192.168.0.163:/work/nfs_root/rootfs ip=192.168.0.10 init=/linuxrc console=ttySAC0,115200
/***********************************************************************************************/

特点:
    工程管理和代码比较混乱,通用性好
    通用表现在以下几个方面:
    1. 支持多种CPU
    2. 支持很多硬件驱动
    任何一块嵌入式主板,都不能用到u-boot里面所有的源代码,所以用u-boot的源代码生成u-boot的过程应该分以下两步:
    1. 选取需要的源代码
    2. 编译选取的源代码

u-boot的目录结构
cpu             各种cpu的启动代码,我们用的是arm_cortexa8
common          命令实现代码
drivers         各种设备驱动,这些设备可以用到其他的cpu主板上面
lib_xxx         (cpu的架构, 比如:arm, x86.....) 标准的库函数
disk            磁盘的分区驱动
fs              文件系统
doc             文档
REAME           有每个目录的详细说明(目录清单)

go 地址          我们改造之后的go命令,go命令无法给启动的程序传参
bootm uImage    u-boot推荐的一个启动操作系统的命令, uImage是用mkimge打包zImage产生的

配置u-boot
make fsc100_config           #选取我们要的源代码(根据硬件(dm9k的网卡)和我们要的功能(tftp命令))
include/config.mk            #ARCH CPU BOARD VENDOR SOC
include/config.h             #
#include <config_defaults.h> #config_defaults.h U-BOOT支持启动的操作系统
#include <configs/fsc100.h>  #整个fsc100主板的配置项

编译u-boot:
1. 配置 -- 根据主板配置选取需要的源代码
   make fsc100(主板名)_config     
2. 编译 -- 编译选取的源代码
   make

make                         # 编译配置选取出来的源代码
产生的文件:
u-boot ELF格式的可执行程序
u-boot.bin binary 格式的可执行程序(去掉了所有的符号表和调试信息)
System.map 存放了符号表
board/samsung/fsc100/config.mk 存放代码段的起始位置变量
config_cmd_default.h 当前编译到u-boot的命令的配置项(宏定义控制条件编译)
config_cmd_all.h 当前u-boot支持的所有命令配置项
[1] 看Makefile书
[2] 看ARM工程
[3] u-boot工程

配置原理
1. 配置规则理解
  fsc100_config: unconfig
   @$(MKCONFIG) $(@:_config=) arm arm_cortexa8 fsc100 samsung s5pc1xx
   @mkconfig fsc100 arm(架构) arm_cortexa8(cpu名字) fsc100(主板名字) samsung(芯片厂家) s5pc1xx(soc名字)
       
   $(MKCONFIG) $(SRCTREE)/mkconfig $(CURDIR)/mkconfig
   $(CURDIR) 是make的环境变量,值为执行make命令时,所处的路径
       
   $(@:_config=) fsc100 $@ == fsc100_config
       
2.配置结果
  include/config.mk 选中需要源代码所在的目录
  include/config.h 使用条件编译选中目录中的部分源代码,采用宏进行数据配置
     include/configs/fsc100.h 主板配置
        include/config_cmd_default.h 命令配置选项, 选中编译到u-boot的命令
        (include/config_cmd_all.h u-boot支持的所有命令配置选项, 配置选项都是条件编译,控制命令是否编译到u-boot)
           
[5] 编译原理
    1. board/samsung/fsc100/config.mk
       代码段的起始地址  
    2. 主目录下面的Makefile
       $(OBJS) 启动代码编译出来的目标代码,需要链接到源代码最开始位置
       $(LIBS) 除启动代码之外的,其他所有的源代码编译出来的文件
    3. 子目录下的Makefile
       $(addprefix $(obj), $(COBJS))
       $(obj) cpu/
       $(COBJS) cpu.o
       cpu/cpu.o
       
       $(LIB) 本目录下所有目标代码打包出来的lib目录名.a
       $(START) 启动代码编译出来的目标文件
       $(COBJS) 本目录下C代码编译出来的目标文件
       $(SBOJS) 本目录下汇编代码编译出来的目标文件
       
[6] 如何向u-boot工程中添加源代码?
    1. 新建目录添加源代码
       比如:
        要加一个串口驱动?
        drivers/serial/uart/uart.c
    2. 拷贝别的子目录下的Makefile
       比如:
        cp drivers/serial/Makefile drivers/serial/uart/
    3. 修改子目录下的Makefile
       $(LIB) libuart.a
       $(COBJS) uart.o
       $(SBOJS)
    4. 在顶层目录的Makefile中添加驱动路径
       如果是非启动代码:
       LIBS += drivers/serial/uart/libuart.a
       
       如果是启动代码:
       OBJS += drivers/serial/uart/uart.o

启动代码初始化核心硬件
CPU(A8):
置为SVC 模式
关闭所有中断
置为ARM状态
关闭MMU(P15)
关闭CACHE(iCACHE)
SOC(s5pc100):
关闭看门狗
中断向量控制器
时钟控制器
串口(UART0)
dma控制器
nandflash管脚及控制器
内存初始化(DRAM)
拷贝完整的U-BOOT到DRAM的0x2ff80000
清空BSS段(全部初始化为0)
分配内存(mallloc函数使用的内存、全局数据区、中断栈(8字节))
跳转(汇编跳转到C语言, 从IRAM跳转到DRAM)
ldr PC, _armboot_start
_armboot_start:
 .word armboot_start
0 0