1、移植涉及的工作
A、系统软件
(1)引导程序:初始化硬件,其目的为加载内核
(2)内核:系统一个核心功能的代码
进程调度、内存管理、字符设备(直接控制的设备)、块设备(涉及数据存储)、网络设备(网络通讯)
块设备:不是直接操作数据,有一个专门来管理如何存储,再下一层才是具体设备,如norflash等
(3)文件系统:内容+格式
B、编译器
交叉编译:在主机环境编译,其编译结果在目标环境下运行
2、交叉编译器安装
在linux环境下安装软件相当于windows下的绿色软件,只解压,然后配
置环境变量即可,而windows下还会向系统注册。
如果不想每次指定编译器软件路径则在环境变量文件中设置路劲。每次编译软件时会去这个路径找这个软件来编译文件。
Shell命令解释器,只是将外部命令解析后交给系统内核,相当于用omap138时,DSP中运行那个软件,通过命令操作dsp擦除nor nand等操作,这个软件自己写的,解释命令,然后去选择执行什么。
3、两个服务
(1)tftp
PC(server 内核(或者是需要下载到板子上的程序))<--------->板子(client )
(2)NFS(网络文件系统)
PC(server 文件系统的内容)<--------->板子(client kernel)
4、虚拟机器-网络设置
===========================================================================
编译步骤
1、指定交叉编译工具链
A、修改源码顶层目录下的Makefile
ifeq (arm,$(ARCH))
CROSS_COMPILE ?=arm-cortex_a8-linux-gnueabi-
endif
B、编译时指定 (注意= 无空格)
# make ARCH=armCROSS_COMPILE=arm-cortex_a8-linux-gnueabi-
2、make 配置
定制编译系统,以达到编译指定文件的目的
# makefsc100_config
配置并编译
# make fsc100
3、Make
Make distclean 命令:清空配置和已经编译的结果
4、编译出的结果
符号表 :作用?
5、s5pc启动与s3c2440启动区别
S5c可以直接用USB接口来下载启动程序,是因为CPU内部有ROM,里面三星已经烧写了一个引导代码,可以从外部下载u-boot到内存中,然后运行u-boot。 而s3c2440必须用烧写器,因为内部无引导代码,需要用烧写器将u-boot烧写到s3c2440启动能访问的flash.
6、s3c2440与s5pc中断区别
S5pc的中断更高级,因为具有向量中断表,会将中断服务程序的地址放入中断向量表,当中断产生后,CPU自动将运行该中断服务程序,而S3c2440的中断产生后,由用户写程序判断是哪一个中断产生,从而去运行该中断。
7、DHCP :路由会自动分配IP,如果是PC与板子直接连接,无路由器,不能采用DHCP,应该手动设置IP。
8、桥接
是将一个网络(是软件协议)连接到一个物理网卡上,相当于将网络组件连接到哪个物理网卡,
网络适配器:网卡
9、bootargs:内核启动参数
10、ram盘 :不会回写,掉电后不保存,优点:读写速度快
一般情况文件是保存在外存中,显示文件目录,只是将文件的目录镜像到内存中,当我们查看文件内容时,才会将外存内容读到内存,而ramdisk盘则是将文件所有内容直接放到内存中,这个ram盘一般可以用来存放加密代码。
11、守护进程作用
12、OTG: 设备与设备通信 一般的HOST :只能是主机与设备通信
===================================================
1、两个阶段的代码
A、第一阶段
体系结构/cpu/具体ARM核目录
start.S
体系结构/cpu/具体ARM核目录/soc目录
B、第二阶段
平台库目录/board.c
2、内核启动条件
3、移植的步骤流程说明
A、选平台
源码顶层目录下Makefile
fsc100_config: unconfig
@$(MKCONFIG) $(@:_config=) armarm_cortexa8 fsc100 samsung s5pc1xx
指定体系平台目录
CPU目录
板级目录
公司目录
SOC目录
B、修改/定制板级文件
(1)、机器码及内核启动参数的内存首地址
(2)、设备主机端初始化代码
C、选配模块
选配模块:命令、逻辑代码、驱动
include/configs/配置名.h
include/configs/fsc100.h
(1)、参数
(2)、开关
源码中的编译宏
Makefile编译开关
(3)、参数开关
12、s5pc100 最开始无u-boot时启动方式
s5pc100内部有一个ROM,这里面存放了三星公司的代码(选择引导方式的),如果是采用外部USB口(外部薄码开关选择),内部ROM会选择启动时从外部USB口读取程序,将程序存放到CPU内部的RAM(此程序后面主要完成初始化DDR用,为后面引导U-boot做准备),当程序读取到CPU内部RAM后开始运行此程序,将会初始化外部内存,再将u-boot程序通过USB传输到DDR中运行,然后将U-boot烧写进入nandflash中。
13、u-boot初始化时,关闭MMU,因为MMU会映射地址,例如内存物理地址为0x2000 0000,而经过MMU映射后可能为0x0000 0000, 这样启动时,如果我们希望从实际的内存空间运行程序时,无法完成. 所以在程序启动时关闭MMU.
在第二次初始化时才打开MMU ,为后面使用.
14、系统内核是常驻内存的,
15、cache在初始化时被关闭的原因
因为当外部内存上的数据变化时,cache上数据不一定会更新,因此关闭cache,直接从内存地址读取数据,对于CPU来说,所有的外设都会有一个地址,因为CPU有地址总线,他能访问的地址都是在一定范围的,内存(DDR)只会占去他一部分地址,其他的地址被用作 例如一般的端口地址 、I2C、SPI \Uart等。但是这些地址会被MMU映射到内存中。当这些端口数据发生变化时,内存里数据改变了,但是cache里的数据还未发生改变,这样在启动时会造成错误。
关于I/O映射的两种方式:
许多处理器使用内存映射I/O,就是把设备的寄存器映射到常规内存空间的固定地址。
有些处理器使用端口映射I/O,就是把设备的寄存器映射到一个单独的地址空间,这个地址空间一般来说要比常规内存小。在这些处理器上,程序必须使用特殊的机器指令来向内存映射设备的寄存器读取或写入值。
16、为什么32位系统的内存条只能为2G,而实际使用时为4G
因为采用了MMU管理,理论上系统的内存可挂载4个G的内存条,但是有一部分的地址空间被外部I/O 占用,例如端口地址 网口地址,nand地址等,剩下的地址给DDR只有2G了。
17、自己在u-boot中增加命令
1、将编写好的命令实现源码放在common文件夹中,修改这个文件夹的Makefile让源文件生成的.o文件追加到u-boot.bin中。 然后可以在fsl100.h中加宏开关。
18、内存管理
1、解决小内存运行大数据
2、解决编译时固定内存地址,而运行时在内存的其他地址,虚实对应。