移植linux内核-映像文件,移植Linux内核-映像文件

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明

http://tigerwang202.blogbus.com/logs/43927976.html

首先从Blackfin uClinux网站下载最新版uClinux内核。

http://blackfin.uclinux.org/gf/project/uclinux-dist/frs/

上述地址除了提供内核源代码外,还提供一些预编译的内核文件供特定电路板使用。如果使用ADI官方的验证板,可从中选择适合板子的编译好的内核文件。

那些内核文件一般没有后缀扩展名,你在下载之后可以使用UNIX的file命令察看文件类型,例如:

file linux-2.6.x/linux

linux-2.6.x/linux: ELF 32-bit LSB executable, version 1 (SYSV), statically linked, not stripped

ELF是预编译的存储器映像文件,它可直接下载至目标板。这些文件不需要编译,拿来就可直接使用。

还有一类是tar.bz2为后缀的源代码压缩包文件,为了编译内核,你需要下载它。撰写本文时,笔者下载的是:

uClinux-dist-2008R1.5-RC3.tar.bz2

将其解压缩至项目根目录下的kernel文件夹。例如,笔者的内核源码放置在/home/uclinux/kernel/uClinux-dist-2008R1.5-RC3文件夹。

tar –vxjfuClinux-dist-2008R1.5-RC3.tar.bz2

在你为目标板建立内核的过程中,配置属于最初的阶段。内核配置的方法很多,而且配置设置时有很多选项可以选择。不管你使用哪种方法设定设置或者选择哪些配置选项,在你设定好配置后都将产生.config文件以及建立过程其余步骤将会用到的一些符号连接和头文件。

以下的配置过程我们使用一个文本界面的设置程序,这也是最常用的设置方法。

如果使用的是Debian系统,默认安装没有ncurses库的,使用make menuconfig会提示出错,需要先运行下列命令安装这个库:

apt-get install libncurses5-dev

切换至内核源代码目录,运行以下命令配置内核。该命令提供一个基于文本界面的友好的内核设置界面。

make menuconfig

注意:如果你先前从一个平台设置切换至另一平台,你需要先运行 make clean 命令,以避免编译内核时可能出现的错误。一个比较可靠地方式是:无论在什么时候,在你配置内核时,都运行make clean 命令。

一些用户可能使用make xconfig命令来配置内核,这个命令提供一个图形化的配置。较新版本的内核可能要求你安装有QT图形库以运行makexconfig命令。如果,你没有安装那些库make xconfig命令会出错(例如Debian的默认安装就没提供QT库),这时可以使用 makemenuconfig命令,它是除了基于文本界面外,其它功能都是相同的。或者,你可以使用下列命令安装QT库(仅适用于Debian)

apt-get install tk8.4

注:笔者下载的源码包使用TK的GUI库,故使用上述命令安装。

下面的设置在menuconfig的文本设置界面中进行。

在输入make menuconfig命令后,终端会输出一些信息,随后出现文本设置界面,如下图所示。

选择” Vendor/Product Selection”(生产商/产品选择)选项。

在Vendor/Product Selection窗口中,请确认AnalogDevice被设置为Vendor(如上图所示)。这里,我们选择一块BF533-STAMP的验证板作为编译目标。(我们仅仅是为了演示整个编译过程,在下面的文章里将介绍如何添加自己的板子作为编译目标)在你选择一块验证板作为编译目标时,系统默认会根据该目标板的配置文件加载一些默认设置。

选择返回“Main Menu”界面。一个对话框会出现提示“是否新的内核设置”,选择“Yes”。

选择“Kernel/Library/Defaults Selection”选项。出现“Kernel/Library/Defaults Selection”窗口。

选中“Customize Kernel Setting”和“Customize Vendor/User Settings”选项。选择的方法是在选择该条目的情况下按”Y”键。

选择返回主界面。选择Exit退出并保存设置。终端界面在执行一长串命令后,显示“Linux Kernel Configuration”界面。

在内核设置窗口中你可以进行各种内核选项和设备驱动设置。如果这是你第一次编译内核,在你不知道这些选项的确切意义之前,强烈建议你不要修改任何选项(因为我们练习的目的是熟练内核编译的流程,使用默认的选项就可以。)在下面的文章中你将学习如何设置内核使其适合特定的目标板。

选择退出设置。一个对话框会出现提示“是否新的内核设置”,选择“Yes”。

在终端执行一些命令后,出现“uClinux v3.2.0Configuration”窗口。在这个窗口中,你可以设置各种应用程序(它们可能是ADI预先demo程序,用来演示uClinux上的一些特定应用,如音频、视频播放器等)。如果这是你第一次编译内核,还是建议保持缺省设置,不要做任何修改。

选择退出并保存设置。一个对话框会出现提示“是否新的内核设置”,选择“Yes”。

提示:有些程序是实验性的,可能通不过编译或者导致不稳定。

设置工作至此结束。运行下列命令开始编译。编译过程中将更新内核及根文件系统。编译将耗时5至10min,所需时间可能根据你选择组件的数量略有增加或缩短。如果在虚拟机中运行交叉编译器时间将成倍增长。

编译成功后会在images子目录下生成一大批可通过U-Boot加载至目标板的内核文件。这些内核映像文件将在下文中作详细讨论。关于U-Boot的详细信息请参考前几章节。

在你完成对一些应用程序的裁剪后,通常输入make命令对系统进行编译。如果一切顺利,在几分钟的等待后,编译后的文件将存放在一个称作images的子目录中(它位于uClinux源码根目录下)。使用cd命令切换至该目录,并用ls命令列出其中包含的文件。你会得到如下图所示的一批文件。那些不同的文件有什么明确的用途吗?

总的说来,这些文件可以分成两大类:内核文件 和 根文件系统

请注意以下操作适用于所有ADI的验证板。你的板子的设置可以与上面的生成的文件不同,你可以按照自己的喜好配置需要生成什么,不需要生成什么以及生成文件保存的路径。具体的映像(image)生成过程在make文件vendors///Makefile中描述。举例,我们上文使用BF533-STAMP的验证板作为编译目标,它的编译设置在vendors/AnalogDevices/BF533-EZKIT/Makefile中描述。

然而为了避免重复设置,那个映像(image)目标可能指向vendors/AnalogDevices/vendor.mak中定义的目标。如果你希望自己的板子像上面那样结构生成image文件,你可以在不通过拷贝设置文件情况下重新使用那些设置。可以参考vendors/Bluetechnix/CM-BF537U/Makefile作为重写使用Analog Device验证板设置的例子。

内核映像:

内核映像有很多种。它可以是ELF格式,或者是可引导的U-Boot映像格式。它可以和一个根文件系统捆绑在一起。或者仅仅是内核本身。

格式:

内核如果是可引导的U-Boot格式,它一般地会在文件名中包含Image字符串(诸如uImage或vmImage),而ELF格式的内核通常在文件名中包含linux字符串(诸如linux或vmlinux)。

大多数情况下你应该使用U-Boot格式的可引导内核映像。U-Boot格式包括压缩过程,这使得内核文件体积更小,同时U-Boot也很容易引导它。如果你对启动速度的要求超过对空间的节省,你应该使用ELF格式的映像引导。ELF格式的文件是不进行压缩的(这意味着其体积较大),但是加载过程却往往会变更快,因为这只涉及一些存储器拷贝过程。ELF格式的影响通常会含有大量的用以描述它自己的“meta”信息,而U-Boot格式却剥离一切不必要的信息。

扩展名:

那些包含根文件系统的内核会有扩展名作为其文件类型(例如.ext2或.initramfs)。那些不带根文件系统的内核没有扩展名。

那些附带有根文件系统的内核通常在你需要完全在RAM中运行根文件系统的系统中使用。如果你需要在一个外部存储器(诸如 并行Flash 或串行Flash等等)上运行根文件系统,那么通常需要一个单独的内核映像(standalone Kernelimage)。例如,当根文件系统在RAM中运行时,你对其作的任何修改将在系统重启后消失。一个非易失的根文件系统只能存储于外部设备中。

举例:

这里以本文编译的uClinux映像为例,编译过程生成了下列常见的映像文件:

vmlinux

ELF格式的Linux 内核映像 - 不含根文件系统

linux

“缺省”linux.rootfs 文件的符号链接

linux.cramfs

ELF格式的Linux内核,包含CRAMFS文件系统

linux.ext2

ELF格式的Linux内核,包含EXT2文件系统

linux.initramfs

ELF格式的Linux内核,包含cpio归档的文件系统

linux.initramfs.gz

ELF格式的Linux内核,包含一个压缩的cpio归档的文件系统

linux.romfs

ELF格式的Linux内核,包括一个ROMFS文件系统

vmImage

U-Boot可引导格式的Linux内核 - 不含根文件系统

uImage

“缺省”uImage.rootfs文件的符号链接

uImage.cramfs

U-Boot可引导格式的Linux内核,包含CRAMFS文件系统

uImage.ext2

U-Boot可引导格式的Linux内核,包含EXT2文件系统

uImage.initramfs

U-Boot可引导格式的Linux内核,包含cpio归档的文件系统

uImage.initramfs.gz

U-Boot可引导格式的Linux内核,包含压缩的cpio归档的文件系统

uImage.romfs

U-Boot可引导格式的Linux内核,包含ROMFS文件系统

.initramfs与initramfs.gz区别的原因在于U-Boot格式映像已经包括压缩功能,initramfs.gz意味着根文件系统进行双重压缩。因此,对于一个U-Boot格式的可引导映像,使用uImage.initramfs.gz是个坏主意,而应使用.initramfs 。当对ELF文件格式(通过不进行压缩),应该使用initramfs.gz 。

文件系统映像:

文件系统映像以rootfs开头,以描述该文件系统的短名称作为后缀。如果你乐意的话,可以在开发环境中作为(root back设备)挂在映像。并通过这种方式浏览文件系统的内容。

文件系统映像很少会在目标板上“直接”使用。大多数情况下,你将它们烧写至Flash或其他什么存储设备中,然后在引导Linux时挂载。

根文件系统映像通常存放在两个地方。大部分的映像存放于uClinux源码根目录下的romfs文件夹。因为它不包含设备节点(devicenodes),创建工具会生产一个文件(通常称作device_table.txt)用以为最终映像的/dev目录和相关的设备节点创建正确的major/minor值 与权限。【注:在笔者使用的版本中根文件系统映像一并放置于images目录下】

文件名

描述

rootfs.cramfs

CRAMFS格式的根文件系统

rootfs.ext2

EXT2格式的根文件系统

rootfs.initramfs

cpio归档格式的根文件系统

rootfs.initramfs.gz

cpio归档格式的并使用gzip压缩的根文件系统

rootfs.jffs2

JFFS2格式的根文件系统

rootfs.romfs

ROMFS格式的根文件系统

rootfs.yaffs

YAFFS格式的根文件系统

rootfs.yaffs2

YAFFS2格式的根文件系统

其它文件:

System.map文件提供给每个相关的Linux内核映像。与linux映像类似,它带有rootfs的后缀因此你很容易匹配两者。

有时内核映像文件将以一种更直观的方式提供,从其名称就可了解其包含文件系统的类型。如果是这种情况,映像文件命令类似于rootfs带有.contents(.内容)的后缀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux意想不到题4

101 linux系统调优 答:(1)硬件:大内存、固态硬盘或者RAID阵列、CPU核数、服务器产商 (2)某个服务的编译安装,启用或禁用的一些选项 (3)服务的配置文件,参数的…

linux中用截取一些信息,Linux如何使用cut命令截取文件信息

在Linux众多命令中,cut命令可用来截取文件信息,截取Linux字符串,下面将针对cut命令的用法做个详细介绍,感兴趣的朋友可以来学习下。cut命令有截取的意思,可从linux文件或者标准输入中读取内容并纵向截取所需信息列的一…

l启动进程 linux,《日子》. linux 查看进程启动路径

在linux下查看进程大家都会想到用 ps -ef|grep XXX可是看到的不是全路径,怎么看全路径呢?每个进程启动之后在 /proc下面有一个于pid对应的路径例如:ps -ef|grep python显示:oracle 4431 4366 0 18:56 pts/2 00:00:00 python Serve…

django_4:数据库1——django操作数据库

创建数据库记录(插入) 使用python3 manage.py shell(python3亲测好使) ipython3 manage.py shell(亲测不好使) 方式一、 [rootcentos7 csvt03]# python3 manage.py shell Python 3.5.2 (default, May 9 2017, 23:04:15) Type copyright, credits or li…

linux uuid错误,Linux 错误:fatal error: uuid/uuid.h: No such file or directory

重新configure 后,出现别的错误:fatal error: uuid/uuid.h: No such file or directory这是因为没有uuid库和头文件,需要安装e2fsprogs,试过yum命令安装,问题没解决,需要从源码编译wget http://downloads.sourceforge.…

uva 11054

据说这叫扫描法,,,,感觉就是脑洞啊,,,,,反正从最左端开始,如果有酒就往后运,需要酒就运负的,就是相当于后面有酒了就运回来。。。 #in…

fastdfs集群搭建2

五.在各个存储节点安装nginx 1.上传 fastdfs-nginx-module_v1.16.tar.gz 到/usr/local/src,解压 2.修改 fastdfs-nginx-module 的 config 配置文件 将CORE_INCS"$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/" 修改为:CORE_INC…

201521123057 《Java程序设计》第12周学习总结

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容。 2. 书面作业 1.字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) 将Student对象(属性:int id, String name,int age,doub…

linux 管道文件上机总结,[转载]LINUX 管道 fifo 等总结

Linux进程通信:命名管道FIFO小结Linux下进程之间通信可以用命名管道FIFO完成。命名管道是一种特殊类型的文件,因为Linux中所有事物都是文件,它在文件系统中以文件名的形式存在。在程序中,我们可以使用两个不同的函数调用来建立管道…

tomcat 下载

点project 关闭防火墙才可以让别人访问自己 转载于:https://www.cnblogs.com/feathe/p/6853491.html

linux消息框架,远程处理器消息框架 - 基于Linux 简化 AMP 配置使其更方便更动态地分配资源...

核心的 rpmsg 框架起到开关的作用,根据消息中包含的目的地址将消息传送到相应端点。由于消息报头包含源地址,因此可在不同处理器之间建立专用连接。命名服务处理器可通过向 rpmsg 框架的命名服务发送消息,以动态宣布特定服务。命名服务功能本…

洛谷 P3366 【模板】最小生成树

题目描述 如题&#xff0c;给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出orz 输入输出格式 输入格式&#xff1a;第一行包含两个整数N、M&#xff0c;表示该图共有N个结点和M条无向边。&#xff08;N<5000&#xff0c;M<200000…

陇东学院c语言程序设计,C语言程序设计

spContent《C语言程序设计》是高等学校本科教育普遍开设的一门课程&#xff0c;是广大程序设计语言学习者首选的入门课程。本课程立足于C语言基础知识的讲解&#xff0c;讲授中引入大量实例&#xff0c;突出重点&#xff0c;剖析难点&#xff0c;培养学生结构化程序设计的思想&…

关于android:windowNoTitle不起作用的解决办法

今天测试一个新功能的时候&#xff0c;在styles.xml设置<item name"android:windowNoTitle">true</item>并没有生效&#xff0c;当时很奇怪&#xff0c;以前的项目都这么设置的&#xff0c;并且都能生效&#xff0c;后来发现MainActivity继承的是AppComp…

jQuery笔记——选择器

jQuery 最核心的组成部分就是&#xff1a;选择器引擎。它继承了 CSS 的语法&#xff0c;可以对 DOM 元 素的标签名、属性名、状态等进行快速准确的选择&#xff0c;并且不必担心浏览器的兼容性 常规选择器 根据id选择元素就是使用#&#xff0c;还有两种其他选择元素的方式&…

c语言实现NRZ编码,CSC1001-课后笔记

前言&#xff1a;为什么编写此文1. 根据费曼的学习方法Pretend to teach your topic to a classroom. Make sure youre able to explain the topic in simple terms. 假装你在教室里向学生解释这个主题&#xff0c;用尽量简单的词汇去描述它&#xff0c;力求学生能听懂。(听众…

LeetCode 111. Minimum Depth of Binary Tree

原题 Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. 思路一 类似于求最大深度时的递归思路不过需要注意的是当某一节点的左子节点(右子节点类似)为空时…

c语言编程流水灯与交通灯实验,C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟.doc...

C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟学 号&#xff1a;班 级&#xff1a; 自动化10班姓 名&#xff1a; 张指导老师&#xff1a; 胡2012.12单片机核心板实验要求流水灯实验实验目的&#xff1a;简单I/O引脚的输出掌握软件延时编程方法简单按键输入捕获判断完…

angularjs中的分页指令

自定义指令 import angular from angular;/*** ngdoc module* name components.page* description 分页directive*/ export default angular.module(pageDirective, []).directive(ngPage, function () {return {restrict: E,scope: {totalCount: ,pageSize: ,param: ,pageItme…

金币问题c语言程序,【求助】急请c语言高手帮忙解决程序问题(问题已经被我自己解决,金币送给自己啦)...

不好意思&#xff0c;这是程序后面部分&#xff1a;RHOMOLL,double* X, double& DRHODT);void (__stdcall *FGCTYdll)(double& TK, double& RHOMOLL,double* X, double& FUGACITY);// The following ifdef block is…