1、什么是移植?
移植就是将bootloader的源代码、linux内核源代码,文件系统中用户态程序代码根据硬件做少量修改,使其能够在目标硬件平台运行起来的过程。(前提:两个平台硬件差异比较小)
在嵌入式系统中通常没有像BIOS那样的固件程序(注:鱼的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由bootloader来完成。
boot loader中一部分用汇编来写,因此针对不同的CPU体系架构,这一部分代码不具有可移植性(X86与ARM分别有各自的汇编语法)。在移植OS时这部分代码必须改写,bootloader不但依赖CPU架构,而且依赖嵌入式板级设备的配置;
2、boot loader基本功能
①初始化硬件
②将操作系统内核从外存(flash、emmc、sd卡等)拷贝到内存(sdram等)中;
③改写系统的内存映射,原先flash地址映射为0地址,这时需要将RAM的地址映射为0;
④设置堆栈指针并将bss段清零,执行C程序和调用子函数时要用到
⑤提供linux内核的启动参数
⑥启动linux内核
⑦改变PC值,使得CPU开始执行真正的OS内核;
3、linux内核功能及本质
功能:
进程管理(多任务并发、IPC)、文件系统(裸板需要知道存储emmc的偏移地址、文件所占字节大小;在OS中只需要知道文件路径)、网络协议(内核源码实现了TCP/UDP等协议的源码)、设备管理、内存管理(裸板操作物理地址、内核操作虚拟地址)
内核本质:
①从C语言角度来看内核:C语言函数集合
②从硬件角度来说是硬件管理者
③为应用程序的运行提供服务
4、uboot“通用”的两层含义
①支持多架构CPU:PowerPC、MIPC、X86、ARM等;(专门对应相应的CPU写了代码)
②支持多种OS:Linux、VxWorks、QNX、LynxOScar等OS;(针对每种OS的启动方式不同写了相应代码)
uboot源码获取:由上游厂商提供,基于某款参考板,可以运行的,直接拿来移植工作量是最小的(比如三星公司生产的S5P6818处理器,其硬件工程师会围绕S5P6818处理器画一块demo板子出来,把常见的外围设备(LCD屏、网卡、触摸屏、音频、USB、emmc等),软件工程师会拿uboot源码根据设计的demo板去修改编写源码,也会拿linux移植到demo板;目的做硬件验证;二是做市场推广。
5、为什么要配置内核?
①选出硬件相关代码 ARCH?=arm
②内核作为软件,包含了大量的功能;例如,内核支持的文件系统类型:vfat\nfs\ext4\jffs2\yaffs...但实际产品中可能只需要其中部分文件系统,其余文件系统不需要编译进内核,所以通过配置、裁剪掉不需要的功能(不参与uimage文件的编译过程,所以uimage文件所占的存储空间会小一点 );
6、根文件系统
文件系统 = 数据(文件)+ 索引 + 代码
根文件系统:linux启动后加载的第一个真实文件系统(其实也是一个文件系统,但是类似于家里的孩子老大,虽然是个孩子但作为老大也得让着弟弟妹妹),但是作为linux加载的第一个文件系统,有一点特殊要求,也就是文件系统里得有写一些相应的文件:/bin、/dev、/etc、/lib、/mnt、/opt、/usr等(目录里存储的具体内容可百度);
也就是把linux内核之外的东西(五大件)都放到了根文件系统;
(根目录:根文件系统的顶层目录称为根目录,通常表示为斜杠符号 “/”,所有其他文件和目录都从根目录开始,通过路径来访问。)
linux内核在启动过程中要挂载根文件按系统,如果根文件系统出现问题,则linux系统启动过程中会卡死;
7、linux系统下的API分两种:
①内核提供的API(函数)叫系统调用,比如fork创建进程、open打开文件、socket网络通信;
②内核之外有库,库里面也会提供一些API,比如printf、fopen、pthreadcrwat;
可以认为ls、cd等shell命令是一些app,当运行这些命令的时候,这些命令会调用linux的系统调用实现相应功能;linux内核提供的系统调用数量有限(无非围绕内核五大件);(linux内核就2-3M);
根文件系统系统下的/lib里面是*.so(动态链接库),保存的是printf、fopen、fclose、fread、fwrite等函数;
(ubuntu自带根文件系统,也就是进入根目录)