menu 简述嵌入式linux系统移植的主要内容有哪些?linux
1> 搭建交叉开发环境面试
2> 移植bootloader编程
3> 移植linux内核服务器
4> 制做根文件系统网络
1、搭建交叉开发环境架构
一、交叉编译工具链的制做(GCC交叉编译器的生成)函数
(1) 下载Binutils、GCC、Glibc源码工具
(2) 配置并编译Binutils取得所需的汇编和连接程序(链接程序ld,汇编程序as,主要为GNU系统提供汇编和链接工具)测试
(3) 配置并编译GCC源码生成GCC编译器。(主要为GNU系统提供C编译器)spa
(4) 配置Glibc并编译生成Glibc的c函数库(一些基本的C函数和其余函数定义)
(5) 再次配置和编译GCC源码,生成其余语言的编译器,如C++编译器(通常是C编译器首先生成,而后以这个为基础,结合生成的Glibc的C函数库,再编译生成其余编译器)
【注】工具链依赖内核版本
二、二进制工具Binutils
ld:
as:
objcopy:objcopy 是用来进行目标格式转换的
objdump:objdump 是用来反汇编的
strings:
strip:strip 是丢弃目标文件的所有或者特定符号,减小文件体积的
addr2line: addr2line 是用来把程序地址转换为文件名和行号的
ar:ar 是用来将目标文件生成静态库的
三、配置主机方必须的软件
(1)tftp服务器
Tftp用来下载远程文件的最简单网络协议,基于UDP协议实现
(2)nfs服务器
主要将本地的一个目录经过网络输出,其余计算机能够远程挂接这个目录并进行访问。
Nfs有本身的协议和端口,但在文件传输或其余相关信息传递的时候,NFS使用远程过程调用协议(RPC),RPC负责管理端口号的对应与服务相关的工做。NFS自己没有传输文件的协议。
2、 U BOOT
2010.08版本以前的Uboot架构比较简单,以后的版本架构变复杂。
(1)bootloader是系统加电或复位时首先运行的一段代码,
(2)做用:对系统的软硬件作相应的初始化,为操做系统的加载运行作好准备。
(3)ARM平台经常使用的bootloader:u-boot、 redboot、 blob 、 vivi
2.描述u-boot启动流程
u-boot启动分为两个阶段:
第一个阶段用汇编实现。设置中断向量表->设置SVC模式、中断和时钟 ->
关闭看门狗、mmu和cache->初始化内存控制器->自搬移->设置堆栈、清空bss段
第二个阶段用C实现。调用一系列初始化函数->初始化Flash设备和环境变量->
初始化网络设备->进入循环
(1). bootloader向内核传参的方式有param_struct、 tag;
(2) u-boot的命令中,设置环境变量的命令是 setenv
(3) u-boot中存放内核启动参数的环境变量是 bootargs
(4)linux要求bootloader在运行内核前,让系统进入 SVC 模式
(5)linux要求bootloader将平台号保存在 r1
5.uboot
uboot倒计时,由自启动脚本决定
bootargs:选择启动方式
交叉调试:gdb_server(交叉编译工具链里有)
CP到nfs挂载的路径下,
3、linux内核移植
一、内核概念
二、功能(linux内核的五大任务)
进程管理、内存管理、文件系统支持、设备管理(驱动)、网络协议
三、组织结构
四、配置内核(内核裁剪:make menuconfig)
(1)顶层Makefile
(2)kconfig(裁剪 菜单选项的来源,添加删除选项)
(3)arch/arm…/mach/…板级信息
(4)arch…/smdkc100.c 板级驱动配置信息
五、编译内核(make zImage)
六、添加驱动
(1)网卡
(2)LED
(3)Nand分区
(4)SD卡
(5)LCD
七、可能考的面试题
配置内核时,保留了什么,裁剪了什么?
项目中前期开发模式是nfs挂载的方式,全部配置了nfs服务,配置了DM9000的驱动,便于tftp下载;项目中主控端用到了zigbee模块,GPRS模块,因此分别配置了USB转串口驱动。项目中没有用到SPI驱动,因此把这部分裁剪了。
【注】make zImage:编译生成内核的可移植镜像
make modules:以M形式控制的部分才能编译
8.linux内核启动流程
(1)Bootloader:
a.硬件上电后跳到一个固定位置执行相应的代码
b.初始化相应的设备
c.加载内核的代码到内存
d.跳到内核代码起始位置执行
(2)Kernel
a.内核自解压
b.初始化静态编译进内核的驱动模块(须要访问rootfs)
c.挂载rootfs(须要访问、运行用户空间的程序)
d.直接执行第一个用户空间程序
(3)第一个用户空间程序
配置用户环境,执行服务进程
9.linux调试内核方法介绍
当console初始化之后,通常最为简单的内核调试方式为: printk
printk支持几种打印级别?
8种(0~7)
十一、内核相关问题:
(1)编译内核镜像命令 make zImage
编译模块的命令 make modules
(2)第一次配置内核时,应使用的缺省内核配置文件是什么?
arch/arm/configs/s5pc100_defconfig
(3)存放平台代码的文件是什么(完整路径)?
arch/arm/mach-s5pc100/mach-smdkc100.c
(4)内核解压后的入口在哪一个文件?
arch/arm/kernel/start.S
4、rootfs的制做
1.概念
存放运行、维护系统所必须的各类工具软件、库文件、脚本、配置文件和其余特殊文件的地方,也能够安装各类软件包。
2.rootfs制做流程
(1)采用bubybox建立基本命令
(2)建立基本的目录/lib /etc /var /tmp /dev /sys /proc等
(3)添加glibc基本动态库
(4)建立基本的设备节点
(5)添加启动配置和脚本程序(通常etc下有此四个文件)/etc/inittab /etc/fstab /etc/init.d/rcS
另外有一个文件profile也能够加,用来存放环境变量。
【inittab:定义了各类action。
如:在用busybox制做根文件系统时,若是要求在程序执行前按enter键进行确认,添加action:askfirst 】
【rcS:init进程调用的第一个脚本
通常都会有 mount -a(挂载全部fstab下的内容)】
(6)测试根文件系统
(7)制做根文件系统镜像,如ramdisk cramfs jffs2......
四、根文件系统特性
(1)内核挂载的第一个文件系统,
(2)根文件系统上存放有内核运行的第一个初始化程序init、命令、设备节点、配置文件以及共享库等等
(3)系统中只能有一个根文件系统
(4)嵌入式linux系统一般用bubybox工具集构建文件系统,以减少系统体积
5.init进程
(1)全部进程的祖宗进程
(2)全部孤儿进程的父进程
六、不一样的文件系统的区别
(1)yaffs二、jffs2 文件系统能够运行在nand flash上,并具备可读写特性
(2)cramfs 文件系统能够运行在nand flash上,并具只读特性
(3)tmpfs 不占用任何磁盘空间的文件系统
ubifs针对大容量磁盘的文件系统。
yaffs,yaffs2的区别:yaffs按小页访问,yaffs2按大页访问。
yaffs文件系统有一个致命的bug,在开机时会扫描整个磁盘,速度慢,耗时。因此适用于小容量的磁盘(兆级如下的)。