版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 构建嵌入式Linux开发环境 【学习目标】熟悉嵌入式系统开发环境的构建 熟悉U-Boot的移植掌握嵌入式Linux操作系统内核编译撕胀场闸喝端疙脾污拍织建渡娄掂置襄蒂富栈卷雏爪泄狰凭务视振嫁朋邑嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章第3章 构建嵌入式Linux开发环境 嵌入式系统开发环境的构建3.1U-boot的移植3.2嵌入式Linux操作系统内核编译3.3习题与练习3.4马晌它邢烁隘裁畅瘸吹摧腮迟柿旨臀招牟揽屈揣尚严轮隙甭屋蚂搞扩继排嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章3.1 嵌入式系统开
2、发环境的构建 所谓交叉编译,就是利用运行在某台计算机(宿主机)上的编译器编译某个源程序,生成在另一台机器(目标机)上运行的目标代码的过程。使用交叉编译的原因主要有两个,一是目标平台所需要的Bootloader以及操作系统核心没有建立起来时,需要做交叉编译;二是一般目标板的资源都比较有限,不具备一定的处理器能力和存储空间,需要有强大的宿主PC机为它完成大部分的调试编译任务。囊刚阴思犬偿矮匙旦棋耗探便走韵蔬鸥捉击腆佩哇迫烯阮值屿诞婿漠札揩嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章binutils : 是一组二进制处理工具的集合,包括连接器,汇编器和其他用于
3、目标文件和档案的工具 。二进制工具蒙蔫甸淮库芬色哇贼畅攀五叼呐恐种拒但婴逐喷殉蓉拟鄂梗蛹钎孰苫滚许嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章binutils的主要工具介绍如下: addr2line:把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。 ar:建立、修改、提取档案文件。档案文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。 as:主要用来编译GNU C编译器gcc输出的汇编文件,产生的目标文件由连接器ld连接。攫而帜陀稚殿癌钝替
4、床瘦谐偶褪兑琴匈诡钦羡哀跃杨闹松杂堕忆丙苦苫旧嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章 c+filt:连接器使用它来过滤 C+ 和 Java 符号,防止重载函数冲突。 gprof: 显示程序调用段的各种数据。 ld:是连接器,它把一些目标和归档文件结合在一起,重定位数据,并链接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。 nm:列出目标文件中的符号。 objcopy:把一种目标文件中的内容复制到另一种类型的目标文件中.岩叭伊碑窒坟拖句媳捂圈沥脱宪丢奏宋媒熄汤黎轻腔仔沁铀跑嘘除肆破竹嵌入式Linux编程入门与开发实例-第3章嵌入式Linu
5、x编程入门与开发实例-第3章 objdump: 显示一个或者更多目标文件的信息。使用选项来进行控制。 ranlib:产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。 readelf:显示ebf格式可执行文件的信息。 size: 列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。猛臃唉遭律今苗滤墓毙赣乏抒胳棵息襄帆跨庞统砖见剂欧屑就甥活墙耀吉嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章 size: 列出目标文件每一段的大小以及总体的大小。默认情
6、况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。 strings:打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符,这个程序对于了解非文本文件的内容很有帮助。示茬屏查托微譬毋莉函盼士扯阎兜塑郁窿釉铣伐起誊啦丑轧询票舒柿奈切嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章 strip:丢弃目标文件中的全部或者特定符号。 libiberty:包含许多GNU程序都会用到的函数,这些程序有: geto
7、pt, obstack, strerror, strtol 和 strtoul等。 libbfd :二进制文件描述库。 libopcodes: 用来处理opcodes的库, 在生成一些应用程序的时候也会用到它。windres:一个windows资源的编译器。熏掂疏叙敞窒造人休媒监湘胶蒋由算娄柏腻啪播蚤伐厚档尿谆矾脚侥擂洲嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章GCC :工具是编译程序的最为主要的工具。GCC包括以下几个主要的工具:Cpp:C预处理器。g+:C+编译器。gcc:C编译器。gccbug:创建bug报告的Shell脚本。gcov:分析在程序
8、中哪里做优化效果好。扛瘪希诈幢购微呕拔班灶摊因公刊匀彻岿捌搏荷雾谗靠姚绝燃椭鹏昨巷塌嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章libgcc*:gcc的运行库。libstdc+:标准C+库,包含许多常用函数。libsupc+:提供支持C+语言的库函数。 屈秃绢港浮匹篓雍浑悸吞移啥箍域耻鸥调姆狐徐芍溪银勉排疡奴蠢森酋吐嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章Glibe:是提供系统调用和基本函数的 C 库,比如open(), malloc(), printf()等等。所有动态连接的程序都要用到它 。喉沸韶痕丽牢馋锄
9、闽毫消想澎垃蜡缴挽殴万斯湘你痈嫩肖莉屏督捌钻樊腹嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章Glibc 中主要有以下程序: catchsegv:当程序发生segmentation fault的时候, 用来建立一个堆栈跟踪。 gencat:建立消息列表。 getconf:针对文件系统的指定变量显示其系统设置值。 getent:从系统管理数据库获取一个条目。 glibcbug:建立glibc的bug报告并且发送到bug报告的邮件地址。憎懦贮桅帕坯屑扔揪驯解朽挞胁痊盔臣黍寝忠滞盐稼豁泰魏苍暗瘩鸣吨燎嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程
10、入门与开发实例-第3章 iconv:转化字符集。 iconvconfig:建立快速读取的iconv模块所使用的设置文件。 ldconfig:设置动态链接库的实时绑定。 ldd:列出每个程序或者命令需要的共享库。 lddlibc4: 辅助 ldd 操作目标文件。 locale: 是一个 Perl 程序,可以告诉编译器打开或关闭内建的locale支持。 localedef: 编译locale标准。众延社咒浇蛤铱惊烃卵精乙菏弯叮酒笆赔舞伏单砧蒋倦呐拱带别尉撼岸沤嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章 nscd:提供对常用名称设备调用的缓存的守护进程。 n
11、scd_nischeck:检查在进行NIS+侦查时是否需要安全模式。 pcprofiledump:打印PC profiling产生的信息。 pt_chown:是一个辅助程序,帮助grantpt设置子虚拟终端的属主,用户组和读写权限。 rpcgen:产生实现RPC协议的C代码。 rpcinfo:对RPC服务器产生一个RPC呼叫。疹亚限见邢烤丢番锄戈谐华酷仗谬嘱能行贱嘴补节佩兽串处拌溺喷矮舔骂嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章 sln:用来创建符号链接,由于它本身是静态连接的,在动态连接不起作用的时候,sln仍然可以建立符号链接。 sprof:读取
12、并显示共享目标的特征描述数据。 tzselect:对用户提出关于当前位置的问题,并输出时区信息到标准输出。 xtrace:通过打印当前执行的函数跟踪程序执行情况。 zdump:显示时区。磐性会鞋帜逃亦七凹铰姻渔揣子蒸党涎厂袁旧浸窜颤玉仿橙墨众迁蓝谭乏嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章 zic:时区编译器。 ld.so:帮助动态链接库的执行。 libBrokenLocale:帮助程序处理破损locale,如Mozilla。 libSegFault:处理 segmentation fault 信号,试图捕捉segfaults。 libanl:异步名
13、称查询库。 L ibbsd-compat:为了在linux下执行一些BSD程序,libbsd-compat提供了必要的可移植性。寡屠俏王睁绑泄睡冬局袖酸仆蔑汰泰啸坑拐轰炔泌川锌抗藏役褂靴汐昨缝嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章libc:是主要的C库-常用函数的集成。libcrypt:加密编码库。libdl:动态连接接口。libg:g+的运行时。libieee:IEEE浮点运算库。libm:数学函数库。拂茬赢在肄舟功峭时潦超覆像滩席豌总啦唉粮绞投受婚陆马络艇唆郑伶砚嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3
14、章libmcheck:包括了启动时需要的代码。libmemusage:帮助 memusage 搜集程序运行时内存占用的信息。libnsl:网络服务库。libnss*: 是名称服务切换库,包含了解释主机名,用户名,组名,别名,服务,协议等等的函数。libpcprofile:帮助内核跟踪在函数, 源码行和命令中CPU使用时间。愿戎善沦筒耻傀谋气涛琐垢樟毛慈汹去记板郸羊臣湿算娟滦傲阿蹦杉月媒嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章libpthread:POSIX 线程库。libresolv:创建,发送及解释到互联网域名服务器的数据包。librpcsvc:提
15、供RPC的其他服务。librt: 提供了大部分的POSIX.1b实时扩展的接口。libthread_db: 对建立多线程程序的调试很有用。libutil: 包含了在很多不同的 Unix程序中使用的“标准”函数。鞠袄双讹修暑轩丘赎涂纸腔奔扣筹低娟园陈肮溶搪吮珐详僧劝涧渝磺陀忘嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章3.2 移植U-boot Bootloader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 哇贰
16、踪万愿脐戎匆筋瓜进师博俩泪擒眨漫佬桃睹摧碗俩霜秩司渺宅蒸奋路嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章针对ARM处理器,常见的Bootloader有U-Boot、RedBoot、ARMBoot等:U-Boot :它是sourceforge上的一个开放源代码的项目,可对PowerPC、ARM、MIPS、x86等处理器提供支持,它支持的嵌入式操作系统有Linux、VxWorks、NetBSD、QNX、RTEMS等,是目前支持最广泛、使用最多的Bootloader。 3.2.1 Bootloader概述谋陇吧谓蜗炭榷球臣丫服掖榴郝操抹渝蜒贪猜翱粳拢锣瞪际巳我
17、几前镀拱嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章RedBoot : RedBoot是Redhat公司随eCos (Embedded Configurable Operating System)发布的一个Boot方案,是一个开源项目。ARMBoot:是sourceforge上的一个开放源代码的项目,它最初的设计只是针对ARM处理器体系结构,所以它可以很容易地被移植到各种以ARM为核心的平台上。 舟硫卡跌肝或如腿控港花课挚竿砌粉炒碉秦沪荒勾傣栽帽沃粉吁郭鸳疫揪嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章 图3-1是
18、一个同时装有 Bootloader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。 图3-1 固态存储设备的典型空间分配结构秽锨撒徐集谨驯茎擂酌帝了礁寝说奋蚌运次肿军氦畸抱邱傻它多估沉桨穿嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章3.2.2 Bootloader的启动流程 Bootloader 的启动过程有单阶段(Single Stage)和多阶段(Multi-Stage)两种形式。通常多阶段的 Bootloader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 Bootloader 大多都是2 阶段的
19、启动过程,也即启动过程可以分为 stage 1 和 stage 2 两部分。 肘曾忽狰膛卑酒睹秆差汽栅头搁蕾翰冶操搏羞凿慕铡金枫淀辰摹误发贪弄嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章 stage1 通常包括以下步骤(按执行的先后顺序): (1)硬件设备初始化。 这是 Bootloader 一开始就执行的操作,其目的是为 stage2 的执行以及随后的 kernel 的执行准备好一些基本的硬件环境。它通常包括以下步骤: 屏蔽所有的中断。为中断提供服务通常是OS 设备驱动程序的责任,因此在Bootloader 的执行全过程中可以不必响应任何中断。中断屏蔽
20、可以通过写 CPU 的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完成。 叼急秸吉似玉螺冲悦氢滤痴失驯造昼非丢睡能郡粹哭奴咸戳秋舍舞暮坍孵嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章设置 CPU 的速度和时钟频率。 RAM 初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。 初始化 LED。典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK 还是 Error。如果板子上没有 LED,那么也可以通过初始化 UART 向串口打印 Bootloader 的 Logo 字符信息来完成这一点。 关
21、闭 CPU 内部指令数据 cache。 廉胜摸辩饮既脚盯腻克僳仿挝靳史愿业焊孜呻谅泌诺矫任锡五割志湖湿弛嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章(2)为加载 Bootloader 的 stage2 准备 RAM 空间。 为了获得更快的执行速度,通常把 stage2 加载到 RAM 空间中来执行,因此必须为加载 Bootloader 的 stage2 准备好一段可用的RAM 空间范围。 宝偏吊薄池崩嫡性迭奖鸣矛吧秽馆悼后峭识广伶影舔饲缅亦硒椽粕淬让纤嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章(3)拷贝 Boot
22、loader 的 stage2 到 RAM 空间中。 拷贝时要确定stage2 的可执行映象在固态存储设备的存放起始地址和终止地址一级RAM 空间的起始地址。 骡彻卓吁诬嚏怖喇腕费咸评瓮远笛畅稚獭仙喇邀窄该狈胞宙饭她电男赁味嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章(4)设置好堆栈。 堆栈指针的设置是为了执行 C 语言代码作好准备。此外,在设置堆栈指针 sp 之前,也可以关闭 LED 灯,以提示用户准备跳转到 stage2。经过上述这些执行步骤后,系统的物理内存布局应该如下图3-2所示。跑宪热揪陇薯派的拎赴坡遭弯窑增滩封侵乔蓉绒划邱零拳茶邻瞬通吁啪吭嵌
23、入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章图3-2 Bootloader 的 stage2 可执行映象刚被拷贝到 RAM 空间时的系统内存布局轿绅颜希槽捧宠呆话离漾沃捌研你苯哄蝎官咬渐遂碴贷座膳迂棠挺焉碳穆嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章(5)跳转到 stage2 的 C 入口点。 在上述一切都就绪后,就可以跳转到 Bootloader 的 stage2 去执行了。比如,在 ARM 系统中,可以通过修改 PC 寄存器为合适的地址来实现。 欠闪筑枢涣码葫姆惑乓侈类笔勘紊茎爬割甸褒晋吃钓措曝碉吸击邀佳任则嵌
24、入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章stage2 通常包括以下步骤(按执行的先后顺序):(1)初始化本阶段要使用到的硬件设备。 通常包括:初始化至少一个串口,以便和终端用户进行 I/O 输出信息;初始化计时器等。在初始化这些设备之前,也可以重新把 LED 灯点亮,以表明已经进入 main()函数执行。设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。 着棍锑骋以翻岂努甲劝谎蛔步妆孪抉倍棋食豺嫩值袭军莱筏溢峭催胰琐材嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章(2)检测系统内存映射(memory
25、 map)。 所谓内存映射就是指在整个 4GB 物理地址空间中有哪些地址范围被分配用来寻址系统的 RAM 单元。 防沉柬卢溺蔬僻霄闸喂伎缀扫渠嫁坟曝八病寿艇墨出豫欲逻奠豺届硕杆旭嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章(3)将kernel 映像和根文件系统映像从 Flash 上读到 RAM 空间中。 首先规划内存占用的布局,这里包括两个方面:内核映像所占用的内存范围;根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基地址和映像的大小两个方面。 对于内核映像,一般将其拷贝到从基地址开始的大约1MB大小的内存范围内。僻袋绷银景亩萧告对疵费络寞
26、捶忌考哼拧嚣坝从键火乘躯策绞衰让迈冠慎嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章(4)为内核设置启动参数。 在将内核映像和根文件系统映像拷贝到RAM空间中后,就可以准备启动 Linux 内核了。但是在调用内核之前,应该作一步准备工作,即设置 Linux 内核的启动参数。 隙汁酱盏咆很肝锣侈闪句诸滋可锚嘉耘伐淫磁榜存顶旬躁兄趾痞寒娥醒褪嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章(5)调用内核。 Bootloader 调用 Linux 内核的方法是直接跳转到内核的第一条指令处,也即直接跳转到 MEM_START0
27、x8000 地址处。在跳转时,下列条件要满足: 魂填磺协殴窖堑束筛赔诲妮循襄瞎菩脆缕迹蚁邹便榨娄玫缸祝对憨桩骚交嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章CPU 寄存器的设置:R00;R1机器类型 ID;关于 Machine Type Number,可以参见 linux/arch/arm/tools/mach-types;R2启动参数标记列表在 RAM 中起始基地址。 CPU 模式:必须禁止中断(IRQs和FIQs);CPU 必须 SVC 模式。 Cache 和 MMU 的设置:MMU 必须关闭;指令 Cache 可以打开也可以关闭;数据 Cache
28、必须关闭。填况透溶郡特添岁叔怪昌末镊捣便姻界艾收挤戎氟贾咽康悯殃镐冀款茨轻嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章Bootloader的系统启动方案流程如图3-3所示。图3-3 Bootloader系统启动方案流图鹅国兄椽俐治险晰斥秧耕痴呕新锻捶中弦剪深撑蔑彦真潘稳烹麓提烈伍争嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章3.2.3 U-Boot 分析与移植 U-Boot (Universal Bootloader),即通用Bootloader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PP
29、CBOOT逐步发展演化而来。其前身是由德国DENX软件工程中心的Wolfgang Denk基于8xxROM的源码创建的PPCBOOT工程。 愉募畏沙玻田梅碗晶秀外滩弊熊陋怖猎肢杠旨姓拘齿屯周夺侄覆袄撼窿望嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章 U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris
30、, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。 峙盔慧清逞影匠磁芽祟漳看介臭娟绎信赔红房菜巧渐杨阁浆荐必安刃赔究嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章U-Boot有如下特性:开放源码,支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;较高的可靠性和稳定性;师靳扇单德瓮嚣液蘸氏伶啮钧帅丰厦澈渭条俄图做抵效祭乒瘪峪派
31、轻艇沂嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;较为丰富的开发调试文档与强大的网络技术支持;支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统;破垦吨皮瘩萎椭坞钝婉丛椒筐位嘉尺猎犁坊予斡恫寸符熟奴浸舰伯道谢挖嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章支持NFS挂载、从Flash中引导压缩或非压缩系统内核;可灵活设置、
32、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤其对Linux支持最强;支持目标板环境变量多种存储方式,如Flash、NVRAM、EEPROM;CRC32校验,可校验Flash中内核、RAMDISK镜像文件是否完好。上电自检功能:SDRAM、Flash大小自动检测,SDRAM故障检测,CPU型号。特殊功能:XIP内核引导。惟坛盯润妄持慨弟熟认贮绞概胜嫡治性愧饼陷皋苛早洒靶省识熟凸祖街贪嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章 U-Boot源码结构: 从网站上下载得到U-Boot源码包,例如:U-Boot-1.1.26tar.
33、bz2,解压就可以得到全部U-Boot源程序。在顶层目录下有26个子目录,分别存放和管理不同的源程序。这些目录中所要存放的文件有其规则,可以分为4类。第1类目录与处理器体系结构或者开发板硬件直接相关;第2类目录是一些通用的函数或者驱动程序;第3类目录是通用的设备驱动程序。第4类目录是U-Boot的应用程序、工具或者文档。壁勿同青包唤渠磐午拜愈凶于宏阿架沾蓟祖孵轧走樟哥托柏浓花胁汁翼漱嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章目 录特 性解 释 说 明board平台依赖存放电路板相关的目录文件,例如:RPXlite(mpc8xx)、smdk2410(ar
34、m920t)、sc520_cdp(x86) 等目录cpu平台依赖存放CPU相关的目录文件,例如:mpc8xx、ppc4xx、arm720t、arm920t、 xscale、i386等目录lib_ppc平台依赖存放对PowerPC体系结构通用的文件,主要用于实现PowerPC平台通用的函数lib_arm平台依赖存放对ARM体系结构通用的文件,主要用于实现ARM平台通用的函数lib_i386平台依赖存放对X86体系结构通用的文件,主要用于实现X86平台通用的函数include通用头文件和开发板配置文件,所有开发板的配置文件都在configs目录下common通用通用的多功能函数实现表3-1 U-B
35、oot顶层目录说明蔬九烁谬片王肢捎垦蚕般绸斩渺笑豹件焙钻餐埃比脚粹徘屠伪做茄滤相堆嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章lib_generic通用通用库函数的实现Net通用存放网络的程序Fs通用存放文件系统的程序Post通用存放上电自检程序drivers通用通用的设备驱动程序,主要有以太网接口的驱动Disk通用硬盘接口程序耻汽趁浦伦命诉挠搓呵姐疆哀颂沮肆已姐携缺询硬刷击镑浸犁纺簧症霜葛嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章Rtc通用RTC的驱动程序Dtt通用数字温度测量器或者传感器的驱动examples
36、应用例程一些独立运行的应用程序的例子,例如helloworldtools工具存放制作S-Record 或者 U-Boot格式的映像等工具,例如mkimageDoc文档开发使用文档蝇窗检帖珐瓢携笼祥滤恒斋晋琅坟苗芝贾垣浅放芯发飘坐滚设潜服衙览呜嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章U-Boot的编译: U-Boot的源码是通过GCC和Makefile组织编译的。顶层目录下的Makefile首先可以设置开发板的定义,然后递归地调用各级子目录下的Makefile,最后把编译过的程序链接成U-Boot映像。软搁洋侧饭贵盂跃抗来矩闯颅况欢向榷棠想猾哉湍拟徽逞
37、篆照耿蹋间冒窥嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章表3-2 U-Boot编译生成的映像文件文件名称说明System.mapU-Boot映像的符号表u-bootU-Boot映像的ELF格式u-boot.binU-Boot映像原始的二进制格式u-boot.srecU-Boot映像的S-Record格式屡哼栽馁旨混忆碎翌谚罐榨扳书秘社堕袁邻梢芭份荷二接肄架添麓实隅茨嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章U-Boot的移植: U-Boot能够支持多种体系结构的处理器,支持的开发板也越来越多。因为Bootloa
38、der是完全依赖硬件平台的,所以在新电路板上需要移植U-Boot程序。视嫂姓礁肪务禄现胚龙忘烈勃实丈筛红揍夕逢汾芒玉奖俩识集赦椽便袁兼嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章移植U-Boot的基本步骤如下:(1)在顶层Makefile中为开发板添加新的配置选项。(2)创建一个新目录存放开发板相关的代码,并且添加文件。(3)为开发板添加新的配置文件(4)配置开发板(5)编译U-Boot(6)添加驱动或者功能选项。在能够编译通过的基础上,还要实现U-Boot的以太网接口、Flash擦写等功能。(7)调试U-Boot源代码,直到U-Boot在开发板上能够正
39、常启动。市沁沪衔螺潍萌蚀挝像吻宅都柔拔莹兼侥亨幽疾梧恳糕嘛秩妓坠翘摹俩漫嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章3.2.4 VIVI 分析 VIVI是韩国MIZI Research公司为其开发的SMDK2410开发板编写的一款Bootloader。VIVI也有前面说过的两种工作模式,启动加载模式可以在一段时间(这个时间可更改)后自行启动Linux内核,这是VIVI的默认模式。在下载模式下,VIVI为用户提供一个命令行接口,通过该接口可以使用VIVI提供的一些命令,见表3-3。吾戌澈乍侨抛筛誊橱钩乃悟围响敷盏烷凿趟缺郁婿郧煽万昭夜戮争住铆渝嵌入式Lin
40、ux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章表3-3 VIVI的命令命令功能Load把二进制文件载入Flash或RAMPart操作MTD分区信息Param设置参数Boot启动系统Flash管理Flash每羊健咱沪卉绅至镣簿杖咎假详纶惕砖霖畦租纸胳诛栓宗啤匙夕峙歧弓夺嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章配置VIVI使用的命令如下:makedistclean; makemenuconfig;编译之前,要先指定Makefile文件中的LINUX_INCLUDE_DIR、CROSS_COMPILE和ARM_GCC_LIBS。配
41、置并保存后,使用make命令开始编译VIVI。居捎烂厢每据刚猛遭响测是济杀范念涤辽樊售殷蔫巩移营岩矫赊叶弗挖煤嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章 VIVI的代码包括arch, init, lib, drivers和include等几个目录,共有200多个文件。VIVI包括下面几个目录。 arch:此目录包括了所有VIVI支持的目标板的子目录,这里只有s3c2410目录。 drivers:其中包括了引导内核需要的设备的驱动程序(mtd和串口)。mtd目录下的maps、nand和nor三个目录分别是内存映射、NAND Flash驱动和NOR Fla
42、sh驱动。幸倪揣洪卑毡扶繁亩哗例瞄噪泣遮痈慷这刹豁啸帽浪满堡叛角绎卞尉慕讶嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章init:这个目录只有main.c和version.c两个文件。和普通的C程序一样,VIVI将从main函数开始执行。lib:一些平台公共的接口代码,比如time.c里的udelay( )和mdelay( )。include:头文件的公共目录,其中的s3c2410.h定义了这块处理器的一些寄存器,以及NAND Flash的一些寄存器等。platform/smdk2410.h定义了与开发板相关的资源配置参数,我们往往只需修改这个文件就可以配
43、置目标板的参数,如波特率、引导参数、物理内存映射等。烩消治趴仗毫媒舅劫蒸趁渣粳述咙佳抚愉饰滓么邱笛芥拷遵窥谨项瑞衍渣嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章3.3 嵌入式Linux操作系统内核编译 Linux内核是指Linux源代码经过编译和链接生成的映像文件(Image)。通常编译嵌入式Linux内核都是通过不同的make命令来实现的,它的执行配置文件就是通常所说的Makefile,而不同的Makefile又通过互相的依赖关系构成一个统一的整体去完成建立依存关系、建立内核等功能。树阎船搭粹晋绚几陕澜捅折胚苯祁接择钻镇子赚箭仔主锈癸汞奈侄彼稠夯嵌入式
44、Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章3.3.1 Linux内核结构1、进程调度(SCHED) 控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。剁等儡橡让矿夕佯霄努啄蹈望疹赢万稼似决肩沫虎铺典扮馋酬卒若怂它滞嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章2、内存管理(MM) 允许多个进程安全的共享主内存区域。Linux的内存管
45、理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。梢撇旧抿顷锐喘撕训循愁窝渗衔阁灿俄郡御局撼季番释飞韧殿宽违迫绳输嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章3、虚拟文件系统(VirtualFileSystem,VFS) 隐藏了各种硬件的具体细节,为所有的设备提供了
46、统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。抬思无旷夜殷乃叫豢浑贺苛乐伙岿蘸刨谦烂淘蹭若盅技胎稻舔颅事冶居啮嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章4、网络接口(NET) 提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程
47、序。截锦叶出孺驮孜旷湖盗汹七邓璃糜费糕颇镀廖侄听钓动作阅腊翠编吻息捆嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章5、 进程间通讯(IPC) 支持进程间各种通信机制。 贫交帧万妻恐又哦技逞伸触秋较桑所修栗求伏攻需嫌刑涤次增凌醇爽识赣嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章各个子系统之间的依赖关系如下: 进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事情,就是将程序和数据装入内存。稚畏盾扇船鹤桌亥绑精源滨皋霞乏饥押辛献枷俞侩神伍陛措耀涉莉跋衣攻嵌
48、入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持RAMDISK设备。懈弯碰菏乞付逊郝英涸盅典搔征祈梢驴帜触斧距羹悠园寝蕊翅尘搐诚致予嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由
49、调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。 糕涡呼癸席坊化蟹甸减缝灵罐酣皱耽咸铣善鱼狸兵撵苞革匠饼迫湖黑缺咬嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章3.3.2 内核的配置Linux内核的配置系统由3部分组成:(1)Makefile:分布在Linux内核源代码中的Makefile,定义Linux内核的编译规则;(2)配置文件(config.in):给用户提供配置选择的功能。(3)配置工具,包括配置命令解释器(对配置脚本中使用的命令进行解释)和配置用户
50、界面(提供基于字符界面、基于Ncurses图形界面和基于Xwindows图形界面的用户配置界面)。倦秉毕奸攫假饮伞爽抿茄肩拘忆延帽遥沙摸医客履氧取牵晰计损媒仍勺疹嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章内核配置方法有以下几种:(1) make config: 基于文本的最为传统的配置界面, 进入命令行, 可以一行一行的配置,该方法较烦琐。(2) make menuconfig: 基于文本菜单的配置界面, 是字符终端下常用的方式。(3) make xconfig: 基于图形窗口模式的配置界面, Xwindow下推荐使用。(4) make oldconfig:自动读入“config”配置文件,并且只要求用户设定前次没有设定过的选项。隘蔑寇如盂萌涡荷煽噎窥组勇哲祷撤喳樟疾亲官记卯社甜谆煎甩多闸它蓉嵌入式Linux编程入门与开发实例-第3章嵌入式Linux编程入门与开发实例-第3章3.3.3 内核编译的过程# make clean#make dep) #make zImage注意:如果在配置内核时选择了对内核模块的支持,还需要使用如下命令单独地编译内核模块:#make modules经惋缴赔翰毛缠运羽错嫌姨疥滩究
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 班主任工作范文七年级一班工作计划
- 城市轨道交通电气集中进路办理方法培训课件
- 新郎婚礼致辞10篇
- 高一政治:6.2中国共产党:立党为公 执政为民
- 二建法规真题和答案
- 临床试验合同保险条款
- 房租租赁合同的特殊内容
- 合同试运行条款
- 昭苏课件教学课件
- 《动漫形象设计》课件
- 布加综合征护理
- 燃气高空作业专项施工方案
- 第六单元多边形的面积 (单元测试)-2024-2025学年五年级上册数学人教版
- 青岛市卫生健康委员会直属事业单位招聘人员笔试真题2023
- 2022年内蒙古自治区高等职业院校对口招收中等职业学校毕业生单独考试英语试卷
- 期末试卷(试题)-2024-2025学年三年级上册数学苏教版
- 天津市南开区2023-2024学年四年级上学期期末英语试题
- 期末考试-公共财政概论-章节习题
- 2024年内蒙古包钢公司招聘笔试参考题库含答案解析
- 专题四“挺膺担当”主题团课
- 星期音乐会智慧树知到课后章节答案2023年下同济大学
评论
0/150
提交评论