1.什么叫移植
shell 框架 ----> x6818 (s5p6818)
----> mmmm (s5p6818)
根据硬件平台的差异,将代码进行少量的修改
就能使得该代码在目标平台上正常运行起来,该过程称作移植
2.移植内容:
2.1 移植uboot
uboot 属于bootloader 的一种
它是硬件上电执行的第一个代码 类似于PC机上的BIOS
它负责为操作系统启动初始化硬件
负责加载操作系统 启动操作系统
2.2 移植linux内核
linux内核的获取: www.kernel.org
linux内核的核心功能:
1) 进程的管理
2) 进行间通信
3) 虚拟文件子系统
4) 内存管理
5) 网络子系统
谈谈板子上不上操作系统的优劣:
优点: 可以更容易的实现更加复杂的业务逻辑
缺点: 硬件成本高.
2.3 制作根文件系统
1号进程对应的程序
ls rm touch cd ...
通过移植busybox 实现以上命令
3.目标
1 ) 熟悉uboot 源码 掌握编译方式
2 ) 熟悉linux内核框架结构
掌握内核的裁剪配置方式
掌握内核的编译过程
3 ) 掌握根文件系统镜像的制作方式
4.开发板的烧写实验
4.0 擦除emmc 并分区
mmc erase 0 100000
fdisk 2 3 0x100000:0x4000000 0x4100000:0x2f200000 0x33300000:0
注: 2 ---> 第二个设备
3 ---> 分区个数
剩余: 各分区的起始地址 + 分区长度
4.1 烧写uboot
cp /mnt/hgfs/porting/env/uboot.bin /tftpboot
tftp 48000000 uboot.bin
update_mmc 2 2ndboot 48000000 200 下载的字节数(上面提示多少就是多少555f0)
烧写完成后重启开发板
重新设置ip
setenv ipaddr 192.168.1.6
saveenv
setenv serverip 192.168.1.8
saveenv
4.2 烧写linux内核
cp /mnt/hgfs/proting/env/uImage /tftpboot/
tftp 48000000 uImage
mmc write 0x48000000 0x800 0x3000
0x800: 要写入的偏移位置 单位扇区
0x3000: 要连续写入的扇区个数 > 下载的字节个数 / 512
重启之后报错:
ERROR: can't get kernel image!
setenv bootcmd mmc read 48000000 800 3000 \; bootm 48000000
saveenv
mmc read 48000000 800 3000:
从emmc 偏移0x800扇区位置开始连续读取
0x3000个扇区内容到内存0x48000000开始的位置
bootm 48000000
启动操作系统
重启开发板:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
原因是没有挂载根文件系统
4.3 烧写根文件系统镜像
rootfs_ext4.img
cp /mnt/hgfs/proting/env/rootfs_ext4.img /tftpboot/
tftp 48000000 rootfs_ext4.img
mmc write 0x48000000 20800 32000
setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 console=ttySAC0
maxcpus=1 lcd=wy070ml tp=gslx680
注: root=/dev/mmcblk0p2,指定根文件系统所在的分区
rootfstype,文件系统的类型
console,控制台
ttySAC0, uart0控制器
maxcpus=1,只启动cpu0
lcd, LCD屏的类型
tp,触摸屏的类型
也支持加载网络根文件系统: setenv bootargs root=/dev/nfs nfsroot=serverip:路径 ...
saveenv
重启开发板
用户名: root
密码: 123456
5.编写UC程序在开发板上执行
上位机:
mkdir porting
cd porting
vim helloworld.c
arm-coretex_a9-linux-gnueabi-gcc helloworld.c
cp a.out /tftpboot
下位机:
tftp -g -r a.out 192.168.1.8 -g: Get File -r: FILE Remote file
发现下载不下来
在内核下配置IP地址:
ifconfig eth0 192.168.1.6
ping 192.168.1.8
再次执行 tftp -g -r a.out 192.168.1.8
发现执行不了, ls a.out -l
chmod +x a.out
./a.out
6 通过nfs方式挂载网络根文件系统
nfs: net file system
6.1 创建 nfs server
联网:sudo apt-get install nfs-kernel-server
未联网:cd /home/liuyang/Downloads/nfs/
sudo dpkg -i *.deb
6.2 配置nfs server
准备开发板需要的根文件系统中的文件
cd /opt/
cp /mnt/hgfs/porting/env/rootfs_qt.tar.bz2 ./
sudo tar xf rootfs_qt.tar.bz2
修改配置文件
sudo vi /etc/exports
/opt/rootfs *(rw,sync,no_root_squash)
/opt/rootfs: 允许客户端可以nfs协议访问的目录
6.3 重启nfs server 使得新配置生效
sudo /etc/init.d/nfs-kernel-server restart
6.4 配置客户端 告诉开发板上的linux内核去哪找根文件系统
setenv bootargs root=/dev/nfs nfsroot=192.168.1.8:/opt/rootfs
ip=192.168.1.6:192.168.1.8:192.168.1.1:255.255.255.0
init=/linuxrc console=ttySAC0 maxcpus=1
lcd=wy070ml tp=gslx680
root=/dev/nfs, 告诉内核挂载网络文件系统
nfsroot=nfs server ip: 目录
告诉linux内核去哪台主机的哪个目录下找根文件系统数据
ip=自身IP:服务器IP:网关:子网掩码
saveenv
重启开发板
touch 1.txt
cp /home/liuyang/porting/hello_arm /opt/rootfs/
1.Uboot 的基本概念
通用的bootloader
bootloader 的作用就是初始化硬件
加载启动操作系统
bootloader 不属于操作系统内核,这一部分不具有可移植性.
通用的含义:
1) 支持多种cpu架构: powerpc arm x86 ...
2) 可以加载启动多种操作系统: linux vxworks (实时性非常强) QNX (实时操作系统) ...
怎么理解实时性: 对于linux来说,有点吃大锅饭的意思,所有的进程都有得到执行的机会
vxworks 是丛林法则,高优先级的任务不执行完,低优先级的没有机会执行.
2.Uboot 源码的获取
1) U-Boot 官网: http://www.denx.de/wiki/U-Boot/SourceCode
U-Boot 源码的获取: https://source.denx.de/u-boot/u-boot#
(墙裂不推荐)
2) 去拿demo 板中的uboot源码
uboot.tar.bz2
3) 编译uboot源码
cd porting
cp /mnt/hgfs/proting/env/uboot.tar.bz2 /tftpboot/
tar xf uboot.tar.bz2
cd uboot
make x6818_config @选出和具体的芯片相关的代码 选出和x6818 硬件相关的代码,
参与后续编译
make
验证自行编译生成的ubootpak.bin 是否有效
4) 阅读uboot源码:
从README开始
find ./ type f | wc ---> 发现有4002个文件
开源程序: 1) 编译时如果有警告,忽略
2 ) 从README / INSTALL 入手
uboot 代码结构 (s5p6818相关的):
4.1 找到入口点文件
a. 做反汇编
b.分析链接过程
rm u-boot
make V=1 //显示编译链接的详细过程
arm-cortex_a9-linux-gnueabi-ld.bfd -pie --gc-sections
-Bstatic -Ttext 0x43C00000 -o u-boot -T u-boot.lds
arch/arm/cpu/slsiap/start.o .......
vi u-boot.lds :
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_stext)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
*(.__image_copy_start)
arch/arm/cpu/slsiap/s5p6818/start.o (.text*)
arch/arm/cpu/slsiap/s5p6818/vectors.o (.text*)
*(.text*)
}
所以可以推断:uboot/arch/arm/cpu/slsiap/s5p6818/start.S
就是入口点文件
ctags -R *
rm arch/arm/cpu/slsiap/s5p6818/prototype/prototype
ctags -R *
4.2 u-boot 启动第一个阶段
阅读代码的原则:
1)有设计文档先看文档
2) 关注框架 关注流程 放弃细节
reset:
/*
* set the cpu to SVC32 mode
*/
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr,r0
/* disable watchdog */
ldr r0, =0xC0019000
mov r1, #0
str