ARM Porting

本文详细介绍了ARM平台上的软件移植过程,包括定义移植、移植内容及其目标。重点讲解了开发板的烧写实验,如何编写UC程序并在开发板上执行。同时,探讨了Uboot的基本概念、源码获取,以及Linux内核和根文件系统的移植步骤。
摘要由CSDN通过智能技术生成

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   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘德华海淀分华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值