系统移植第二天
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