版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux系统开发详解,v 0.1Linux系统开发详解文件状态 草稿文件 正式文件 更改正式文件文件标识:当前版本:0.1作 者:王杰 高级嵌入式软件工程师开工日期:2012年4月1日版 本 历 史版本/状态作者起止日期备注V 1.0正式版王杰2012-4-12013-02-05最小系统移植 目 录 版 本 历 史2前 言5一、导读5二、说明5三、约定5四、版权6系统篇7第1章 系统概述71.1问题71.2系统启动过程71.3BootLoader71.4Kernel91.5Rootfs101.6GUI(Graphic User Interface)10第2章 U-Boot定制122.1问题1
2、22.2概述122.3配置142.4编译152.5实验15第3章 Linux Kernel定制203.1问题203.2概述203.3配置243.4编译263.5实验27第4章 文件系统原理314.1问题314.2文件系统基础314.3文件系统逻辑结构324.4文件系统实现324.5挂载334.6存储介质344.7文件系统类型35第5章 Linux文件系统365.1问题365.2逻辑结构365.3文件系统实现375.4存储介质385.5文件系统类型39第6章 Linux根文件系统制作436.1问题436.2根文件系统436.3根文件系统启动过程436.4简单根文件系统制作446.5init脚本4
3、76.6rcS脚本506.7用户登录实现566.8动态编译61参考文献63附录A:名称解释64附录B:工具讲解65Kconfig65n运行流程65n模块分类原理66nKconfig脚本66Readelf74附录C:系统配置77安装交叉编译器77搭建开发网络78搭建tftp服务器80搭建nfs服务器82前 言一、 导读嵌入式Linux系统移植分为最小系统搭建和驱动移植两个阶段,为了大家更容易接受知识点,更容易上手实践,我们将本书从最小系统搭建开始讲起:(一) 系统篇讲解最小系统搭建过程中所涉及的BootLoader、Kernel、Rootfs和GUI这四个部分的知识点二、 说明由于时间和能力的限
4、制,我们很难又好又快的完成本书,但我们会自己尽最大努力完成我们已经掌握的知识点。同时我们也希望大家能施以援手,一起来完成本书,我们建议如下:(一) 逐步更新希望大家根据自己的工作学习总结,帮忙逐步更新本书;对本书中存在错误,不吝赐教,及时指正或更新,以免误导其他童鞋。 (二) 开放文档及版权本书将和Linux系统一样开放版权,对本书的任何修改,版权归全体开发者及提供意见者。(三) 开放文档框架系统开发知识点理解起来相对比较难,所以每个知识点将采用理论加实践的方式来讲解,通常分为原理讲解、实验和经验总结三个部分;希望大家修改或者添加知识点时,也按照这个思路来完成知识点的讲解,我们也会把比较重要的
5、知识点,但是由于我们的精力和能力限制,暂时无法完成的知识点列出来希望各位高手施以援手。三、 约定n Linux系统支持多种体系结构的CPU,本书将会以ARM体系结构的CPU为例来讲解系统开发的各个知识点,希望大家也能采用ARM架构的CPU来讲解知识点。n 本书是基于如下开发环境书写的:Ø PC机,安装windows操作系统Ø 虚拟机,运行在PC机上,安装ubuntu操作系统Ø mini2440开发板n 源代码和脚本采用灰色底纹,如:printf("hello worldn");n Linux下命令操作部分采用斜体和灰色底纹,并且带完整的系统提示
6、前缀,来让童鞋们很容易明白是PC操作命令,还是开发板操作命令,如:ubuntuubuntu:/work/rootfs/rootfs/etc$ lsPC操作命令# ls开发板操作命令n 对本书的任何更新和修改,请更新版本号,并且将自己的修改记录写入文档开头的版本历史,最好能将更新后的文档发送到下列邮箱:作者邮箱王杰wangjie_wh四、 版权由于Linux系统开发是众所周知的技术,没有秘密可言,系统开发中的经验应该大家共享,我们自己也是这么学来的,作者愿意公开本书。声明如下:(一) 读者可以任意拷贝、修改本书的内容,也可以增加作者及赞助单位,但不可以篡改原来的作者及赞助单位。(二) 未经作者许
7、可,不得出版或大量印发本书。(三) 如果竞争对手公司的员工得到本书,请勿公开使用,以免发生纠纷。(四) 本书可以用于商业目的,但是版权归所有作者及赞助单位所有。(五) 欢迎读者对本书提出批评建议,或者成为本书的作者。东方锐智,2012年4月系统篇最小系统移植是整个系统移植的核心,也是工作量最大、难度最大的部分,是进行驱动开发调试的前提条件。第1章 系统概述1.1 问题系统启动分哪几个阶段?每个阶段做什么工作?如何完成每个阶段的工作?1.2 系统启动过程【图1- 1】系统启动图说明1 CPU复位后,启动BootLoader2 BootLoader会驱动一部分硬件,并且加载Kernel到内存,启动
8、Kernel3 Kernel会挂载Rootfs(根文件系统),并且启动Shell环境4 如果需要图形界面程序,系统会启动图形界面程序1.3 BootLoaderBootLoader相当于PC里的BIOS程序,通常是CPU复位后执行的第一个程序,它的主要功能是初始化硬件、调试和启动Kernel。结构通常如下:【图1- 2】Bootloader结构图说明1 启动代码初始化CPU和RAM,加载自己到内存,建立C语言运行环境,调用设备驱动初始化硬件,进入命令行2 设备驱动包含硬件设备驱动(如:串口、显卡、网卡等)和协议栈(如:usb总线协议、帧缓冲等)3 lib标准的C库函数4 网络协议arp、rar
9、p、udp、nfs和tftp等网络常用的协议5 fsfat、ext、yaffs、cramfs等常用的文件系统6 disk磁盘设备分区程序7 调试命令利用设备驱动和协议栈实现对kernel进行调试8 kernel启动实现对kernel引导,传递参数给kernel常见的BootLoader有:1 Grub运行在X86架构的CPU上,是BIOS启动的第一个程序2 U-Boot运行在PowerPC、ARM、MIPS等架构的CPU上3 vivi运行在ARM架构的CPU上如何使用BootLoader进行产品开发?在后面的章节中,将以U-Boot例来讲解。1.4 KernelKernel中文叫内核,它主要实
10、现操作系统的核心功能,即管理所有软硬件资源,为应用程序提供统一的操作接口,需要管理内存、中断、多任务、设备、网络协议栈和文件系统等。结构通常如下:【图1- 3】Kernel结构图每种操作系统都有自己的内核,常见的操作系统:1 Windowswinxp、win7、win8.等,它们采用的内核是Windows内核2 Mac os苹果PC使用的操作系统,它采用的内核是苹果公司自己开发的内核3 Android当前最热门的手机操作系统,它采用的内核是Linux内核如何使用Kernel进行产品开发?在后续章节中,将通过Linux Kernel来讲解。1.5 RootfsRootfs中文叫根文件系统,它的主
11、要功能是实现对程序和数据的分类存储。结构通常如下图:【图3- 1】根文件系统图说明A. Rootfs的逻辑结构为倒“树”结构B. 本图为Linux根文件系统逻辑结构图C. Rootfs中的文件和目录可以分散存储到多种不同的存储介质上Rootfs如何分类存储程序和数据?如何分散存储到不同的存储介质上?在后续章节中,将通过Linux根文件系统来讲解这些。1.6 GUI(Graphic User Interface)GUI中文叫图形用户接口,它的主要功能为用户提供一个友好的图形操作界面。结构通常如下:【图3- 2】GUI结构图说明1 应用程序提供给用户的图形界面2 QtopiaPDA和手机的桌面,采
12、用QT图形库实现3 UbuntuLinux PC的桌面,采用GTK/GNOME图形库实现4 ExplorerWindows系统桌面,采用MFC图形库实现5 MiniGUI国内的一家公司开发的跨平台的图形库,代码效率高,对机器的配置要求低,对中文的支持非常好,主要用于嵌入式设备上6 QT目前由诺基亚公司维护管理的跨平台图形类库,代码效率高,对机器的配置要求不高,主要用于嵌入式设备上7 MFCMicrosoft公司开发的基于windows系统的图形类库,用于windows系统上的图形应用程序开发8 GTK/GNOMELinux系统下的图形类库9 类库层是整个GUI的核心,是GUI不可缺少的部分GU
13、I如何工作?如何定制GUI?如何搭建GUI应用程序开发环境?在后续章节中,将通过QT图形库运用来讲解这些。第2章 U-Boot定制 2.1 问题如何获取U-Boot源代码?如何配置编译U-Boot?如何运行调试U-Boot?2.2 概述一、 U-Boot官方网站网址:http:/www.denx.de/wiki/U-Boot提供了U-Boot工程的很多信息,其中包含:A. 说明文档,详细说明了U-Boot的实现细节,为U-Boot移植和运用提供帮助B. 源代码,提供了U-Boot源码仓库,有git仓库和ftp server服务器仓库C. 补丁信息,介绍补丁提交规则、代码属性、版权、补丁跟踪和发
14、布D. U-Boot工程的当前任务E. 邮件列表,讲述了如何群发邮件给开发者,如何提交自己的邮件二、 获取源代码1 官网下载ü git工具下载在使用git之前,必须确认网络参数和DNS配置正确,且9418网络端口可以通。条件具备后,执行下面的命令获取源码:git clone git:/git.denx.de/u-boot.git如果9418网络端口没有开放,可以使用http通路下载,下载方法:git clone http:/git.denx.de/u-boot.git推荐使用前一种,后一种速度偏慢。2 芯片厂家提供芯片厂家提供开发板的同时,会提供移植好的U-Boot源代码三、 版本管
15、理1 版本号U-Boot版本号在2008年以前用数字表示,如:v1.3.4,在2008年以后用发布日期表示,如:v2012.4.1;版本号中可以有发布号,如:v1.3.4-rc1,表示版本号为v1.3.4的第一个发布版本,但是稳定版本一般不包含发布号。2 git工具参考git内部结构.pdf和git简要说明.pdf这两本书四、 源代码规范应该遵守linux kernel源代码规范,请参考kernel/Documentation/CodingStyle,除此之外,源代码风格要注意下面几点:1 只采用C,不支持C+2 去掉所有的行尾空白3 TAB字符缩进,不要采用空格4 确认源码文件是非DOS格式
16、,即回车换行不是rn5 不要出现两个连续的空白行6 文件结尾有且只有一个空白行五、 源代码结构U-Boot结构和普通的BootLoader结构一样,具体参见图1-2,下面是对应的源代码结构图:【图2- 1】U-Boot源代码结构图说明1 实线矩阵表示硬件,虚线矩阵表示从U-Boot根开始的源代码目录2 arch/board/cpu启动代码,也可以称为核心驱动,它的主要功能是对关键硬件(cpu和board上与启动相关的硬件)进行启动相关的初始化,确保启动可以正常进行。启动代码按照下列信息分目录存放:A. vendor表示soc厂家(如:samsung)B. board表示主板/机器名称(如:sm
17、dk2410)C. arch表示cpu平台架构(如:arm)D. cpu表示cpu核心(如:arm920t)在老版本中,启动代码主要放置在cpu和board目录;新版本关键硬件代码主要存放在arch和board目录。3 dirvers存放各种与cpu平台架构无关的硬件驱动4 lib存放C标准库函数代码5 net存放网络协议栈代码6 fs存放各种文件系统代码7 disk8 common命令代码和内核启动代码9 tools相关的工具代码,工具运行在PC上,比如:制作内核启动映像之类的工具2.3 配置从U-Boot的源代码结构可以看出它的模块化设计做的非常好,极大的提高了代码的重复利用率,简化了U-
18、Boot的定制过程。定制是指根据需求选择和配置模块:2.3.1 配置目的1. 选择需要的模块例:mini2440开发板采用arm920t cpu,那么它需要选择arm920t的启动代码模块相反,如果mini2440开发板更换成别的cpu,那么不需要选择arm920t cpu的启动代码模块2. 配置代码需要的数据例:mini2440开发板采用12M的cpu晶振,那么需要在代码中配置晶振频率为12M2.3.2 配置项和配置文件n 配置项配置项用于描述模块的配置,它分为:选择配置项用于描述模块是否编译到U-Boot?本质是C语言中的条件编译例:如果mini2440开发板需要选择arm920t的启动代
19、码,则需要在include/configs/mini2440.h文件中定义如下宏#define CONFIG_ARM920T1数据配置项用来表示代码中需要使用的数据,本质是C语言中的宏替换例:如果要在mini2440开发板的代码中配置晶振频率为12M,则需要在include/configs/mini2440.h文件中加入或修改CONFIG_SYS_CLK_FREQ宏#define CONFIG_SYS_CLK_FREQ12000000CONFIG_SYS_CLK_FREQ是数据配置项,它是一个C语言宏配置项说明见U-Boot源代码根目录下的README文件(在“Configuration Op
20、tions”章节)。n 配置文件配置文件用于保存配置项,说明如下:include/configs/主板名.h与主板硬件相关配置include/config_cmd_defaults.h命令配置项config_defaults.h支持的操作系统以及压缩算法的配置项include/asm/config.h存放汇编配置【表2- 1】U-Boot配置文件2.3.3 配置命令配置完成后,运行“make 主板名_config”命令设置主板配置为默认配置:例:设置mini2440主板配置为默认配置ubuntuubuntu:/work/Boot/u-boot.1.3.2$ make mini2440_conf
21、ig Configuring for mini2440 board.ubuntuubuntu:/work/Boot/u-boot.1.3.2$运行make unconfig命令删除工程的默认配置:ubuntuubuntu:/work/Boot/u-boot.1.3.2$ make unconfigubuntuubuntu:/work/Boot/u-boot.1.3.2$2.4 编译编译器采用GCC,编译过程采用make和shell工具来进行控制,由于编译过程比较复杂,在后面的版本中再说明它的原理,这里先看一下常用的编译命令:1. 编译所有U-Boot目标ubuntuubuntu:/work/B
22、oot/u-boot.1.3.2$ make all2. 删除中间文件ubuntuubuntu:/work/Boot/u-boot.1.3.2$ make clean3. 删除目标代码及中间文件ubuntuubuntu:/work/Boot/u-boot.1.3.2$ make clobber4. 删除目标文件、中间文件和默认配置ubuntuubuntu:/work/Boot/u-boot.1.3.2$ make distclean注意:如果命令忘记了可以输入一部分命令,然后按TAB键,make工具会提示完整的命令。2.5 实验U-Boot的配置和编译讲解之后,大家可能还是很迷糊,到底如何定制
23、U-Boot?下面我们通过一个U-Boot的定制实验来进一步理解:n 目的1 掌握U-Boot开发环境的搭建2 掌握U-Boot的配置、编译和调试过程n 前提条件无n 步骤 1 安装交叉编译器详见“附录C中的安装交叉编译”章节2 安装U-Boot源码1. 用Samba共享,把开发包中的U-Boot源码(u-boot.1.3.2.tar.gz)拷贝到虚拟机中,结果如下:ubuntuubuntu:/work/Boot$ lsu-boot.1.3.2.tar.gz2. 解压ubuntuubuntu:/work/Boot$ tar zxvf u-boot.1.3.2.tar.gzubuntuubunt
24、u:/work/Boot$ lsu-boot.1.3.2 u-boot.1.3.2.tar.gz3 配置U-Bootubuntuubuntu:/work/Boot$ cd u-boot.1.3.2/ubuntuubuntu:/work/Boot/u-boot.1.3.2$ make mini2440_config Configuring for mini2440 board.ubuntuubuntu:/work/Boot/u-boot.1.3.2$4 编译U-Bootubuntuubuntu:/work/Boot/u-boot.1.3.2$ make all编译之后的结果中一定要有u-boot
25、.bin。5 下载调试U-Boot1. 准备PC串口如果PC上已经有串口跳过这一步;如果没有,需要一根USB转串口线。接到PC USB口,安装好驱动。驱动安装完成后,在“设备管理器”中应该有相应的分支项:COM28【图2- 2】设备管理器2. 用串口线连接PC串口和开发板console口,用USB线(一头方一头扁)连接开发板和PC USB口,接好开发板电源线,如下图: 开发板电源线consoleusb slave【图2- 3】接线图3. 选择NOR flash启动【图2- 4】USB转串口端口4. 安装USB驱动安装FriendlyARM USB Download Driver Setup_2
26、0090421.exe驱动程序,再给开发板上电,winxp32位系统会提示安装开发板驱动,按照提示过程一步一步安装即可(可能会出现警告,这时点击仍然安装即可),win7 32位的系统会直接驱动起来;安装成功后,设备管理器中会出现如下设备:FriendlyARM USB Download Driver【图2- 5】FriendlyARM USB Download Driver5. 打开超级终端(推荐SecureCRT,尽量别使用DNW,因为它对控制字符解析有问题),使用连接到console口的串口,这里用的是COM28,参数如下:【图2- 6】 串口参数6. 打开串口,回车,开发板会提示BIOS
27、菜单,这里的BIOS是存放在NOR FLASH中的Supervivi bootloader,如下:【图2- 7】 Boot菜单7. 打开dnw.exe程序,当dnw软件显示USB OK时,表示可以通过USB下载,如下:USB OK【】USB OK8. 按键盘“a”键,进入裸机程序下载,如下:下载提示【图2- 8】下载提示9. 选择dnw的USB port菜单中的Transmit/Restore子菜单,然后选u-boot.bin(u-boot编译出来的目标代码,编译好后放置在u-boot工程的根目录下),dnw会显示下载进度,如下:【图2- 9】下载进度10. 下载完成后,关闭开发板,把flas
28、h选择成Nand flash11. 开发板上电,在启动过程中按住回车键,开发板就会运行u-boot程序,如下:【图2- 10】U-Boot运行第3章 Linux Kernel定制3.1 问题如何获取Linux Kernel源码?如何配置编译Linux Kernel?如何运行调试Linux Kernel?3.2 概述一、 官方网站网址:/官网为我们提供了kernel工程的很多信息,其中包含:A. 提供http、ftp和rsync三种下载方式B. Linux介绍C. 新版Kernel的新功能D. 开发、维护和测试者的邮件列表E. FAQ站点地址F. Git地
29、址:/二、 获取源代码1 官网下载ü http和ftp下载这种方式比较直观,直接进入/,点击下载图标即可ü git工具下载在使用git之前,必须确认网络参数和DNS配置正确,且9418网络端口可以通。条件具备后,执行下面的命令获取Kernel源码:git clone git://pub/scm/linux/kernel/git/stable/linux-stable.git如果9418网络端口没有开放,可以使用http通路下载,下载方法:git clone http:
30、//pub/scm/linux/kernel/git/stable/linux-stable.git推荐使用前一种,后一种速度偏慢。2 芯片厂家提供芯片厂家提供开发板的同时,也会提供开发板使用的Kernel源代码,最好采用这种方式获取源代码,因为官方的源代码不一定支持开发板。三、 版本管理1 版本号Kernel版本号格式为“v主版本号.次版本号.错误修订次数”,如:v3.4.3,其中主版本号的改变表示重大架构变动,次版本号的改变表示局部变动,为偶数表示正式(稳定)版本,为基数表示非正式(非稳定)版本,所以版本v3.5-rc3为非正式(非稳定)版本,v3.4.3为正式
31、版本的第三次修订。2 git工具参考git内部结构.pdf和git简要说明.pdf这两本书四、 源代码规范应该遵守linux kernel源代码规范,请参考kernel/Documentation/CodingStyle五、 源代码结构【图3- 3】内核源代码模块图【图3- 4】内核源代码模块目录图说明1 用户程序运行在用户级的程序2 函数库标准C/C+库3 系统调用接口用户程序和库与内核的接口,由进程控制子系统、文件子系统和网络子系统提供4 进程控制子系统实现进程管理功能,主要有:ü 进程调度进程调度相关代码,存放在init和kernel目录,但是这两个目录下也包含其他系统核心代码
32、ü 进程间通信实现消息、信号量等进程之间的通信工具的代码,存放在ipc目录下ü 内存管理实现内存管理的核心代码,这个模块跟平台代码中的内存模块,共同实现内存管理,存放在mm目录下5 平台代码实现支持X86、ARM和MIPS等各种CPU架构的代码,存放在arch目录,ARM架构代码包含如下模块:ü 启动实现RamDisk和zImage分离的代码,存放在arch/arm/boot/bootp目录实现zImage自解压代码,存放在arch/arm/boot/compressed目录ü 核心实现Kernel启动和其它核心功能的代码,存放在arch/arm/ker
33、nel目录ü 内存内存管理代码,主要被内存管理模块所调用,存放在arch/arm/mm目录ü 库为arch/arm下的C代码,提供标准C库代码,存放在arch/arm/lib目录ü 配置文件存放各种开发板的Kernel配置文件存放在arch/arm/configs目录ü 头文件存放arch/arm代码的头文件,存放在arch/arm/include目录ü 厂家存放某个芯片厂家所有芯片都会使用到的公共代码,存放在arch/arm/plat-xx(如:arch/arm/plat-s3c 三星代码)目录ü 芯片系列存放某个系列芯片都会使用到
34、的公共代码,存放在arch/arm/plat-xxxx(如:arch/arm/plat-s3c64xx 三星64XX系列芯片代码)目录ü 机器存放使用某个芯片的所有机器的代码,存放在arch/arm/mach-xxx(如:arch/arm/mach-s3c6410 使用三星6410芯片的机器代码)目录6 文件子系统提供普通文件、设备文件及特殊文件的管理代码,存放在fs目录下ü 文件系统类型实现ext、yaffs、jaffs、sysfs等各种文件类型的文件系统代码,代码存放在fs目录下对应的目录下,如:fs/ext3目录存放的是ext3文件系统的实现代码7 网络子系统实现SO
35、CKET编程接口及TCP、UDP、ARP、ARAP等协议栈的代码,存放在net目录下8 设备驱动实现字符设备、块设备和网络设备驱动模型,以及各种设备驱动,可以被所有架构的CPU使用,存放在drivers目录下3.3 配置Kernel是一个开源内核,它被广泛移植到各种硬件平台,很多硬件厂家为它提供了设备驱动。很多的商业机构和工程师们为它开发了文件系统、网络协议栈.等模块,使得Kernel的模块急剧增长,已经有成千上万个成熟的模块可以供用户使用。每个用户不可能需要用到所有的模块,事实上,对于绝大部分用户来说绝大部分的模块是不需要使用的。用户需要快速的从这些模块中选出自己需要的模块,将它们进行组合配
36、置。3.3.1 配置目的1. 选择需要的模块例:mini2440开发板采用ARM cpu,那么需要选择ARM驱动模块2. 配置代码需要的数据例:需要将Kernel的本地版本号配置为“-FriendlyARM”3.3.2 配置项和配置文件n 配置项配置项用于描述模块的配置,它分为:选择配置项用于描述模块是否编译到Kernel?以何种方式编译到Kernel?类似于C语言中的条件编译的功能例:在配置文件中存在如下配置:CONFIG_ARM=yCONFIG_LIB80211=m第一行表示ARM驱动模块被静态编译到Kernel,第二行表示802.11协议库被动态编译到Kernel,即Kernel运行时需
37、要通过insmod命令加载该模块数据配置项用来表示代码中需要使用的数据,类似于C语言中的宏替换功能例:在配置文件中存在如下配置:CONFIG_LOCALVERSION="-FriendlyARM"表示Kernel代码中出现的CONFIG_LOCALVERSION都要用“-FriendlyARM”替换n 配置文件在Kernel工程中,默认配置文件是.config,它存放在Kernel源代码目录的根目录下,Kernel编译时按照这个默认配置文件进行编译3.3.3 配置命令1 设置默认配置ubuntuubuntu:/work/kernel/linux-$ cp c
38、onfig_mini2440_x35 .configubuntuubuntu:/work/kernel/linux-$config_mini2440_x35是mini2440开发板默认配置文件2 图形菜单配置在Kernel源码根目录下,运行make menuconfig命令,如下:ubuntuubuntu:/work/kernel/linux-$ make menuconfig会出现如下图形配置界面:配置界面的使用方法为:Ø 菜单项使用左右按键,移动选择光标选择<Select>、<Exit>和<help>使用上下按键
39、,移动选择光标选择配置菜单选中<Select>,按回车键,表示进入菜单选中<Exit>,按回车键,退回上级菜单选择<help>,按回车键,查看帮助信息后面带箭头的项都是菜单项Ø 配置项以尖括号打头的配置项,可以配置为三种状态中的任意一种,如下:按y键静态选择模块<*> Memory Technology Device (MTD) support按m键动态选择模块,这种模块是Kernel运行时通过insmod命令动态加载<M> Memory Technology Device (MTD) support按n不选中模块<
40、> Memory Technology Device (MTD) support以方括号打头的配置项,只能配置为两种状态中的任意一种,如下:按y键静态选择模块* Debugging 按n不选中模块 Debugging 以圆括号打头的配置项是数据配置项,数据可以是字符串、十进制和十六进制,如下:(0) Compressed ROM boot loader base address(0) Compressed ROM boot loader BSS address(Linux) Default kernel command string 上面两个是十进制数据,最后一个是字符串数据。数据配置项
41、需要选中<Select>,按回车键,进入才能输入,配置项可能会有输入范围限制,输入超出限制,系统会提示错误Ø 配置菜单项配置项+菜单项* Enable loadable module support ->必须先选中该配置项,才能进入这个菜单Ø 选择菜单项ARM system type (Samsung S3C64XX) ->进入菜单后,根据高亮提示选择选择菜单项用于将多个配置项以选择的方式组织在一起Ø 退出配置完成后,退出根菜单表示退出图形配置,如果我们已经修改了配置,它会提示是否需保存配置<Yes>保存, <No>
42、不保存,使用左右方向键选择,用回车确认Ø 注意1. 如果无法显示上面的图形界面,可能是没有安装ncurses库,请安装curses库,在ubuntu上面安装的方法是运行“sudo apt-get install libncurses5-dev”,运行命令前,请确保机器已经上网,且DNS服务器配置正确。2. make menuconfig命令在Kconfig工具的帮助下实现了Kernel模块的图形化配置,Kconfig工具使用方法及原理请参见附录B。3.4 编译编译器采用GCC,编译过程采用make和shell工具来进行控制,由于编译过程比较复杂,这里不做深入讲解,这里先看一下如何安装
43、GCC?如何配置Makefile?如何编译kernel?3.4.1 安装GCC这里的GCC是指交叉编译器,详见附录C中的安装交叉编译章节3.4.2 make配置打开kernel源代码目录,在顶级目录下有一个Makefile,修改下面Makefile变量为:ARCH?= armCROSS_COMPILE?= arm-linux-ARCH变量告诉make目标代码将运行在arm cpu上,CROSS_COMPILE变量告诉make采用的交叉编译器命令前缀3.4.3 编译kernelü 编译kernel在kernel源码根目录下,直接执行make all命令,如下:ubuntuubuntu:
44、/work/kernel/linux-$ make all编译成功后,在arch/arm/boot/目录下会生成一个内核映像文件zImageü 清除编译在kernel源码跟目录下,直接执行make clean命令,如下:ubuntuubuntu:/work/kernel/linux-$ make clean3.5 实验Kernel的配置和编译讲解之后,大家可能还是很迷糊,到底如何定制Kernel?下面我们通过一个Kernel的定制实验来进一步理解:n 目的1 掌握Kernel开发环境的搭建2 掌握Kernel的配置、编译及调试过程n 前提条件本实验必须
45、在2.5节的U-Boot实验成果基础之上进行n 步骤1 配置网络请见“附录C中的搭建开发网络”章节2 搭建tftp服务器请见“附录C中的搭建tftp服务器”章节3 安装Kernel源码1. 用Samba共享,把开发包中的内核源码拷贝到虚拟机中,结果如下:ubuntuubuntu:/work/kernel$ lslinux--mini2440-20100921.tar.gz2. 解压ubuntuubuntu:/work/kernel$ tar zxvf linux--mini2440-20100921.tar.gzubuntuubuntu:/work/kernel
46、$ lslinux- linux--mini2440-20100921.tar.gz4 配置Kernel1. 设置默认配置ubuntuubuntu:/work/kernel/linux-$ cp config_mini2440_x35 .configubuntuubuntu:/work/kernel/linux-$2. 图形菜单配置ubuntuubuntu:/work/kernel/linux-$ make menuconfig这条命令执行后会出现图形配置界面,根据自己需要进行配置,即使使用默认配置,也需要先进入图
47、形配置界面,然后再退出,否则编译时会报错5 编译Kernelubuntuubuntu:/work/kernel/linux-$ make需要10至30分钟进行编译,编译完之后继续往下进行6 运行调试KernelU-Boot为我们提供了Kernel的开发启动调试环境,我们可以通过配置U-Boot让开发板自动从tftp服务器下载Kernel映像并且启动Kernel。1. 安装mkimage工具U-Boot启动Kernel时,需要一些Kernel信息,这些信息必须存放在Kernel映像文件的开头,所以要使用mkimage工具来制作特殊的Kernel映像文件。mkimage是U-Boo
48、t自带的,U-Boot编译好后,在tools目录下会产生它。安装mkimage文件的命令如下:sudo cp /home/ubuntu/work/Boot/u-boot.1.3.2/tools/mkimage /bin/2. 制作U-Boot内核映像特殊的Kernel映像文件格式如图:【图3- 5】U-Boot专用Kernel映像文件结构制作命令格式为:tools/mkimage -A <arch> -O <os> -T <type> -C <comp> -a <addr> -e <ep> -n <name>
49、-d <data_file> uImage命令执行如下:ubuntuubuntu:/work/kernel/linux-$ mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -n linux -d arch/arm/boot/zImage uImageImage Name: linuxCreated: Mon Jan 28 20:38:14 2013Image Type: ARM Linux Kernel Image (uncompressed)Data Size: 22867
50、76 Bytes = 2233.18 kB = 2.18 MBLoad Address: 30008000Entry Point: 30008000生成uImage后将它拷贝到tftp的根目录,命令如下:ubuntuubuntu:/work/kernel/linux-$ cp uImage /home/ubuntu/work/tftpboot/3. 下载内核映像在U-Boot下,运行tftp命令,可以尝试下载uImage,如下:MINI2440 # tftp 0x32000000 uImagedm9000 i/o: 0x20000300, id: 0x90000a46 DM90
51、00: running in 16 bit modeMAC: 08:08:11:18:12:27TFTP from server ; our IP address is 05Filename 'uImage'.Load address: 0x32000000Loading:T #doneBytes transferred = 2286840 (22e4f8 hex)MINI2440 #注意:0x32000000是内核映像下载后的存放位置,在mini2440的开发板上,这个地址必须远大于U-Boot的启动地址0x300080004. 启
52、动内核映像在U-Boot下,运行bootm命令就可以启动内存中的内核映像,命令如下:MINI2440 # bootm# Booting kernel from Legacy Image at 32000000 . Image Name: linux Created: 2013-01-28 12:38:14 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2286776 Bytes = 2.2 MB Load Address: 30008000 Entry Point: 30008000 Verifying Che
53、cksum . OK Loading Kernel Image . OKOKStarting kernel .Uncompressing Linux.5. 配置U-Boot自动下载启动手动调试通过以后,可以让U-Boot自动完成上述过程,方法是配置bootcmd环境变量。修改U-Boot配置文件include/configs/mini2440.h中的启动命令配置,把对应的配置项修改成如下值:#define CONFIG_BOOTCOMMAND"tftp 32000000 uImage;bootm"重新编译U-Boot并且更新到开发板上。6. 测试U-Boot自动下载重启开发板,Kernel就会自动启动了。第4章 文件系统原理4.1 问题什么是文件系统?如何实现文件系统?常用的文件系统有哪些?为什么需要这些文件系统?4.2 文件系统基础文件在我们日常生活中随处可见,相信大家并不陌生,我们经常在电视上听“xxx号中央文件”,“XX文件指示精神”,“公司的XX文件”.等,它们都是指纸上或电脑上存放的文字的内容。文件系统我们在日常生活中则很少听说,但是它确实
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 多模态资源与机器辅助翻译在医学课堂口译中的应用-公共卫生硕士课程交替传译实践报告
- 道法国家主席的职权 教学设计-2025-2026学年统编版道德与法治八年级下册
- 社区消防安全应急预案合集15篇
- 项目负责人开工发言稿
- 百东院区新建医用电子直线加速器应用项目环境影响报告表
- 丝绸店铺营销方案(3篇)
- 云南洗车施工方案(3篇)
- 会员营销测试方案(3篇)
- 儿童会议营销方案(3篇)
- 养土鸡营销方案(3篇)
- 园艺学进展课程课件
- 产品设计文档撰写规范案例示范版
- 蒸汽工程安装方案(3篇)
- 颅内动脉急诊取栓技术
- 2025年四川大学教育培训部业务岗工作人员招聘考前自测高频考点模拟试题附答案详解
- 江苏省2025年接受高级访问学者的高等学校
- 村民自治课件
- 2024注册核安全工程师考试历年机考真题集附完整答案详解
- gmp规范培训课件
- 腰椎术后伤口感染管理要点
- 狱内案件立案表宁夏警官职业应用法律系87课件
评论
0/150
提交评论