1.系统移植——基础知识

来源:互联网 发布:javascript用户名验证 编辑:程序博客网 时间:2024/06/06 14:01

系统移植:脚本、Makefile、C语言、汇编、Kconfig(make menuconfig)、dt(设备树)


SOC(CPU,IROM,IRAM,控制器)

FS4412(SOC,外设)


嵌入式系统:

应用层:

软件、库(函数源码、API)

内核:(从上到下)

系统调用(系统调用下面再是内核)

进程管理 设备管理 内存管理 文件系统 网络协议 中断(软中断) 

驱动(与硬件通信的接口)

虚拟总线

硬件:

字符设备 块设备 网络设备





交叉编译:

1.

编译主机运行主机

X86X86使用普通的编译器编译

X86ARM使用交叉编译器编译( 使用:arm-none-linux-gnueeabi-gcc )


2.编译过程:

预处理:gcc -E 1.c -o 1.i 或者 cpp 1.c -o 1.i

编译:gcc -S 1.i -o 1.s或者 cc1 1.i -o 1.s

汇编:gcc -c 1.s -o 1.o 或者 as 1.s -o 1.o

链接:gcc 1.o 或者 ld -m elf_i386 ......

nm + 二进制文件   作用是显示符号(符号的作用是给连接器使用来索引相应的地址空间 )

大写代表全局,小写代表局部

B:初始化为0的BSS段

C:没有初始化的BSS段

D:.data段(数据段)

R:.rodata段

T:.text段

U:当前文件未定义,在其他文件定义的

W:弱标号


void func() _attribute_ ((weak)); 将符号func变成弱标号,变成弱标号之后链接器不会索引符号func的内容


readelf -h a.out 显示的是elf格式的文件头信息存放在虚拟内存的0编号地址处


readelf -s a.out  显示的是每个可执行文件使用到的分段信息


虚拟内存的空间分布:elf格式头 各种分段

file a.out 显示文件格式、文件类型(可执行文件、动态库、可重定位文件)、CPU体系架构、是否瘦身


strip:可执行文件瘦身,删除符号名,进行文件的瘦身,但是不能对中间的文件进行瘦身


反汇编二进制文件:

objdump -d 二进制文件 > 1.dis 反汇编出来的内容包含当前程序用到的分段信息

objdump -D 二进制文件 > 1.dis 所有分段信息都会被反汇编


反汇编.bin文件

arm-none-linux-gnueabi-objdump -D -b binary -m arm .bin源文件 > 1,dis(-b指定文件为二进制文件)


objcopy -o binary 可执行文件 .bin文件  将一格可执行文件转化为.bin文件


addr2line 将地址转换为行号


系统移植就是相当于是一个装系统的过程

PC: BIOS操作系统镜像安装驱动装软件

开发板:引导程序(bios) linux内核 写驱动   安装第三方源码


no_root_squash 如果不是root权限就会被排挤,所以用root

root_squash 是root会被排挤,不用root


重启服务命令:(一下两天命令都不是万能的,对于不同的系统都不一样,哪个好用就用哪条)

sudo /etc/init.d/服务名字 restart

sudo service 服务名字 restart


引导程序:bootloader统称

uboot是bootloader的一种


所有的bootloader特点:

由汇编(初始化硬件,给后续的c语言创建堆栈)和C(提高开发效率,提高可读性)混合开发


我们使用的是u-boot缺点:依赖体系。不兼容,通常情况下u-boot适用于嵌入式设备


u-boot包含两种模式:

自启动模式(相当于直接进入到windows桌面)

交互模式(相当于进入到BIOS页面)


u-boot命令:

printenv 显示u-boot交互模式下的环境信息


设置环境信息

setenv + 环境变量名  删除环境变量


setenv serverip 192.168.3.200 设置服务器的ip地址注意:在serverip和ip之间不能出现=


saveenv 保存环境信息 


ipaddr 是开发板的ip地址


tftp 41000000 uImage 从Ubuntu的tftpboot目录下下载uImage文件到开发板的41000000内存地址中

tftp 42000000 exynos4412-fs4412.dtb设备树的二进制文件


bootcmd自启动命令当u-boot自启动时要执行bootcmd后面的命令

setenv bootcmd tftp 41000000 uImage\;tftp 42000000exynos4412-fs4412.dtb...... 

注意:在bootcmd中不能直接使用分号作为分隔符


bootm 内核镜像的内存地址 文件系统镜像地址 设备树镜像地址 

注意:这三个地址的顺序是固定的,如果某个地址不需要则必须使用-代替,在-的左右必须有空格

bootm的作用是让u-boot跳转到内存的指定地址处去读取内容,并且还会给内核传递参数


setenv bootargs root=/dev/nfs nfsroot=ubuntu的ip:/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=开发板地址


uboot(存放启动文件),rootfs(存放文件系统),kernel(存放内核),dtb(存放设备树文件)


eMMC启动,nandflash启动,norflash启动


movi read  kernel(emmc分区名字) 41000000   

读取emmc中的kernel分区内容存放到内存41000000地址中

movi write  kernel 41000000   

从内存的41000000地址处读取内容写入到emmc的kernel分区中


movi read rootfs 41000000 300000 

从emmc的rootfs分区中读取内容存放到41000000内存地址处,规定好大小最多为300000字节

注意:41000000 300000(3M) 都是16进制


0 0
原创粉丝点击