网络环境搭建
搭建网络环境可以搭建公网的也可以搭建局域网的,这里搭建的是局域网的。
详细看实验手册第一个实验 系统移植实验手册
linux内核的安装与加载
这一章节主要分为两大块:一个为产品阶段即:Linux内核、根文件系统、uboot全部存储到硬盘内,另一个为研发阶段,研发阶段因为需要反复调试,所以需要我们把跟文件系统放到NFS内使用共享的方式,Linux内核放到tftp下进行传输,uboot最好使用SD卡的方式。
详情见实验手册中实验五 系统移植实验手册
Uboot移植(源码结构、配置、编译)
uboot源码结构
uboot源码获取
1. uboot官网获取
ftp://ftp.denx.de/pub/u-boot/
2. 芯片厂家获取
3. 开发板厂家 ---》目前市面上的6818的开发板,开发板厂家只提供u-boot.bin
4. 上级主管 ---》推荐
本次移植课程使用:u-boot-2014.07-netok.tar.bz2
uboot版本命名
前期:u-boot-1.3.2
现在:u-boot-2024.01
08年以前uboot是1.1.几1.3.几这样命名08年开始以年份和月份命名。
uboot版本选择
支持对应的硬件平台
相对成熟的版本(资料多)
每当发布新的芯片后uboot就会增加对应芯片的版本。一般和处理器同一时期发布的uboot版本对处理器的支持较好。
uboot的特点
1. u-boot是一个开源的软件
2. u-boot支持多种架构的平台(ARM powerPC MIPS x86)
3. u-boot的源码短小精悍
4. u-boot就是一个裸机代码
5. u-boot引导加载内核,启动内核,并给内核传递参数
6. u-boot可以完成部分硬件的初始化:uart,内存,emmc,网卡
7. u-boot生命周期短,启动完内核,给内核传递完参数(告诉内核从什么地方去挂载根文件系统),u-boot的生命周期结束。
uboot源码结构
uboot移植
由于uboot的源码特别多所以是由很多个文件夹组成的,同类型的源码放到一个文件夹里
平台相关代码
即与CPU架构或开发板硬件相关的源码,硬件的改动对应的代码也需要进行修改
api:这个目录下有很多的用户接口
arch:与CPU架构相关的源代码
board:与开发板相关的源代码,包含各种官方评估板对应的源码
boards.cfg:这个文件是配置信息
common:这下面全是uboot命令的.c文件
config.mk:也是一个配置文件
COPYING:这是版权文件虽然是开源软件但是也不能乱用
CREDITS:这里是代码贡献者名单包括他们的邮箱
disk:磁盘操作的命令文件夹
doc:这里是详细的说明书
drivers:这里面全是驱动文件
dts:设备树文件夹,后面学习驱动时在详细学习。
examples:里面是例程,在不会写的时候可以参考一下
fs:文件系统,这里面每个文件夹内都是文件系统的源代码和makefile文件这里面ext4是嵌入式领域常用的文件系统。
include:这里是头文件
lib:这里是库
makefile:方便我们编译uboot镜像。它这个makefile是层层调用的每个文件夹下都有,使用make命令后总的makefile文件会调用每层的马克file文件来共同编译出uboot镜像
net:网络文件夹,这里面是uboot支持的一些网络
post:上电自检程序
README:一个说明书或者说帮助文档,这个说明书有5000多行都是一些介绍性的的东西。
tools:工具
移植前的准备工作
获取基本的硬件信息
cpu(内核):cortex-a53
arch:armV8
vendor:samsung
SoC:S5P6818
board(公板): S5P6818
公板:芯片厂家根据芯片设计的一套参考电路板
NEXELL:韩国一个芯片生成厂家,三星将S5P6818芯片授权给NEXELL
移植uboot
根据此手册的步骤进行执行uboot移植
uboot配置与编译
为了保证uboot适用所有开发板,uboot把所有的开发板都写出来了,需要哪个编译哪个
uboot配置
1.指定当前使用的硬件平台
make <board_name>_config(咱们用的是make fs6818_config)
注1:<board_name>为当前使用的开发板的名字
注2:执行该命令的前提是uboot源码支持该开发板
注3:该命令必须在uboot源码的顶层目录下执行
/home/hq/bootloader/u-boot-2014.07-6818/mkconfig -A fs6818
Configuring for fs6818 board...
2.指定编译uboot源码使用的编译器
将以下内容(咱们使用的源码是改过的,但是要知道这个流程)
198 ifeq ($(HOSTARCH),$(ARCH))
199 CROSS_COMPILE ?=
200 endif
修改为
198 ifeq (arm,arm)
199 CROSS_COMPILE ?= arm-none-linux-gnueabi-
200 endif
uboot编译
1.编译uboot
make / make all(编译的时间比较长)
注1:该命令必须在uboot源码的顶层目录下执行
注2:该命令执行后在uboot源码顶层目录下生成u-boot.bin
编译需要大概一分钟。编译完多了几个文件,多了一个system.map文件和那些u-boot开头的。
make在编译的过程中先将.c和.s编译成.o文件。最后把他们链接(ld)成一个可执行文件绿色的那个u-boot。他是elf格式的。我们肯定不能把他刷到板子上。不过在这之后它还会用objcopy把利用elf文件生成bin文件。这里还有一个srec文件这是符合摩托罗拉的二进制文件。
2.清除编译过程中生成的中间文件
make clean
make distclean
注1:该命令必须在uboot源码的顶层目录下执行
这些中间文件就是.o文件。执行make clean只是清除这些.o文件。执行distclean会把生成的可执行文件和二进制文件也删除。恢复刚下载的源码状态。
编译问题解决
Make的时候可能出现上面问题,出现上面问题,如下方法解决:
总结
编译生成ubootpak.bin的步骤
- 修改源码
- 配置编译器------》修改Makefile中的编译器
- make clean------》清除
- make fs6818_config---------》支持开发板
- make -------->编译生成ubootpak.bin
- 将ubootpak.bin 下载到开发板(使用tftp服务)
uboot代码分析
u_boot分析-s5p6818
Linux内核移植
Linux内核概述
内核与操作系统
内核
内核是一个操作系统的核心,提供了操作系统最基本的功能,是操作系统工作的基础,决定着整个系统的性能和稳定性
操作系统
操作系统是在内核的基础上添加了各种工具集、桌面管理器、库、shell、应用程序等(我们使用的网络协议都是基于TCP/IP或者UDP/IP协议开发的)(我们使用rm、mv、cp。。。这些命令都不是内核提供的)
shell翻译过来就是贝壳,他把内核很好的保护了起来。Linux内核内有文件管理系统。所以可以操作磁盘。那现在我们要操作一些文件就需要去操作内核让内核再去操作文件。但是内核很复杂,我们有时候一个误操作可能就会把内核搞坏了。所以我们操作shell让shell再去操作内核就会很安全了。
库这些lib也不是内核包含的。
图形化界面也不属于内核,内核本身只支持大黑框
Linux层次结构
进程管理、内存管理、文件管理、设备管理、网络管理
Linux内核的特点
1》linux内核源码开源
2》linux支持多种架构平台 arm x86(手机和Ubuntu都使用的是Linux内核)
3》linux内核代码采用模块化的方式(模块化—》把功能独立处理 安全性比较高)
4》linux内核代码采用分层的思想
5》linux内核源码具有良好的移植特性和裁剪特性
6》linux内核源码都是使用汇编和c语言实现的
Linux内核源码结构
Linux内核源码获取
The Linux Kernel Archives
1》可以从linux内核官方获取
Index of /pub/linux/kernel/
2》从芯片厂家获取
3》从开发板厂家获取
4》从技术主管获取 --》推荐
Linux内核版本命名
linux-主版本号.次版本号.修订版本号.tar.xz
主版本号:内核源码有较大跟新,才会升级主版本号
次版本号:
次版本号为偶数:表示稳定版本
次版本号为奇数:表示测试版本
修订版本号:内核源码中只要有代码更新就会,
升级修订版本号
Linux内核版本选择
1》不可以太新
2》不可以太旧
3》选择稳定版本
三星公司没有对S5P6818的源码,开源到Linux内核中,所以不能从官网下载linux内核源码,使用samsung提供的内核源码。
本课程使用的内核源码为:kernel-3.4.39-ok.tar.xz
内核源码结构
把源码拖到ubuntu里解压
在ubuntu的家目录下创建kernel文件夹
将内核源码压缩包拷贝到kernel文件夹中
对内核源码进行解压缩
tar -vxf kernel-3.4.39-ok.tar.xz
进入到内核源码目录中,分析内核源码的目录结构
cd kernel-3.4.39
ls
平台相关代码
arch: 与CPU架构相关的源代码 (跟硬件有关的,代码不可以共享)
block:磁盘设备的支持
crypto:加密相关
drivers:设备驱动
firmware:固件
fs:文件系统
include:头文件
一般格式化磁盘都格式化成ntfs
init:内核初始化
ipc:进程间通信(共享内存消息队列什么的都是再ipc目录下实现的)
kernel:内核核心调度机制等
lib:库 内核的核心算法。
mm:内存管理 net:网络协议
scripts:工具、脚本等
security:安全
usr:打包与压缩
virt:虚拟
COPYING: 版权 gpl版权,GNU开源协议
CREDITS: 内核贡献者
README: 说明文档
Documentation: 帮助文档
Makefile: 编译管理
samples: 示例
tools: 工具
Kconfig:内核自带的图形化界面
... ...
Linux内核源码的配置和编译
根据文档进行操作 Linux内核源码的配置和编译
Makefile .config Kconfig文件之间的关系 ?
Makefile:指导内核进行编译
.config:存放的是内核的配置的信息+硬件
Kconfig:存放菜单选项
执行make fs6818_defconfig命令,根据fs6818_config文件和Kconfig文件中的配置信息生成.config文件
make menuconfig 执行时根据Kconfig生成菜单的图形化界面。如果根据菜单图形化界面进行配置之后,会更新.config文件
Makefile文件根据.config文件中的信息,决定将那些文件编译到uIamge中,那些不编译到uImage中。
可以根据实验去理解三者的关系 驱动移植
实验
将led灯的驱动编译到内核和编译成模块步骤