1.系统移植——基础知识
2016-06-20 10:39
253 查看
系统移植:脚本、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进制
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进制
相关文章推荐
- 计算100以内所有正整数之和
- idea
- mac系统知识小结
- CentOS6.5使用yum命令方便快捷安装Nginx
- IO流下载文件,支持中文
- Docker CLI命令小结
- 租房应该注意什么?
- 封装原生javascript连缀
- 封装原生javascript连缀
- 封装原生javascript连缀
- 封装原生javascript连缀
- 封装原生javascript连缀
- 封装原生javascript连缀
- 封装原生javascript连缀
- 封装原生javascript连缀
- 封装原生javascript连缀
- FrameLayout——帧布局 翻译自developer.android.com sdk
- 封装原生javascript连缀
- 封装原生javascript连缀
- 封装原生javascript连缀