【Linux】嵌入式Linux系统的移植(上篇:交叉编译器、连接方式)

姓名:邓皓轩  学号:19020100151  学院:电子工程学院

转自:https://yngzmiao.blog.csdn.net/article/details/90200433

【嵌牛导读】嵌入式Linux系统移植

【嵌牛鼻子】介绍嵌入式Linux系统移植的要点

【嵌牛提问】怎样进行嵌入式Linux系统移植


嵌入式Linux系统移植是进行Linux驱动开发的基础,如果连Linux系统移植都完成不了,那就更不用说驱动开发了。因此,Linux系统移植至关重要。

嵌入式Linux系统的移植要点

搭建交叉开发环境

bootloader的选择与移植

kernel的设置、编译、移植和调试

根文件系统的制作

嵌入式Linux系统的移植基本步骤

安装交叉编译器

确定目标机、主机的连接方式

搭建主机-目标机数据传输通道

编译三大子系统(bootloader子系统、内核核心子系统、文件系统子系统)

烧写测试

一般而言,目标机、主机的连接方式有:

UART异步串行通信接口(速率低、实用性强)

USB串行通信接口(速率快、驱动要移植修改)

TCP/IP网络通信接口(速率快、驱动要移植)

Debug Jtag调试接口(方便快捷、价格昂贵)

相比较来说,UART、USB、TCP/IP连接方式的选择较多。

一般而言,交叉编译器可以选择芯片公司提供的已经编译好的工具链,通常前缀名有:

arm-none-linux-gnueabi- (简称为:arm-linux-)

arm-none-eabi- (不针对linux操作系统)

arm-elf- (不针对linux操作系统)

当然,也可以选择自己构建新的交叉编译器。

注意注意:在【嵌入式Linux的移植】博文中,并不涉及制作交叉编译器、编译U-Boot、编译内核、编译根文件系统的内容,而是将已经制作/编译完成的成品进行试验并测试。至于它们的制作过程,会在后面的博文中讲解。

交叉编译器

为什么要有交叉编译?

一般情况下,需要在开发主机上(通常是PC机)开发出能够在目标机(通常是开发板)上运行的程序。

为什么需要交叉开发环境?主要原因有以下两点:

目标机的硬件资源有很多限制,比如cpu主频相对较低,内存容量较小等,想想让几百MHZ主频的目标机去编译一个Linux kernel会让我们等的不耐烦,相对来说,主机的速度更快,硬件资源更加丰富,因此利用主机进行开发会提高开发效率;

目标机的MCU体系结构和指令集与主机不同,因此需要安装交叉编译工具进行编译,这样编译的目标程序才能够在目标机上运行。

安装交叉编译器

本文使用的是友善之臂提供的arm-linux-gcc-4.5.1-v6-vfp-20120301版交叉编译工具:

sudo tar -zxvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz -C /

这样arm-linux-的相关文件就解压到了根目录下的opt目录中。

解压完成了,如何来使用呢?

使用简单方法:

arm-linux-gcc hello.c -o build

使用绝对路径方法:

/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc hello.c -o build

使用简单方法需要在环境变量的PATH中添加路径,这样的话,有一个弊端,最好保证整个系统只有一个交叉编译器,不然会存在PATH的优先级等问题。

怎么在环境变量的PATH中添加路径?

sudo vi /etc/environment

在该文件中添加路径/opt/FriendlyARM/toolschain/4.5.1/bin,各个路径之间以:分隔。添加完成后,需要更新一下,使环境变量生效

source /etc/environment

可以通过以下命令查看是否添加成功:

echo $PATH

需要注意的是:

如果在64位Linux安装arm-linux-gcc-4.5.1交叉编译器,要先安装32位的库(arm-linux-gcc-4.5.1-v6-vfp-20120301是在32位的Linux下编译的)。

安装32位的库:

sudo apt-get install libc6:i386

sudo apt-get install lib32z1

本部分内容,可以参考博文安装arm-linux-gcc交叉编译器

工具集介绍

readelf

顾名思义,就是读取ELF头信息的工具。ELF(Executable and Linkable Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。

ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容,而且他们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。例如:

gcc hello.c -o hello

readelf -h hello

不添加arm-linux-前缀,就表示在x86上进行编译和查取ELF头信息。结果为:

ELF 头:

  Magic:  7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00

  Class:                            ELF64

  Data:                              2's complement, little endian

  Version:                          1 (current)

  OS/ABI:                            UNIX - System V

  ABI Version:                      0

  Type:                              EXEC (Executable file)

  Machine:                          Advanced Micro Devices X86-64

  Version:                          0x1

  入口点地址:              0x400750

  程序头地址:                        64 (bytes into file)

  Start of section headers:          65016 (bytes into file)

  标志:                          0x0

  本头的大小:                        64 (bytes)

  程序头大小:                        56 (bytes)

  Number of program headers:        9

  节头大小:          64 (bytes)

  节头数量:        37

  字符串表索引节头: 34

需要注意的是,运行一个程序首先进入入口点地址,然后再各种调用,最终进入main地址,运行main函数的内容。

可通过file命令查看文件属性

file hello

在运行结果中,最开始是ELF头,第二个是编译后可运行的平台。实际上,运行平台在ELF中的Machine字段中也标明出来了。如果通过arm-linux-gcc进行编译,那么ELF头和file命令中的结果,都会显示为ARM。

本部分内容,可以参考博文ELF格式文件详细分析

其他工具集

size:查看编译后的文件各个段(text段、data段、bss段、dec段等)的大小信息

nm:查看符号信息(说白了就是一些函数和全局变量等,比如main地址,_start入口点地址等)

strip:删除符号表信息(减小文件的大小)

objcopy:将目标文件的一部分或者全部内容拷贝到另外一个目标文件中(用于将ELF头去掉,因为ARM裸机是不识别ELF头信息的)

objdump:反汇编(添加-d选项)

目标机、主机的连接方式

一般而言,目标机和主机之间采用TCP/IP网络通信的方式居多,常用的服务主要两个:TFTP服务、NFS服务。

TFTP服务

TFTP服务主要用于实现文件的下载,比如开发调试的过程中,主要用tftp把要测试的bootloader、kernel和文件系统直接下载到内存中运行,而不需要预先烧录到Flash芯片中。

一方面,在测试的过程中,往往需要频繁的下载,如果每次把这些要测试的文件都烧录到Flash中然后再运行也可以,但是缺点是:过程比较麻烦,而且Flash的擦写次数是由限的;另外一方面:测试的目的就是把这些目标文件加载到内存中直接运行就可以了,而tftp就刚好能够实现这样的功能,因此,更没有必要把这些文件都烧录到Flash中去。

nfs服务:

NFS服务主要用于实现网络文件的挂载,实际上是实现网络文件的共享。

在开发的过程中,通常在系统移植的最后一步会制作文件系统,那么这是可以把制作好的文件系统放置在我们开发主机PC的相应位置,开发板通过nfs服务进行挂载,从而测试我们制作的文件系统是否正确,在整个过程中并不需要把文件系统烧录到Flash中去,而且挂载是自动进行挂载的,bootload启动后,kernel运行起来后会根据我们设置的启动参数进行自动挂载,因此,对于开发测试来讲,这种方式非常的方便,能够提高开发效率。

一般而言,U-Boot采用USB线或者SD卡烧写到Flash中,而内核、根文件系统都采用TFTP的方式传输到目标板,然后通过U-Boot的命令进行启动。

搭建主机-目标机数据传输通道

以笔记本为例,整个搭建示意图:


首先笔记本有两个网卡,分别为WiFi网卡和有线网卡。虚拟机同样也配置成双网卡模式,一个通过NAT模式与WiFi网卡相连,连接无线路由器的LAN口,再通过WAN口进行上网功能;另一个通过桥接模式与有线网卡相连,最终连接到目标板进行数据传输功能。

桥接模式

在这种模式下,使用VMnet0虚拟交换机,虚拟机就像是局域网中的一台独立的主机,与宿主计算机一样,它可以访问网内任何一台机器。

在桥接模式下,可以手工配置它的TCP/IP配置信息(IP、子网掩码等,而且还要和宿主机器处于同一网段),以实现通过局域网的网关或路由器访问互联网;还可以将IP地址和DNS设置成“自动获取”。

在桥接模式中,使用VMnet0虚拟交换机,此时虚拟机相当与网络上的一台独立计算机与主机一样,拥有一个独立的IP地址。

NAT模式

使用NAT模式,就是让虚拟机借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式可以实现在虚拟系统里访问互联网。

NAT模式下的虚拟机的TCP/IP配置信息是由VMnet8虚拟网络的DHCP服务器提供的,因此IP和DNS一般设置为“自动获取”,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯。

采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。

也就是说,桥接模式是为了加入主机的局域网,完成与主机之间的数据访问;NAT模式是为了通过主机,访问互联网。两者的目的不同!

不太理解的,可以参考链接:VMware中三种网络连接的区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容