linux系统移植开发板三个大流程

第一部分  uboot模式下的烧写命令(开发板)

1.Ubuntu模式防火墙关闭指令:/etc/init.d/iptables  stop

setenforce 0

2.在uboot模式下,查看所有uboot命令为  help 或者  ?

设置环境变量的几个命令:

打印环境变量:printenv 或者print 打印所有环境变量

printenv  xxx(环境变量名) 查看具体环境变量

设置环境变量值:setenv xxx(环境变量名) yyy(环境变量值)

当环境变量名不存在就创造并赋值,存在就将其值更改,当后面的值为空时,将环境变量删除

保存环境变量值:saveenv  将内存的值写入flash中,永久保存相当于 Linux中的sync命令。

3.tftp是开发板uboot支持的命令,相当于预设的客户端,只要配置好服务器的tftp并且设置开发板的环境变量ethaddr(开发板mac地址) ipaddr(开发板IP地址) serverip(服务器IP地址)就可以使用tftp命令(在uboot和正常模式下都能使用tftp,不过配置和使用的方式不一样) 在uboot的使用格式为 tftp  555555(获取到本地的内存地址)  xxxx(服务器ip):yyy(文件名)

tftp在正常模式下配置环境变量与使用:

开发板配置:vi /etc/init.d/rcS

#TL-WN321G+                                        

ifconfig lo 127.0.0.1                              

ifconfig eth0 down                                 

ifconfig hw ether 00:25:11:62:68:XX             

ifconfig eth0 192.168.15.1XX netmask 255.255.255.0 up

route add default gw 192.168.15.1

服务器Ubuntu的搭建:(pc端)

安装:sudo apt-get install tftp-hpa tftpd-hpa

配置:sudo gedit /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"

TFTP_DIRECTORY="xxx(共享目录:绝对路径)"

TFTP_ADDRESS="0.0.0.0:69"

TFTP_OPTIONS="-l -c -s"

开启:①sudo service  tftpd-hpa restart //开启tftp服务

②确保虚拟机和开发板网络互通

使用:tftp -g -r hello_arm  192.168.15.3

把hello_arm从远程主机192.168.15.3下载到开发板中

-g:get获取

-r:远程获取

hello_arm:你要获取文件

192.168.15.3 :从哪里获取

tftp  -p -l libcall.so 192.168.15.3

把本地的文件 libcall.so上传到192.168.15.3的机器上的共享目录下 -p 上传 -l 本地

4.在uboot模式下,可以使用bootm执行固定格式的二进制文件(由工具mkimage在已生成文件上加载特殊格式文件头)  

执行命令为 bootm  {addr}(内存地址) {arg}(参数)

5.内存查看与更改命令  md与mm  执行格式

md[.b .w .l] {addr}  md.d   0x400000  以一个字节一个字节间隔显 示内存0x400000的内容

Mm[.b .w .l]  {addr}    命令输入后在打印后面写入你要修改的值回 车 当你不想在修改了 空格加回车

6.uboot模式下flash擦除,读取与烧写。

nand erase  {flash_addr}(擦除的起始地址) {lenth}(擦除的长度)

nand erase 600000 500000  从flash中600000擦除50000个字节

 

nand write {内存地址} {flash地址} {长度lenth}

将内存地址中长度lenth的数据写入到flash地址中去

nand write 40000000 600000 500000

 

nand read {内存地址} {flash地址} {长度lenth}

将flash地址中长度lenth的数据读出来到内存地址中去

 

第二部分 Linux内核

内核下载地址:www.kernel.org  Linux内核官网包含所有内核版本

1.内核组成:分为内核空间和用户空间:

内核空间:系统API函数接口,体系结构设置和代码

用户空间:APP应用,用户配置文件

划分原因:在CPU中有七个工作模式,每一种模式访问的寄存器 不同,将操作系统运行在更高级别的模式中保护起 来,防止APP应用来干扰操作系统造成当机

两种空间的交互:系统调用和硬件中断

2.内核空间:由七个子系统构成:

SCI:系统调用函数接口   VFC:虚拟文件系统

PM:进程管理系统 NS:网络协议栈

MM:内存管理系统 DD:设备驱动

ARCH:体系结构相关代码(狭义内核与CPU相关,系统移植需要修改的部分)

3.内核配置:内核配置命令:在内核文件最顶层使用

make menuconfig(菜单栏形式)

make config(交互式询问式)

内核配置说明:* 表示编译加载到内核镜像中加载呆内存 中去执行

M表示编译成动态模块,但是不直接挂在内 核中运行,将编译好的模块文件放到相 应的文件夹保存在硬盘中,有需要的时 候挂载进来。

空 表示不编译,放弃这个功能。

 

内核配置原因:

网上下载的内核文件包含了很多功能和不同系统架构,进行菜单栏式模块选定的作用是对内核文件进行相应的宏设置,编译裁剪出适合当前工作需要的功能生成相应的二进制文件。减少内核二进制文件的大小

内核配置原则:使用已经配置好的配置文件  不清楚的保持默认

配置内核的方法:

①获取已经好的配置文件:看配置需求,可以获取项目组他人设置好配置文件config,也可以拷贝已有的再细微修改,Linux系统下/boot/config(可能全名不是这个)到你需要编译的内核顶层目录下,ARM平台的内核配置文件在 /arch/arm/configs

②加载配置文件:执行 make menuconfig  ,将光标移动到末尾, 进入加载一个配置文件选项,将需要的配置文件名以./配置文件 名 的形式输入。

4.内核的编译:编译分三步:内核镜像的编译(选择为*),内核模块的编译(选 择为M),以及内核模块的打包

(1)内核镜像(x86平台):make zImage  V=1(内核镜像小于512k, 新一点版本不支持)

make bzImage V=1

命令在顶层使用

生成的镜像文件在arch/<cpu>(CPU型 号)/boot/下

内核模块编译:make modules 命令在顶层使用,编译好的模块 是散落在/drivers文件下

内核模块的打包:移动内核模块:make modules_install 命令 在顶层执行,执行命令后,模块集中到 /lib/modules目录下,生成一个新目录,目 录名与内核版本一致

打包:mkinitrd initrd-version version

(生成文件名)(源文件夹)

   源文件的路径 mkinitrd会自动到 /lib/modules下得到,生成的文件在当前路 径,命令的执行路径没关系

5.内核的安装:拷贝内核与驱动模块包去相应的目录:(安装x86的内核)

cp arch/x86(CPU类型)/boot/bzImage(编译好的内核版本)

/boot/vmlinuz-$version(内核版本号)

        cp  initrd-$version(版本号)(打包好的内核模块包)  /boot/

修改 /etc/grub.conf  (uboot启动时,需要加载的内核相关信息) 修改内核版本信息,修改内核路径(vmlinuz-$version),和内核驱动模块包名字(initrd-$version)

 

6.ARM平台内核编译:

清除所有配置和中间文件:make distclean

配置内核:make menuconfig (ARCH=arm) 拷贝一份已好的配置文件去工 程目录

编译内核:make uImage ARCH=arm CROSS_COMPILE=arm-linux-

编译过程会出错:原因:uboot识别具有特殊的文件头的文件,所以编译过程中需要将编译出来的文件加上文件头,而这个文件头的加载工具为mkimage

解决方法:将mkimage工具拷贝到 /bin/ 重新编译

安装:将其TFTP到内存后,可以选择 bootm 执行(如果未写入文件系统到内存里面,则在最后会报错),也可以选择烧写入flash中。

 

第三部分:根文件系统的制作与挂载

一.制作文件系统(符合将要移植的平台)

  1. 创建文件树:创建一个文件夹,在文件下,分别创建与平台对应的子目录,可以参考已经建立好的文件系统的根目录下子目录的种类,到时候将创建的顶层文件目录当做根目录;
  2. 创建设备文件:设备文件-在Linux下,一切外部设备都是以文件的形式被管理的,而这个管理目录就是/dev目录。先创建两个必须的设备文件console  null ,命令为  cd /dev;mknod -m 666 console c 5 1 ;mknod -m 666 null c 1 3;这个根目录是指被创建的目录的顶层目录。
  3. 准备配置文件:配置文件与体系结构无关,所以可以直接拷贝已有的配置文件去相关目录就好,将配置文件全部拷贝到被制作的“根目录”中/etc目录中去。使用cp命令时,需要使用 -rf 递归拷贝。
  4. 添加内核模块(arm平台不需要打包):进入内核编译文件夹中编译对应平台的内核模块,然后移动编译好的的内核模块去将要生成的文件系统的相应目录 命令

cp  xxx/linux; make modules ARCH=arm CROSS_COMPILE=arm-linux-;

make modules_install ARCH=arm INSTALL_MOD_PATH=/(将要制作成的根目录),命令会自动将编译好的散落驱动模块集中到将要生成的根目录系统/lib/modules中。

5.安装busybox:Linux命令和小工具。先拷贝源码,然后make menuconfig配置相应参数:busybox Settings->build Option->XXX static binary(静态链接), cross compiler prefix(交叉编译链前缀)填写arm-linux-

Installation options->选中”dont use/usr”防止生成在Linux系统目录中,破坏宿主机

Busybox installation prefix(/xxxx/xxx/需要制作的文件系统的根目录)  busybox最后需要安装到那个新文件系统的根目录的bin目录中。

编译,安装:

直接 make 编译,然后make install (拷贝移植的过程)拷贝新文件系统的/bin中去

二.挂载文件系统(以不同文件系统格式挂载)

1.制作busybox的软连接:切换到制作的的文件系统根目录中,执行 ln -s ./bin/busybox init 被制作成软连接的是新文件系统中的busybox

 

2.1(Initramfs文件系统)配置内核:

切换到内核源码目录,执行 make menuconfig ARCH=arm选中将要挂载的文件格式,然后将制作好的文件系统根目录路径输入

选中 general setup->initial ram filesystem xxx(initramfs/xxx) suppor

在后面那一项 Initramfs sourse file输入制作的新文件系统根目录的路径

2.2(NFS网络文件系统)配置内核

作用:开发板通过网络访问服务器上的文件系统,那么当服务器上文件系统更改了目录以后,开发板上的目录也会进行改变,可以不用总是编译烧写内核。

切换到内核源码目录,执行 make menuconfig ARCH=arm

取消掉general setup中其他的文件系统格式(如上面选中的文件系统格式)

在最外层目录中进入file systems中选中network file systems 然后进入选中root file systems on nfs

设置文件系统的根目录的路径:在后面的uboot的环境变量中进行设置

 

3.重新编译内核:文件系统和内核关系为:①内核可以不配置内核中文件系统相关参数,单独编译烧写内核,但是将烧写的内核写入内存进行启动会出错,因为无法加载文件系统,烧写入flash覆盖原来的内核没有关系,因为flash中有文件系统。②内核配置文件系统相关参数,文件系统是被压缩在内核后面的,uimage分为内核和文件系统两个部分,在移植内核的时候,文件系统也会被移植过去,在系统启动的时候,文件系统会被解压到内存中去。③当然内核和文件系统都可以单独烧写入flash中去。上面介绍的是第二种。

重新编译内核:make uImage ARCH=arm CROSS_COMPILE=arm-linux-

4.1配置uboot的环境变量:(Initramfs文件系统)

setenv bootargs nointrd console=ttySACO.115200

下载编译好的内核uImage到内存或者flash中去

4.2配置uboot的环境变量:(NFS网络文件系统)

setenv bootargs(uboot通过这个参数来告诉内核需要启动文件系统的方式) noinitrd console=ttySAC0(打印从串口0打印),115200(波特率) init=/init

root=/dev/nfs(将虚拟文件文件系统的nfs作为文件系统) rw(可读可写)

nfsroot=192.168.1.3:/home/S5-driver/lesson9/rootfs,proto=tcp,nfsvers=3(设置实际的文件系统在服务器上的位置)

ip=192.168.1.6:192.168.1.3:192.168.1.1:25

5.255.255.0::eth0(哪一个网卡):off(关闭动态IP)

 

猜你喜欢

转载自blog.csdn.net/qq_43706825/article/details/103701802