??xml version="1.0" encoding="utf-8" standalone="yes"?> U别: 初
陈渝
(yuchen@tsinghua.edu.cn)清华大学 2004 q?10 ?01 ?/p>
前两文章分别介l了 SkyEye 目及其安装Q下面的几篇文章对其设计实现展开讨论?/p>
SkyEyeZGDB/ARMulator(目前由David McCullough l护)Qƈq行了全面的改变和扩展。SkyEye建立在GNU GDB的底层,可以模仿多种完整的嵌入式计算机系l,目前模拟的硬件包括CPU、内存、I/O寄存器、时钟、UART、网l芯片、MMU、CACHEQ将来还会模?LCD、USB{各U硬件。在SkyEye上运行的操作pȝ和各U系lY?意识"不到它们是在一个虚拟的计算机系l上q行? SkyEye从M上分为四个层ơ: SkyEye目标模拟模块模拟的硬仉辑l构囑֦?0 1所C。SkyEye目标模拟模块从功能上可分为如下几大模块: SkyEye目标模拟模块中,各种数据l构很多Q用于模拟硬件M机构定义的主要数据结构有skyeye_config_t和ARMul_State。把握这两个数据l构Q是理解整个skyeye模拟的硬件体pȝ构的关键Q在q两个数据结构上q行q一步细化分析,则可充分了解skyeye的硬件体pȝ构细节?/p>
skyeye_config_tl构描述了SkyEye模拟的整个硬件的静态配|,它的具体内容如下Q?/p>
skyeye_config_tl构包含了CPU核心配置信息Qcpu、开发板配置信息Qmach、memory map 配置信息-mem、网l芯片和|络环境配置信息Qnet、面向主机的输入输出配置信息Quart、测试记录输出配|信息-log、模拟执行v始地址配置信息Qstart_address、是否有LCDQno_lcd和记录文件名信息Qconfig_file。这里面与模拟硬件紧密相关的是CPU核心配置信息、开发板配置信息、memory map 配置信息、网l芯片和|络环境、LCD配置信息?/p>
描述CPU核心的结构定义在cpu_config_t数据l构中,具体内容如下Q?/p>
其具体描q解释如下: SkyEye定义了一个cpu_config_tl构的数l?位于skyeye_option.c?Q结构如下: machine_config_tl构描述了开发板配置信息Q定义在skyeye_config.h中,具体内容如下Q?/p>
其具体描q解释如下: SkyEye定义了一个machine_config_tl构的数l?位于skyeye_option.c?Q结构如下:
4. mem_config_t和mem_bank_t数据l构
SkyEye的内存映配|结构由mem_config_t和mem_bank_t数据l构描述。ARM体系l构与x86体系l构在I/O内存映射上有所不同。X86体系l构可以使用I/O端口来映外部设备上的寄存器和设备内存;而ARM体系l构是通过标准的memory地址I间来映外讄寄存器或讑֤内存Q而且在通常情况下,I/O地址I间不会通过CACHEq行~存。目前SkyEye支持三种cd的内存映:ROM SPACE(只读)、RAM SPACE(可读?、IO SPACE(可读写,与特定开发板相关)。SkyEye对这三种cd的内存映的处理是不同的。在SkyEye中把一D连l的地址I间UCؓ一个mem_bankQ多个mem_bank之间不一定连l。mem_config_t数据l构的具体内容如下: 其中 bank_num用来记录当前的硬仉|中的mem_bankLQcurrent_num是用于解析skyeye.conf中的mem_bank配置信息的一个辅助变量,mem_banks数组具体记录了每个mem_bank的类型和相关的访问函数。mem_bank_t数据l构的具体内容如下: 其中的read/write_* 函数指针分别对应了不同类型内存映的讉K函数Qaddr表示mem_bank的v始地址Qlen表示mem_bank_的大;filename是binary image文g名;type表示mem_bank的类型。函数指针赋值等配置q程由skyeye_options.c中的函数do_mem_bank_option完成。如果在skyeye.conf中存在binary image文g名,则do_mem_bank_option函数会把文g内容d到对应的mem_bank中?/p>
SkyEye支持|络模拟Q目前描q网l配|的数据l构是net_config_tQ它的具体内容如下: 其中各个field的含义描q如下: 目前可以使用的两U方式有 NET_MOD_VNET(与SkyEye提供的vnet.o内核模块q行|络交互)?NET_MOD_TUNTAP(与linux的tun.on内核模块q行|络交互)?/p>
有关8019AS模拟芯片(NE2000兼容)的具体配|与实现位于文gskyeye-ne2k.[ch]中。有关网l模拟的具体实现可参考错误!未找到引用源。节?/p>
上面讲述的是与SkyEye的硬仉|相关的数据l构Q可以理解ؓ一U静态硬仉|的数据l构Q这些数据结构中的域基本不随着SkyEye模拟g的运行而改变。而ARMul_State描述的是一U动态硬仉|的数据l构Q它保存了随着SkyEye模拟g的运行而时L变的g数据。由于ARMul_State中的域数量繁多,大体分ؓ q里只描q其中关键的部分Q?/p>
其它与特定CPU和开发板相关的各Uio寄存器的定义攑ֈ了各个与开发板相关的文件中Q如skyeye_mach_at91/ep7312/pxa/sa.c{处Q详解请参?SkyEye的开发板IO模拟实现"?/p>
与具体开发板相关的io部分 instr是记录当前的中断状? 了解SkEye的M逻辑执行程Q对了解g的体pȝ构和软g/g的接口有较大帮助。从M上,可把SkyEye逻辑执行程按执行的旉序划分Z个阶D: 1. SkyEye加蝲与配|处理过E?/p>
2. SkyEye模拟执行q程 W一阶段为第二阶D늚正常执行做了充分的准备,具体的执行内容包括; 其中ȝ初始化函数是位于wrapper.c中的init函数Q它调用如下函数完成整个模拟g的初始化工作Q?/p>
W二阶段Ҏ特定g的配|描qͼ开始执行特定硬件模拟处理。整个过E围lCPU执行指o展开Q根据模拟硬件可分ؓ如下几个阶段Q?/p>
处理讉K内存/IO的指令的相关内容集中在armvirt.cQ与MMU/CACHE处理、read/write buffer(用于StrongARM和XScale体系l构的模?处理相关的文件包括armmmu.[ch]、mmu/*.[ch]Q与讉Kmemory模拟有关的内容主要集中在armmem.[ch]中?/p>
下一文章将讨论 CPU/开发板仿真?/p>
陈渝, 清华大学Q通过 yuchen@tsinghua.edu.cn 可以和他联系? U别: 初
陈渝
(yuchen@tsinghua.edu.cn)清华大学 2004 q?9 ?01 ?/p>
SkyEye模拟的硬仉|和模拟执行行ؓ由配|文件skyeye.conf中的选项定。根据选项的功能,skyeye.conf的选项分ؓg配置选项和模拟执行选项。根据参数的个数Qskyeye.conf的选项主要׃U组成: 目前skyeye.conf的配|定义如下: 例如Q? 例如Q? 格式Q? SkyEye目标模拟模块模拟的硬仉辑l构囑֦?0-1所C?/p> 目前SkyEye在Linux操作pȝ下运行得很好Q?SkyEye通过MingW或cywgin软g也可以在Windows环境中运行?/p>
下面我们以在RedHat 9.0环境的SkyEye安装Z: 首先需要从解开skyeye-x.x.x.src.tar.bz2软g包(x.x.x代表SkyEye的版本号Q开始,按照软g包中的SkyEye.README或README文g中介l的步骤q行Q下面命令中?#"是shell提示W,用户不用输入Q: (1) 解压源码包(假定skyeye-x.x.x.src.tar.bz2攑֜本机?/usr/src"目录下)Q会在当前目录生成一个skyeye的目? (2) q入解压SkyEye目录Q配|SkyEye (3) 然后是编译和安装Q正执行完下面的指令且命o正常l束后,pȝ中的/usr/local/bin/skyeye 执行E序是安装好的SkyEye软g。) 在编译安装过E中Q须注意以下几点Q?/p>
下面我们以SkyEye模拟ZAtmel AT91X40的开发板Qƈq行μClinuxZ来讲解SkyEye的具体用?/p>
先安装交叉编译器。注意这里最好用root用户来执行如下操作。将arm-elf-tools-20011219.tar.gzQ?0011219是该工具的生时_也可以选择更新的arm-elf-tools。)在本机的根目录下用tar命o解开Q假定arm-elf-tools-20011219.tar.gz攑֜本机的根目录"/"下)。具体命令(下面命o中的"#"是shell提示W,用户不用输入Q如下: 然后uClinux-dist-20020927.tar.gzQ假定该软g包放在本机的根目录下Q解开Q比如解开?usr/src/uClinux-dist/下,需要执行如下命令: 然后?usr/src/uClinux-dist/目录下执行如下命令: 在这两种界面下,在vendor/product选项中选择GDB/ARMulatorQkernel版本选择2.4.xQ其它选项不变Q然后保存配|退出,即选择save and exit选项?/p>
ҎA
如果要生成带调试信息的linux kernel执行文gQ在W一步执行完后,l箋执行如下命oQ?
ҎB
如果想一步生成带调试信息的linux kernel执行文g和linux kenel 执行文g映像和磁盘映像文件romfs.imgQ可单地q行命oQ? 假定SkyEye的工作目录位?usr/src/uClinux-dist下,首先要进行一些准备工作: 在工作目录下建立专门用于ZAT91X40开发板的SkyEyeg配置文gskyeye.conf。一个简单的Ҏ是从SkyEye软g包中的README文g中截取一块内容(?FOR AT91 (1) special for uclinux"开始的一行,从它下面W三行开始截取,共取9行)作ؓskyeye.conf的内容,具体内容如下Q?/p>
q样我们可以通过如下命o看看?usr/src/uClinux-dist目录下的skyeye.conf文g是否与上面的内容一_ 在用SkyEye时要注意以下几点Q?/p> a .注意要在 memmap.confQskyeye-0.2以前版本的配|文Ӟ或skyeye.confQskyeye-0.2以后版本的配|文Ӟ和boot.rom所在目录下执行skyeye?/p> b. memmap.conf ?skyeye.conf都是skyeye的硬仉|文件。memmap.conf 适用于skyeye0.2以下版本Q而skyeye.conf 用于skyeye0.2以上版本?/p> c. q行带网l选项的硬仉|时Q注意用户必Mؓroot用户Q而且当前的可执行路径中可以搜索到ifconfig命o d. q行带网l选项的硬仉|时Q需要编译安装内核模块tuo.o (在RedHatpȝ中,该模块在/lib/modules/2.4.x/kernel/drivers/net/tun.o) e. 请阅读skyeye.conf.txt来获得skyeye.conf的配|选项的含?/p> f. 可参考skyeye-binary-testutils-x.x.x.tar.bz2软g包(x.x.x代表其的版本P中已l设定好的skyeye.conf来配|特定的g模拟环境Qƈ可尝试用SkyEyeq行q个软g包中~译好的操作pȝ内核?/p> 下面是一些skyeye.conf的例子: 本文讲解了SkyEyeg模拟q_的硬仉|选项Q以及如何安装用SkyEye。如果读者能够熟l掌握SkyEye的用,则会提高开发、调试操作系l等的进度,特别是对操作pȝ、驱动程序如何与嵌入式硬件系l进行交互有更深ȝ了解?/p> 陈渝, 清华大学Q通过 yuchen@tsinghua.edu.cn 可以和他联系? U别: 初
陈渝
(yuchen@tsinghua.edu.cn)清华大学 2004 q?9 ?01 ?/p>
2002q?1月,一个偶然的ZQ一操作系l的爱好者在|上q行聊天Q成立了一个TMQLinux兴趣组Q希望要做一些感兴趣的事情。当时在清华大学计算机系做博士后的陈渝提出做一个用软g实现的嵌入式开发板g模拟器,可以在模拟器上运行各U操作系l,q样可以在没有开发板的情况下学习和研I操作系l。一开始就陈渝一人做Q首先他了解了当前国际上的一些类似的目Q发现著名的μCLinuxl织实现了一个armulator模拟器YӞ在Linuxpȝ上运行)Q可以模拟Ateml AT91Q基于ARM7TDMI CPUQ开发板QμCLinux可以在armulatorQ其|址为http://www.uclinux.org/pub/uCLinux/utilities/armulator/Q上q行。于是陈渝以此ؓ基点Q借鉴armulator的实玎ͼ提出了SkyEye目Q其目标是让SkyEye仿真多种L的嵌入式开发板和外设,实现一个可扩展的硬件模拟框Ӟ让更多的嵌入式操作系l可以在SkyEye上运行。SkyEye目?002q?2?日正式徏立后Q陈渝完成的W一件工作是把armulatorULCcygwin/windows环境下,其成果被μCLinuxl织接收。接下来清华大学计算机系士生李明加入到SkyEye的开发中Q?天后QSkyEye的第一个版本推出,再过?天,μC/OS-II for SkyEye推出。在q期_SkyEye的网站也建立h了。紧接着Q杨晔、王利明、a首一{在校学生也加入到SkyEye的开发中Q给SkyEye带来了新的活力,SkyEyeq入了新的发展阶D,目前通过讉KSkyEye的网站(http://www.skyeye.org/Q和在linux公社上的SkyEye论坛Q?http://www.linuxfans.orgQ可以了解到SkyEye的最新进展ƈҎ兛_入式pȝ开发方面的问题q行交流Q还可以?http://gro.clinux.org/projects/skyeye/ 下蝲最新的SkyEye相关软g和文档? 如果你看q电?黑客帝国"Q又U?matrix"Q,怿电媄描述的虚qM界会深深地吸引你Q至它是我们看q最有想象力的科qȝ׃一。也许我们可以把SkyEye看作一?matrix "Q把q行在SkyEye上的各种E序看成是这?matrix"中的芸芸众生。我们创造SkyEye和编写运行在SkyEye上运行的E序是Zz悉计算机的奥秘Q尝当"造物?的感觉。当看到各种软gLinux、μCLinux、μC/OS-II...在SkyEye?愉快"地运行时Q那U感觉真是太奇妙了? 对于那些惌行嵌入式pȝ软g开发和学习Q或者想研究嵌入式Linux{操作系l和一些底层系lYӞ如TCP/IP{)的研I和开发h员来_可能存在如下几方面的问题Q(1Q经常苦于经费不I~少_的硬件开发板和完善的软g开发环境,相关的书c对一些最新Y件的分析q不够全面,无法深入研究和开发嵌入式软g。(2Q高层次的Y件设计和开发一般不用太考虑底层g的实现细节,如果直接处于一个具体的g环境下,在开发和研究中可能会陷入g的具体细节中不能自拔Q而不能把_֊攑ֈ高层ơ的软g设计和开发上。(3Q如果硬件开发环境不太稳定(q种情况l常见到Q,且对具体的硬件不是很了解Q则可能在排除问题上p大量的不必要的时间。(4Q如果你惌己尝试设计一个操作系l,则先在一个提供源码调试的Y件仿真器上进行开发,可能会大大提高你的开发进度?/p>
对于想了解、学习一般操作系l的实现原理QLinux/μCLinux操作pȝ或TCP/IP{系l软g的实现的人员Q目前一般采用的Ҏ是看书和L代码Q这是一U静态的学习ҎQ效率较低,比较枯燥Q缺亲自实늚感觉。要x入分析和开发YӞp动手~程Q不能只是看看书Q读M码,只有通过亲手实践才能够掌握Y件设计的核心内容。上面所指出的问题和需求促使SkyEye目的诞生? SkyEye是一个开源YӞOpenSource SoftwareQ项目,中文名字?天目"。SkyEye的目标是在通用的Linux和Windowsq_上实C个纯软g集成开发环境,模拟常见的嵌入式计算机系l?q里假定"仿真"?模拟"的意思基本相?Q可在SkyEye上运行μCLinux以及μC/OS-II{多U嵌入式操作pȝ和各U系lYӞ如TCP/IPQ图形子pȝQ文件子pȝ{)Qƈ可对它们q行源码U的分析和测试?/p>
UY件的模拟器有许多U,如模拟一个芯片时序逻辑的模拟器、只模拟CPU指o的模拟器、模拟整个硬件开发板的模拟器、模拟一个PDA的模拟器{。存在一些纯软g的仿真器或模拟器Q如Stanford大学的SimOS模拟器,它仿真的是MIPSpdCPU和相兛_设,可以在其上运行SGI公司的Irix操作pȝ和YӞ目前基本上停止了q一步的开发;PSIM是一个仿真PowerPC指o集的模拟器,目前只支持简单的命o行应用程序;xcopilot是一个PDA模拟器,它是由Greg HewgillZ个h喜好~写的,它仿真的是M68K CPUQ通过它可以给ZPalmOS的Y件开发者提供一个模拟开发环境。Bochs是一个仿真x86 CPU的开源项目,目前q支持AMD64 CPUQ在它上面可以运行Linux操作pȝ。其它一些商业的仿真软g如vmware和virtualPC可以仿真一个真实的x86计算机,而Virtutech Simics仿真器可以仿真多UCPU和硬Ӟ功能强大Q可用于g和系lY件的评测?/p>
SkyEye是一个指令模拟器,可以模拟多种嵌入式开发板Q可支持多种CPU指o集,在SkyEye上运行的操作pȝ意识不到它是在一个虚拟的环境中运行,而且开发h员可以通过SkyEye调试操作pȝ和系lY件。由于SkyEye的目标不是验证硬仉辑Q而是协助开发、调试和学习pȝ软gQ所以在实现上SkyEye与真实的g环境相比q是有一定差别的。SkyEye在时钟节拍的时序上不保证与硬件完全相同,对Y仉明的一些硬件仿真进行了一定的化。这样带来的好处是SkyEye的执行效率更高。SkyEye的推出具有下面三斚w的意义: ?2位嵌入式CPU领域中,ARMpdCPU所占比重很大,而ARM7TDMI是其中最q泛的一UARM CPU核,因此SkyEye首先选择了ARM7TDMI作ؓ仿真的目标CPU核,当然来SkyEye会支持更多种cȝCPU。目前在SkyEye上可q行q进行源码调试ARM Linux、μCLinux、μC/OS-II操作pȝ和LwIPQ一个著名的嵌入式TCP/IP实现Q、MiniGUIQ一个著名的嵌入式GUIpȝQ等pȝ软g。SkyEye可用于学习,分析Q开发这些系lY件的实现Q了解ARM嵌入式CPU~程。而这一切都可在一个纯软g的环境中完成。通过分析SkyEye本n实现Q系lY件开发h员对ARMQ?019asQNE2000兼容Q以太网l芯片等g的了解也会更深入?/p>
SkyEyeq不能取代开发板{硬件的功能Q但通过它可以比较容易进入到嵌入式Y件的qK天地中。由于SkyEye建立在GDB基础之上Q用者可以方便地使用GDB提供的各U调试手D对SkyEye仿真pȝ上的软gq行源码U的调试Q还可以q行各种分析Q如执行热点分析、程序执行覆盖度分析{。由于SkyEye提供了源代码和相x档,有经验的用户完全可以修改和扩充SkyEye来满q需求?/p>
目前SkyEye模拟了大量的gQ包括CPU内核、存储器、存储器理单元、缓存单元、串口、网l芯片、时钟等。下面做一单介l?/p>
目前SkyEye可以模拟的CPU主要是基于ARM内核的CPUQ包括ARM7TDMIQARM720TQARM9TDMIQARM9xxQARM10xxQStrongARMQXScale{。ARM7/9/10TDMI是ARMpdCPU的基本核心部分,它们不支持MMU/CACHE和一些扩展指令,是ARM CPU基本核。ARM720T、ARM920T、ARM10xx、StrongARM、Xscale是徏立在以上ARM CPU怸Qƈ扩展了MMU/CACHE和其它功能。各g开发公司可以根据它们的需求在上述CPU怸加上特定的扩展,形成Z各种ARM基本核心的特定CPUQ如Atmel91X40?ep7312Q分别扩展了ARM7TDMI和ARM720T的内存控制和各种I/O控制器,化了开发板的逻辑设计Q大大增Z开发板的功能?/p>
目前SkyEye模拟的开发板包括ZAtmel 91X40/AT91RM92 CPU的开发板Q基于Crirus Logic ep7312的开发板、基于StrongARM CPU的ADSBITSY开发板Q基于XScale PXA250 CPU的LUBBOCK开发板、基于SAMSUNG S3C4510B/S3C44B0 CPU的开发板、基于SHARP LH7A400 CPU的开发板、基于Philip LPC22xx CPU的开发板{。主要模拟了对应各个开发板的串口、时钟、RAM、ROM、LCD、网l芯片等g外设?/p>
MMUQMemory Management UnitQ即存储器管理单元,是用来管理虚拟内存系l的g。MMU的两个主要功能是Q将虚地址转换成物理地址Q控制存储器的存取权限。MMUxӞ虚地址直接输出到物理地址ȝ。MMU本n有少量存储空间存放从虚拟地址到物理地址的匹配表Q此表称作TLB(Translation Lookaside Buffers)。TLB表中保存的是虚址及其对应的物理地址Q权限,域和映射cd。当CPU对一虚拟地址q行存取Ӟ首先搜烦TLB表以查找对应的物理地址{信息,如果没有查到Q则q行查找translation tableQ称为Translation Table WalkQ简UTTWQ。经qTTWq程后,查到的信息保存到TLB。然后根据TLB表项的物理地址q行d。CACHE是缓存单元,主要用于~存内存中的数据Q其d速度q快于内存的d速度Q所以可以提高CPU的内存数据的讉K效率?/p>
write/read bufferg单元的作用与CACHE的作用类伹{MMU、CACHE、write/read buffer一般是高性能CPU的重要组成部分,且不同类型CPU的MMU、CACHE、write/read buffer的逻辑行ؓ也有一定的差异。ؓ了支持模拟多U类型CPU的MMU/CACHEQSkyEye包含了一个通用的MMU/CACHE模拟实现。通过对一些参数的调整可以支持模拟多种cd的MMU/CACHE物理l构和逻辑行ؓ? 目前SkyEye模拟了网l芯?019ASQ其特点是:NE2000兼容Q内?16KRAM~冲区,10MB传输速率。虽然目前模拟的开发板上不一定有|络芯片8019ASQ但我们可以在我们模拟的开发板上加上网l芯?019AS的模拟。这样再加上在不同操作系l上?019AS驱动E序Q就可以方便地完成各U网l应用的开发和设计。目前已l在在基于Atmel91X40 CPU的开发板上实C|络芯片8019AS扩展Qƈ增加了μC/OS-II和μClinux的网l驱动程序,已经支持大量的网l应用程序,如LwIP Q一个TCP/IP协议栈实玎ͼ、nfs server/clinet、http server/client、telnet server/client、ftp server/client{?/p>
1QSkyEye设计原则 SkyEye软g的核心在目标模拟模块。ؓ了提高模拟效率,且能够模拟更多的CPU、开发板和各U外设,方便开发h员进行开发和学习QSkyEye遵@如下的设计原则: 保持与GDB上层接口的一致性,q样可充分利用GDB强大的源代码U调试功能?/p>
SkyEyeZGDB/ARMulator(目前由David McCullough l护)Qƈq行了全面的改变和扩展。SkyEye建立在GNU GDB的底层,可以模仿多种完整的嵌入式计算机系l,目前模拟的硬件包括CPU、内存、I/O寄存器、时钟、UART、网l芯片、MMU、CACHEQ将来还会模?LCD、USB{各U硬件。在SkyEye上运行的操作pȝ和各U系lY?意识"不到它们是在一个虚拟的计算机系l上q行? SkyEye从M上分为四个层ơ: 本文主要介绍了SkyEyeg模拟q_的v源、背景和发展状况。如果读者能够熟l掌握SkyEye的用,则会提高开发、调试操作系l等的进度,特别是对操作pȝ、驱动程序如何与嵌入式硬件系l进行交互有更深ȝ了解。SkyEyeq在不断地发展之中,对SkyEye感兴的读者需要跟t最新的SkyEye源码和相x档,q可在SkyEye论坛上与SkyEye开发h员进行实时交?/p>
陈渝, 清华大学Q通过 yuchen@tsinghua.edu.cn 可以和他联系?
文档选项
拓展 Tomcat 应用
回页?/font>
回页?/font>
typedef struct {
cpu_config_t *cpu;
machine_config_t *mach;
mem_config_t mem;
net_config_t net[NET_MAXNICNUM_PER_HOST];
uart_config_t uart;
log_config_t log;
ARMword start_address;
ARMword no_lcd;
char config_file[MAX_FILE_NAME];
} skyeye_config_t;
typedef struct {
const char *cpu_arch_name;
const char *cpu_name;
ARMword cpu_val;
ARMword cpu_mask;
ARMword cachetype;
} cpu_config_t;
cpu_config_t arm_cpu[] = {
{"armv3", "arm710", 0x41007100, 0xfff8ff00, DATACACHE},
{"armv3", "arm7tdmi", 0x41007700, 0xfff8ff00, NONCACHE},
{"armv4", "arm720t", 0x41807200, 0xffffff00, DATACACHE},
{"armv4", "sa1110", 0x6901b110, 0xfffffff0, INSTCACHE},
{"armv4", "sa1100", 0x4401a100, 0xffffffe0, INSTCACHE},
{"xscale", "xscale", 0x69052100, 0xfffffff0, INSTCACHE}
};
typedef struct machine_config{
const char *machine_name;
void (*mach_init)(ARMul_State *state,\
struct machine_config *this_mach);
void (*mach_io_do_cycle)(ARMul_State *state);
void (*mach_io_reset)(ARMul_State *state);
void (*mach_update_int)(ARMul_State *state);
ARMword (*mach_io_read_byte)(ARMul_State *state, ARMword addr);
void (*mach_io_write_byte)(ARMul_State *state, ARMword addr,\
ARMword data);
ARMword (*mach_io_read_halfword)(ARMul_State *state, \
ARMword addr);
void (*mach_io_write_halfword)(ARMul_State *state, ARMword addr,\
ARMword data);
ARMword (*mach_io_read_word)(ARMul_State *state, ARMword addr);
void (*mach_io_write_word)(ARMul_State *state, ARMword addr,\
ARMword data);} machine_config_t;
}machine_config_t
machine_config_t arm_machines[] = {
{"at91", at91_mach_init, NULL, ......},
{"ep7312", ep7312_mach_init, NULL, ......},
{"s3c4510b", s3c4510b_mach_init, NULL, ......},
{"s3c44b0", s3c44b0_mach_init, NULL, ......},
{"sa1100", sa1100_mach_init, NULL, ......},
{"pxa_lubbock", pxa_mach_init, NULL, ......} …?
};
typedef struct {
int bank_num;
int current_num;
mem_bank_t mem_banks[MAX_BANK];
} mem_config_t;
typedef struct mem_bank_t {
ARMword (*read_byte)(ARMul_State *state, ARMword addr);
void (*write_byte)(ARMul_State *state, ARMword addr, ARMword data);
ARMword (*read_halfword)(ARMul_State *state, ARMword addr);
void(*write_halfword)(ARMul_State *state, ARMword addr, ARMword data);
ARMword (*read_word)(ARMul_State *state, ARMword addr);
void (*write_word)(ARMul_State *state, ARMword addr, ARMword data);
unsigned long addr, len;
char filename[MAX_STR];
unsigned type;
} mem_bank_t;
回页?/font>
typedef struct {
int state;
unsigned char macaddr[6];
unsigned char hostip[4];
int ethmod;
int fd;
int hubindex;
int (*net_init)(int index, unsigned char *macaddr, unsigned char *hostip);
unsigned char (*net_output)(int if_fd, ARMul_State *state,\
unsigned char startpage,unsigned short packet_len);
void (*net_input)(int if_fd, ARMul_State *state);
}net_config_t;
ARMul_io mach_io;
其中ARMul_io的结构目前ؓ
struct ARMul_io
{
ARMword *instr; //to display the current interrupt state
ARMword *net_flag;//to judge if network is enabled
ARMword *net_int; //netcard interrupt
ARMword *lcd_is_enable; //turn lcd on?
ARMword *lcd_addr_begin; //the begining display mem addr of lcd
ARMword *lcd_addr_end; //the end display mem addr of lcd
};
net_flag判断|络选项是否打开
net_int用来记录|络中断?
lcd_is_enable来记录LCD是否使能
lcd_addr_begin记录lcd昑֭的v始位|?
lcd_addr_end记录昑֭的结束位|?
]]>
文档选项
拓展 Tomcat 应用
格式为:
symbol: value
symbol可以是硬件定义,如cpu、mach{,也可以是执行控制定义Q如log{?
value是symbol对应的|可能是数字也可能是字W串?
格式为:
symbol:opt1=value1,opt2=value2,......
opt1是参数名Qvalue1是opt1对应的|可能是数字也可能是字W串?
目前存在的选项有:arm710、arm7tdmi、arm720t、arm920t、sa1100、sa1110、xscale
格式?
cpu: cpuname
注:cpuname表示一个代表cpu名字的字W串?
例如Q?
cpu: arm7tdmi
目前存在的选项有:at91、ep7312、adsbitsyQpxa_Lubbock、lpc、s3c4510b、s3c44b0、cs89712、sa1100、at91rm92、sharp_lh7a400
格式为:
mach: machinename
注:cpuname表示一个代表基于特定CPU的开发板名字的字W串?
例如Q?
mach: at91
一个内存组内的地址是连l的Q类型分为RAM SPACE, ROM SPACE, mapped IO SPACE
格式为:
mem_bank: map=M|I, type=RW|R, addr=0xXXXXXXXX, size=0xXXXXXXXX,file=imagefilename,boot=yes|no
file的值imagefilename是一个字W串Q实际上表示了一个文Ӟ一般是一个可以执行的binary image格式的可执行E序或OS内核文g或是一个binary image格式的根文gpȝ。如果存在这个文ӞSkyEye会把文g的内容直接写到对应的模拟内存l地址I间中?
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=./boot.rom
mem_bank: map=M, type=RW, addr=0x10000000, size=0x00000800, file=./loader.bin,boot=yes
格式?nic: state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
注:xx表示两位16q制敎ͼdd表示两位10q制?
net: state=on, mac=0:4:3:2:1:f, ethmod=tuntap, hostip=10.0.0.1
格式?lcd: state=on/off
state=on表示LCD处于接通状态; state=off 表示LCD处于关闭状态?
例如Q?
lcd: state=on
uart选项可以控制skyeye在另一个与某个串口q接的终端上输入/输出字符
格式Q?
uart: fd_in=indevname, fd_out=outdevname
例如Q?
uart: fd_in=/dev/ttyS0, fd_out=/dev/ttyS0
log选项用于控制skyeye输出gpȝ的执行状态信息,包括每次执行指o时的执行指o倹{寄存器倹{各U硬件状态等?
格式Q?
log: logon=0|1, logfile=filename, start=number1, end=number2, length=number3
log: logon=0, logfile=/tmp/sk1.log, start=100000, end=200000, length=100
?0 1 SkyEyeg模拟逻辑l构?/b>
回页?/font>
#cd /usr/src
# tar xjvf skyeye-x.x.x.src.tar.bz2
#cd skyeye
如果是SkyEye 0.6.0以前的版本,q行下面的命令进行配|: # ./configure --target=arm-elf --prefix=/usr/local --without-gtk-prefix --without-gtk-exec-prefix --disable-gtktest
如果你的SkyEye版本大于0.6.0Q则带有LCD仿真支持。ؓ了增加对LCD仿真的支持,则运行如下命令: # ./configure --target=arm-elf --prefix=/usr/local
# make
# make install
ln -s /usr/include/ncurses/termcap.h /usr/local/include/termcap.h
回页?/font>
#cd /
# tar /zxvf arm-elf-tools-20011219.tar.gz
# cd /usr/src
# tar zxvf /uClinux-dist-20020927.tar.gz
# make xconfig
# make menuconfig
# make dep; make linux
q时?usr/src/uClinux-dist/linux-2.4.x目录下生成具有ELF执行文g格式的linux内核文g。到q一步还没有生成文gpȝQؓ了生成文件系l,q需要执行如下命令: # make romfs; make image
如果?usr/src/uClinux-dist/images/下存在文?romfs.imgQ表C文件系l生成成功?# make dep; make
p了。可查看/usr/src/uClinux-dist/images/下是否有文g romfs.img{在/usr/src/uClinux-dist目录下,如果有,表示~译安装成功?
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=./boot.rom
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
# more /usr/src/uClinux-dist/skyeye.conf
然后是徏立文件系l的联接Q需要在目录/usr/src/uClinux-dist目录下执行如下命令: #ln -s images/romfs.img boot.rom
q主要是与skyeye.conf中的内容保持一_大家可注意skyeye.conf中的W?行?
完成上述准备工作后,可以用SkyEye来运行和调试μClinux内核了,我们可以试如下命oQ?#"?(SkyEye)"后面跟着的字W串是需要用者输入的Q:
# cd /usr/src/uClinux-dist
# /usr/local/bin/skyeye linux-2.4.x/linux
(SkyEye)target sim
cpu info: armv3, arm7tdmi, 41007700, fff8ff00, 0
mach info: name at91, mach_init addr 0x813ebc0
SKYEYE: use arm7100 mmu ops
Loaded ROM ./boot.rom
Connected to the simulator.
(SkyEye)load
Loading section .init, size 0xa000 vma 0x1000000
Loading section .text, size 0xc5cb0 vma 0x100a000
Loading section .data, size 0x8320 vma 0x10d0000
Start address 0x1000000
Transfer rate: 7077504 bits/sec.
(SkyEye)run
Starting program: /usr/src/uClinux-dist/linux-2.4.x/linux
Linux version 2.4.19-uc1 (root@hpclab.cs.tsinghua.edu.cn) (gcc version 2.95.3 20010315 (release)
(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from
http://www.snapgear.com/)) #1 Sun Sep 5 12:00:39 HKT 2004
Processor: Atmel AT91M40xxx revision 0
Architecture: EB01
…?
你还可以在run之前lkernel讄断点来调试?FOR AT91 (0) special for ucosii
-------------------------------------------
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
FOR AT91 (1) special for μClinux
-------------------------------------------
#skyeye config file sample
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=./boot.rom
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
#set nic info state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
net: state=on, mac=0:5:3:2:1:f, ethmod=tuntap, hostip=192.168.2.1
FOR ep7312 (1) special for linux
-------------------------------------------
cpu: arm720t
mach: ep7312
mem_bank: map=I, type=RW, addr=0x80000000, size=0x00010000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00200000
mem_bank: map=M, type=RW, addr=0xc0200000, size=0x00200000, file=./initrd.img
mem_bank: map=M, type=RW, addr=0xc0400000, size=0x00c00000
FOR StrongArm SA1100 (1) speciall for linux
-------------------------------------------
cpu: sa1100
mach: sa1100
mem_bank: map=I, type=RW, addr=0x80000000, size=0x40000000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00800000
mem_bank: map=M, type=RW, addr=0xc0800000, size=0x00400000, file=./initrd.img
mem_bank: map=M, type=RW, addr=0xc0c00000, size=0x01400000
mem_bank: map=I, type=RW, addr=0xe0000000, size=0x08000000
#0xe0000000 128M cache flush memory bank
回页?/font>
]]>
文档选项
拓展 Tomcat 应用
回页?/font>
回页?/font>
回页?/font>
]]>
Anand K Santhanam
(asanthan@in.ibm.com), 软g工程? IBM Global Services
Vishal Kulkarni (kvishal@in.ibm.com), 软g工程? IBM Global Services
2002 q?3 ?01 ?/p>
如果您刚接触嵌入式开发,那么大量可用的引D载程序(bootloaderQ、规模羃的分发版(distributionQ、文件系l和 GUI 看v来可能太多了。但是这些丰富的选项实际上是一U恩赐,允许您调整开发或用户环境以完全符合您的需要。对 Linux 嵌入式开发的概述帮助您理解所有这些选项?/blockquote>Linux 正在嵌入式开发领域稳步发展。因?Linux 使用 GPLQ请参阅本文后面?参考资?/font>Q,所以Q何对?Linux 定制?PDA、掌上机或者可佩带讑֤感兴的人都可以从因特网免费下蝲其内核和应用E序Qƈ开始移植或开发。许?Linux 改良品种q合了嵌入式Q实时市场。它们包?RTLinuxQ实?LinuxQ、uclinuxQ用于非 MMU 讑֤?LinuxQ、Montavista LinuxQ用?ARM、MIPS、PPC ?Linux 分发版)、ARM-LinuxQARM 上的 LinuxQ和其它 Linux pȝQ请参阅 参考资?/font>以链接到本文中提到的q些和其它术语及产品。)
嵌入?Linux 开发大致涉及三个层ơ:引导装蝲E序、Linux 内核和图形用L面(或称 GUIQ。在本文中,我们集中讨论涉及这三层的一些基本概念;深入了解引导装蝲E序、内核和文gpȝ是如何交互的Qƈ研I可用于文gpȝ、GUI 和引D载程序的众多选项中的一部分?/p>
引导装蝲E序通常是在Mg上执行的W一D代码。在象台式机q样的常规系l中Q通常引D载程序装入主引导记录QMaster Boot RecordQ?MBR)Q中Q或者装?Linux ȝ的磁盘的W一个扇Z。通常Q在台式机或其它pȝ上,BIOS 控制移交给引导装蝲E序。这提Z一个有的问题Q谁引D载程序装入(在大多数情况中)没有 BIOS 的嵌入式讑֤上呢Q?/p>
解决q个问题有两U常规技术:专用软g和微的引导代码Qtiny bootcodeQ?/p>
专用软g可以直接与远E系l上的闪存设备进行交互ƈ引D载程序安装在闪存的给定位|中?闪存讑֤是与存储讑֤功能cM的特D芯片,而且它们能持久存储信??卻I在重新引导时不会擦除其内宏V?
q个软g使用目标Q在嵌入式开发中Q嵌入式讑֤通常被称?目标Q上?JTAG 端口Q它是用于执行外部输入(通常来自L机器Q的指o的接口。JFlash-linux 是一U用于直接写闪存的流行工兗它支持为数众多的闪存芯片;它在L机器Q通常?i386 机器 ?本文中我们把一?i386 机器UCؓ LQ上执行q过 JTAG 接口使用q行端口讉K目标的闪存芯片。当Ӟq意味着目标需要有一个ƈ行接口它能与主机通信。Jflash-linux ?Linux ?Windows 版本中都可用,可以在命令行中用以下命o启动它:
Jflash-linux <bootloader>
某些U类的嵌入式讑֤h 微小的引g?/b>?Ҏ几个字节的指??它将初始化一?DRAM 讄q启用目标上的一个串行(或?USBQ或者以太网Q端口与LE序通信。然后,LE序或装入程序可以用这个连接将引导装蝲E序传送到目标上,q将它写入闪存?
在安装它q给予其控制后,q个引导装蝲E序执行下列各类功能Q?/p>
- 初始?CPU 速度
- 初始化内存,包括启用内存库、初始化内存配置寄存器等
- 初始化串行端口(如果在目标上有的话)
- 启用指oQ数据高速缓?
- 讄堆栈指针
- 讄参数区域q构造参数结构和标记Q这是重要的一步,因ؓ内核在标识根讑֤、页面大、内存大以及更多内Ҏ要用引导参敎ͼ
- 执行 POSTQ加电自Q来标识存在的设备ƈ报告M问题
- 为电源管理提供挂P恢复支持
- 跌{到内核的开?
带有引导装蝲E序、参数结构、内核和文gpȝ的系l典型内存布局可能如下所C:
清单 1. 典型内存布局
/* Top Of Memory */ Bootloader Parameter Area Kernel Filesystem /* End Of Memory */
嵌入式设备上一些流行的q可免费使用?Linux 引导装蝲E序?Blob、Redboot ?BootldrQ请参阅 参考资?/font>获得链接Q。所有这些引D载程序都用于Z ARM 讑֤上的 LinuxQƈ需?Jflash-linux 工具用于安装?
一旦将引导装蝲E序安装到目标的闪存中,它就会执行我们上面提到的所有初始化工作。然后,它准备接收来自主机的内核和文件系l。一旦装入了内核Q引D载程序就控制{l内核?/p>
![]()
![]()
![]()
![]()
回页?/font>
讄工具铑֜L机器上创Z个用于编译将在目标上q行的内核和应用E序的构建环??q是因ؓ目标g可能没有与主机兼容的二进制执行别?/p>
工具铄一套用于编译、汇~和链接内核及应用程序的lgl成?q些lg包括Q?/p>
- Binutils ?用于操作二进制文件的实用E序集合。它们包括诸?
ar
?as
?objdump
?objcopy
q样的实用程序?- Gcc?GNU C ~译器?
- Glibc?所有用户应用程序都链接到?C 库。避免用Q?C 库函数的内核和其它应用程序可以在没有该库的情况下q行~译?
构徏工具铑־立了一个交叉编译器环境?本地~译?/i>~译与本机同cȝ处理器的指o?交叉~译?/i>q行在某一U处理器上,却可以编译另一U处理器的指令。重头设|交叉编译器工具铑֏不是一简单的dQ它包括下蝲源代码、修补补丁、配|、编译、设|头文g、安装以及很多很多的操作。另外,q样一个彻底的构徏q程对内存和盘的需求是巨大的。如果没有够的内存和硬盘空_那么在构建阶D는于相x、配|或头文件设|等问题会突然冒多问题?
因此能够从因特网上获得已预编译的二进制文件是一件好事(但不太好的一ҎQ目前它们大多数只限于基?ARM 的系l,但迟早会改变的)。一些比较流行的已预~译的工具链包括那些来自 CompaqQFamiliar Linux Q、LARTQLART LinuxQ和 EmbedianQ基?Debian 但与它无养I的工具链 ?所有这些工具链都用于基?ARM 的^台?/p>
Linux C正积极地为新gd功能部g和支持、在内核中修正错误ƈ且及时地q行常规改进。这D大约?6 个月Q或 6 个月不到Q就有一个稳定的 Linux 树的新发行版。不同的l护者维护针对特定体pȝ构的不同内核树和补丁。当Z个项目选择了一个内核时Q您需要评估最新发行版的稳定性如何、它是否W合目要求和硬件^台、从~程角度来看它的舒适程度以及其它难以确定的斚w。还有一点也非常重要Q找到需要应用于基本内核的所有补丁,以便为特定的体系l构调整内核?/p>
内核布局分ؓ特定于体pȝ构的部分和与体系l构无关的部分。内怸特定于体pȝ构的部分首先执行Q设|硬件寄存器、配|内存映、执行特定于体系l构的初始化Q然后将控制转给内核中与体系l构无关的部分。系l的其余部分在这W二个阶D|间进行初始化。内核树下的目录 arch/ ׃同的子目录组成,每个子目录用于一个不同的体系l构QMIPS、ARM、i386、SPARC、PPC {)。每一个这L子目录都包含 kernel/ ?mm/ 子目录,它们包含特定于体pȝ构的代码来完成象初始化内存、设|?IRQ、启用高速缓存、设|内栔R面表{操作。一旦装入内核ƈl予其控Ӟ首先调用这些函敎ͼ然后初始化系l的其余部分?/p>
Ҏ可用的系l资源和引导装蝲E序的功能,内核可以~译?vmlinux、Image ?zImage。vmlinux ?zImage 之间的主要区别在?vmlinux是实际的Q未压羃的)可执行文Ӟ?zImage是或多或包含相同信息的自解压压~文??只是压羃它以处理Q通常?Intel 强制的)640 KB 引导旉的限制。有x有这些的权威性解释,请参?Linux Magazine的文章“Kernel Configuration: dealing with the unexpected”(请参?参考资?/font>Q?
一旦ؓ目标pȝ~译了内核后Q通过使用引导装蝲E序Q它已经被装入到目标的闪存中Q,内核p装入到目标系l的内存Q在 DRAM 中或者在闪存中)。通过使用串行、USB 或以太网端口Q引D载程序与L通信以将内核传送到目标的闪存或 DRAM 中。在内核完全装入目标后Q引D载程序将控制传递给装入内核的地址?/p>
内核可执行文件由许多链接在一L对象文gl成。对象文件有许多节,如文本、数据、init 数据、bass {等。这些对象文仉是由一个称?链接器脚?/i>的文仉接ƈ装入的。这个链接器脚本的功能是输入对象文件的各节映射到输出文件中Q换句话_它将所有输入对象文仉链接到单一的可执行文g中,该可执行文件的各节装入到指定地址处?vmlinux.lds是存在于 arch/<target>/ 目录中的内核链接器脚本,它负责链接内核的各个节ƈ它们装入内存中特定偏移量处。典型的 vmlinux.lds 看v来象q样Q?
清单 2. 典型?vmlinux.lds 文g
OUTPUT_ARCH(<arch>) /* <arch> includes architecture type */ ENTRY(stext) /* stext is the kernel entry point */ SECTIONS /* SECTIONS command describes the layout of the output file */ { . = TEXTADDR; /* TEXTADDR is LMA for the kernel */ .init : { /* Init code and data*/ _stext = .; /* First section is stext followed by __init data section */ __init_begin = .; *(.text.init) __init_end = .; } .text : { /* Real text segment follows __init_data section */ _text = .; *(.text) _etext = .; /* End of text section*/ } .data :{ _data=.; /* Data section comes after text section */ *(.data) _edata=.; } /* Data section ends here */ .bss : { /* BSS section follows symbol table section */ __bss_start = .; *(.bss) _end = . ; /* BSS section ends here */ } }
LMA
是装入模块地址Q它表示要装入内核的目标虚拟内存中的地址?TEXTADDR
是内核的虚拟起始地址Qƈ且在 arch/<target>/ 下的 Makefile 中指定它的倹{这个地址必须与引D载程序用的地址相匹配?一旦引D载程序将内核复制到闪存或 DRAM 中,内核p重新定位?
TEXTADDR
?它通常?DRAM 中。然后,引导装蝲E序控制{l这个地址Q以便内核能开始执行?
stext
是内核入口点Q这意味着在内核引导时首先执行这一节下的代码。它通常用汇~语a~写Qƈ且通常它在 arch/<target>/ 内核目录下。这个代码设|内栔R面目录、创n份内核映、标识体pȝ构和处理器以及执行分?start_kernel
Q初始化pȝ的主例程Q?
start_kernel
调用setup_arch
作ؓ执行的第一步,在其中完成特定于体系l构的设|。这包括初始化硬件寄存器、标识根讑֤和系l中可用?DRAM 和闪存的数量、指定系l中可用面的数目、文件系l大等{。所有这些信息都以参数Ş式从引导装蝲E序传递到内核?参C引导装蝲E序传递到内核有两U方法:parameter_structure 和标记列表。在q两U方法中Q不赞成使用参数l构Q因为它强加了限Ӟ指定在内存中Q每个参数必M?
param_struct
中的特定偏移量处。最新的内核期望参数作ؓ标记列表的格式来传递,q将参数转化为已标记格式?param_struct
定义?include/asm/setup.h 中。它的一些重要字D|Q?
清单 3. h参数l构
struct param_struct { unsigned long page_size; /* 0: Size of the page */ unsigned long nr_pages; /* 4: Number of pages in the system */ unsigned long ramdisk /* 8: ramdisk size */ unsigned long rootdev; /* 16: Number representing the root device */ unsigned long initrd_start; /* 64: starting address of initial ramdisk */ /* This can be either in flash/dram */ unsigned long initrd_size; /* 68: size of initial ramdisk */ }
h意:q些数表C定义字D늚参数l构中的偏移量。这意味着如果引导装蝲E序参数结构放|在地址 0xc0000100Q那?rootdev 参数放|在 0xc0000100 + 16Qinitrd_start 放|在 0xc0000100 + 64 {等 ?否则Q内核将在解释正的参数旉到困难?/p>
正如上面提到的,因ؓ从引D载程序到内核的参C递会有一些约束条Ӟ所以大多数 2.4.x pd内核期望参数以已标记的列表格式传递。在已标记的列表中,每个标记由标识被传递参数的 tag_header 以及其后的参数值组成。标记列表中标记的常规格式可以如下所C:
清单 4. h标记格式。内栔R过 <ATAG_TAGNAME> 头来标识每个标记?/b>
#define <aTAG_TAGNAME> <Some Magic number> struct <tag_tagname> { u32 <tag_param>; u32 <tag_param>; }; /* Example tag for passing memory information */ #define ATAG_MEM 0x54410002 /* Magic number */ struct tag_mem32 { u32 size; /* size of memory */ u32 start; /* physical start address of memory*/ };
setup_arch
q需要对闪存存储库、系l寄存器和其它特定设备执行内存映。一旦完成了特定于体pȝ构的讄Q控制就q回到初始化pȝ其余部分?start_kernel 函数。这些附加的初始化Q务包含:
- 讄陷阱
- 初始化中?
- 初始化计时器
- 初始化控制台
- 调用
mem_init
Q它计算各种区域、高内存区等内的面数量- 初始?slab 分配器ƈ?VFS、缓冲区高速缓存等创徏 slab 高速缓?
- 建立各种文gpȝQ如 proc、ext2 ?JFFS2
- 创徏
kernel_thread
Q它执行文gpȝ中的 init 命oq显C?lign 提示W?如果?/bin?sbin ?/etc 中没?init E序Q那么内核将执行文gpȝ?/bin 中的 shell?
![]()
![]()
![]()
![]()
回页?/font>
嵌入式系l通常有许多设备用于与用户交互Q象触摸屏、小键盘、滚动轮、传感器、RA232 接口、LCD {等。除了这些设备外Q还有许多其它专用设备,包括闪存、USB、GSM {。内栔R过所有这些设备各自的讑֤驱动E序来控制它们,包括 GUI 用户应用E序也通过讉Kq些驱动E序来访问设备。本节着重讨论通常几乎在每个嵌入式环境中都会用的一些重要设备的讑֤驱动E序?/p>
q是最重要的驱动程序之一Q因为通过q个驱动E序才能使系l屏q显C内宏V~冲区驱动程序通常有三层。最底层是基本控制台驱动E序 drivers/char/console.cQ它提供了文本控制台常规接口的一部分。通过使用控制台驱动程序函敎ͼ我们能将文本打印到屏q上 ?但图形或动画q不能(q样做需要用视频模式功能,通常出现在中间层Q也是 drivers/video/fbcon.c 中)。这个第二层驱动E序提供了视频模式中l图的常规接口?/p>
帧缓冲区是显卡上的内存,需要将它内存映到用户I间以便可以图形和文本能写到这个内存段上:然后q个信息反映到屏幕上。~冲区支持提高了l图的速度和整体性能。这也是层驱动E序引h注意之处Q顶层是非常特定于硬件的驱动E序Q它需要支持显卡不同的g斚w ?象启用/用昑֍控制器、深度和模式的支持以及调色板{。所有这三层都相互依赖以实现正确的视频功能。与帧缓冲区有关的设备是 /dev/fb0Q主讑֤?29Q次讑֤?0Q?/p>
可触摸板是用于嵌入式讑֤的最基本的用户交互设备之一 ?键盘、传感器和滚动轮也包含在许多不同讑֤中以用于不同的用途?/p>
触摸板设备的主要功能是随时报告用L触摸Qƈ标识触摸的坐标。这通常在每ơ发生触摸时Q通过生成一个中断来实现?/p>
然后Q这个设备驱动程序的角色是每当出C断时查询触摸屏控制器,q请求控制器发送触摸的坐标。一旦驱动程序接收到坐标Q它将有关触摸和Q何可用数据的信号发送给用户应用E序Qƈ数据发送给应用E序Q如果可能的话)。然后用户应用程序根据它的需要处理数据?/p>
几乎所有输入设??包括键??都以cM原理工作?/p>
MTD 讑֤是象闪存芯片、小型闪存卡、记忆棒{之cȝ讑֤Q它们在嵌入式设备中的用正在不断增ѝ?/p>
MTD 驱动E序是在 Linux 下专门ؓ嵌入式环境开发的新的一c驱动程序。相对于常规块设备驱动程序,使用 MTD 驱动E序的主要优点在?MTD 驱动E序是专门ؓZ闪存的设备所设计的,所以它们通常有更好的支持、更好的理和基于扇区的擦除和读写操作的更好的接口。Linux 下的 MTD 驱动E序接口被划分ؓ两类模块Q用h块和g模块?/p>
用户模块
q些模块提供从用L间直接用的接口Q原始字W访问、原始块讉K、FTLQ闪存{换层QFlash Transition Layer ?用在闪存上的一U文件系l)?JFSQ即日志文gpȝQJournaled File System ?在闪存上直接提供文gpȝ而不是模拟块讑֤Q。用于闪存的 JFS 的当前版本是 JFFS2Q稍后将在本文中描述Q?g模块
q些模块提供对内存设备的物理讉KQ但q不直接使用它们。通过上述的用h块来讉K它们。这些模块提供了在闪存上诅R擦除和写操作的实际例程?MTD 驱动E序讄
Z讉K特定的闪存设备ƈ文件系l置于其上,需要将 MTD 子系l编译到内核中。这包括选择适当?MTD g和用h块。当前,MTD 子系l支持ؓC多的闪存讑֤ ?q且有越来越多的驱动E序正被dq来以用于不同的闪存芯片?有两个流行的用户模块可启用对闪存的访问:
MTD_CHAR
?MTD_BLOCK
?
MTD_CHAR
提供寚w存的原始字符讉KQ?MTD_BLOCK
闪存设计ؓ可以在上面创建文件系l的常规块设备(?IDE 盘Q。与MTD_CHAR
兌的设备是 /dev/mtd0、mtd1、mtd2Q等{)Q而与MTD_BLOCK
兌的设备是 /dev/mtdblock0、mtdblock1Q等{)。由?MTD_BLOCK
讑֤提供象块讑֤那样的模拟,通常更可取的是在q个模拟基础上创 FTL ?JFFS2 那样的文件系l?Zq行q个操作Q可能需要创建分闪存设备分拆到引导装蝲E序节、内核节和文件系l节中。样本分可能包含以下信息Q?/p>
清单 5. MTD 的简单闪存设备分?/b>
struct mtd_partition sample_partition = { { /* First partition */ name : bootloader, /* Bootloader section */ size : 0x00010000, /* Size */ offset : 0, /* Offset from start of flash- location 0x0*/ mask_flags : MTD_WRITEABLE /* This partition is not writable */ }, { /* Second partition */ name : Kernel, /* Kernel section */ size : 0x00100000, /* Size */ offset : MTDPART_OFS_APPEND, /* Append after bootloader section */ mask_flags : MTD_WRITEABLE /* This partition is not writable */ }, { /* Third partition */ name : JFFS2, /* JFFS2 filesystem */ size : MTDPART_SIZ_FULL, /* Occupy rest of flash */ offset : MTDPART_OFS_APPEND /* Append after kernel section */ } }
上面的分使用?
MTD_BLOCK
接口寚w存设备进行分区。这些分区的讑֤节点是:
单闪存分区的讑֤节点
User device node Major number Minor number Bootloader /dev/mtdblock0 31 0 Kernel /dev/mtdblock1 31 1 Filesystem /dev/mtdblock2 31 2
在本例中Q引D载程序必d有关 root 讑֤节点Q?dev/mtdblock2Q和可以在闪存中扑ֈ文gpȝ的地址Q本例中?
FLASH_BASE_ADDRESS + 0x04000000
Q的正确参数传递到内核。一旦完成分区,闪存讑֤准备装入或挂装文gpȝ?Linux ?MTD 子系l的主要目标是在pȝ的硬仉动程序和上层Q或用户模块之间提供通用接口。硬仉动程序不需要知道象 JFFS2 ?FTL 那样的用h块用的Ҏ。所有它们真正需要提供的是一l对底层闪存pȝq行
read
?write
?erase
操作的简单例E?
![]()
![]()
![]()
![]()
回页?/font>
pȝ需要一U以l构化格式存储和索信息的ҎQ这需要文件系l的参与。RamdiskQ请参阅 参考资?/font>Q是通过计机?RAM 用作讑֤来创建和挂装文gpȝ的一U机Ӟ它通常用于无盘pȝQ当然包括微型嵌入式讑֤Q它只包含作为永久存储媒质的闪存芯片Q?
用户可以Ҏ可靠性、健壮性和Q或增强的功能的需求来选择文gpȝ的类型。下一节将讨论几个可用选项及其优缺炏V?/p>
Ext2fs ?Linux 事实上的标准文gpȝQ它已经取代了它的前??扩展文gpȝQ或 ExtfsQ。Extfs 支持的文件大最大ؓ 2 GBQ支持的最大文件名U大ؓ 255 个字W??而且它不支持索引节点Q包括数据修Ҏ间标讎ͼ。Ext2fs 做得更好Q它?优点是:
- Ext2fs 支持?4 TB 的内存?
- Ext2fs 文g名称最长可以到 1012 个字W?
- 当创建文件系l时Q管理员可以选择逻辑块的大小Q通常大小可选择 1024?048 ?4096 字节Q?
- Ext2fs 了实现快速符号链接:不需要ؓ此目的而分配数据块Qƈ且将目标名称直接存储在烦引节点(inodeQ表中。这使性能有所提高Q特别是在速度上?
因ؓ Ext2 文gpȝ的稳定性、可靠性和健壮性,所以几乎在所有基?Linux 的系l(包括台式机、服务器和工作站 ?q且甚至一些嵌入式讑֤Q上都?Ext2 文gpȝ。然而,当在嵌入式设备中使用 Ext2fs Ӟ它有一?~点Q?
- Ext2fs 是ؓ?IDE 讑֤那样的块讑֤设计的,q些讑֤的逻辑块大是 512 字节Q? K 字节{这L倍数。这不太适合于扇区大因讑֤不同而不同的闪存讑֤?
- Ext2 文gpȝ没有提供对基于扇区的擦除Q写操作的良好管理。在 Ext2fs 中,Z在一个扇Z擦除单个字节Q必d整个扇区复制?RAMQ然后擦除,然后重写入。考虑到闪存设备具有有限的擦除寿命Q大U能q行 100,000 ơ擦除)Q在此之后就不能使用它们Q所以这不是一个特别好的方法?
- 在出现电源故障时QExt2fs 不是防崩溃的?
- Ext2 文gpȝ不支持损耗^衡,因此~短了扇区/闪存的寿命。(损耗^衡确保将地址范围的不同区域轮用于写和/或擦除操作以廉闪存讑֤的寿命。)
- Ext2fs 没有特别完美的扇区管理,q设计块驱动程序十分困难?
׃q些原因Q通常相对?Ext2fsQ在嵌入式环境中使用 MTD/JFFS2 l合是更好的选择?/p>
?Ramdisk 挂装 Ext2fs
通过使用 Ramdisk 的概念,可以在嵌入式讑֤中创建ƈ挂装 Ext2 文gpȝQ以及用于这一目的的Q何文件系l)?
清单 6. 创徏一个简单的Z Ext2fs ?Ramdisk
mke2fs -vm0 /dev/ram 4096 mount -t ext2 /dev/ram /mnt cd /mnt cp /bin, /sbin, /etc, /dev ... files in mnt cd ../ umount /mnt dd if=/dev/ram bs=1k count=4096 of=ext2ramdisk
mke2fs
是用于在M讑֤上创?ext2 文gpȝ的实用程??它创U块、烦引节点以及烦引节点表{等?在上面的用法中,
/dev/ram
是上面构建有 4096 个块?ext2 文gpȝ的设备。然后,这个设备(/dev/ram
Q挂装在名ؓ/mnt
的时目录上q且复制所有必需的文件。一旦复制完q些文gQ就卸装q个文gpȝq且讑֤Q?/dev/ram
Q的内容被{储到一个文Ӟext2ramdiskQ中Q它是所需?RamdiskQExt2 文gpȝQ?上面的顺序创Z一?4 MB ?RamdiskQƈ用必需的文件实用程序来填充它?/p>
一些要包含?Ramdisk 中的重要目录是:
- /bin ?保存大多数象
init
?busybox
?shell
、文件管理实用程序等二进制文件?- /dev?包含用在讑֤中的所有设备节?
- /etc?包含pȝ的所有配|文?
- /lib?包含所有必需的库Q如 libc、libdl {?
瑞典?Axis Communications 开发了最初的 JFFSQRed Hat ?David Woodhouse 对它q行了改q?W二个版本,JFFS2Q作为用于微型嵌入式讑֤的原始闪存芯片的实际文gpȝ而出现。JFFS2 文gpȝ是日志结构化的,q意味着它基本上是一长列节点。每个节点包含有x件的部分信息 ?可能是文件的名称、也许是一些数据。相对于 Ext2fsQJFFS2 因ؓ有以下这?优点而在无盘嵌入式设备中来受Ƣ迎Q?
- JFFS2 在扇区别上执行闪存擦除Q写Q读操作要比 Ext2 文gpȝ好?
- JFFS2 提供了比 Ext2fs 更好的崩溃/掉电安全保护。当需要更改少量数据时QExt2 文gpȝ整个扇区复制到内存QDRAMQ中Q在内存中合q新数据Qƈ写回整个扇区。这意味着Z更改单个字,必须Ҏ个扇区(64 KBQ执行读Q擦除/写例E??q样做的效率非常低。要是运气差Q当正在 DRAM 中合q数据时Q发生了甉|故障或其它事故,那么丢失整个数据集合,因ؓ在将数据d DRAM 后就擦除了闪存扇区。JFFS2 附加文g而不是重写整个扇区,q且h崩溃Q掉电安全保护这一功能?
- q可能是最重要的一点:JFFS2 是专门ؓ象闪存芯片那L嵌入式设备创建的Q所以它的整个设计提供了更好的闪存管理?
因ؓ本文主要是写关于闪存讑֤的用,所以在嵌入式环境中使用 JFFS2 ?~点很少Q?
- 当文件系l已满或接近满时QJFFS2 会大大放慢运行速度。这是因为垃圾收集的问题Q更多信息,请参?参考资?/font>Q?
创徏 JFFS2 文gpȝ
?Linux 下,?mkfs.jffs2
命o创徏 JFFS2 文gpȝQ基本上是?JFFS2 ?RamdiskQ?
清单 7. 创徏 JFFS2 文gpȝ
mkdir jffsfile cd jffsfile /* copy all the /bin, /etc, /usr/bin, /sbin/ binaries and /dev entries that are needed for the filesystem here */ /* Type the following command under jffsfile directory to create the JFFS2 Image */ ./mkfs.jffs2 -e 0x40000 -p -o ../jffs.image
上面昄?mkfs.jffs2 的典型用法?
-e
选项定闪存的擦除扇区大(通常?64 千字节)?-p
选项用来在映像的剩余I间用零填充?-o
选项用于输出文gQ通常?JFFS2 文gpȝ映像 ?在本例中?jffs.image。一旦创Z JFFS2 文gpȝQ它p装入闪存中适当的位|(引导装蝲E序告知内核查找文gpȝ的地址Q以便内核能挂装它?tmpfs
?Linux q行于嵌入式讑֤上时Q该讑֤成为功能齐全的单元Q许多守护进E会在后台运行ƈ生成许多日志消息。另外,所有内核日志记录机Ӟ?syslogd、dmesg ?klogdQ会?/var ?/tmp 目录下生成许多消息。由于这些进E生了大量数据Q所以允许将所有这些写操作都发生在闪存是不可取的。由于在重新引导时这些消息不需要持久存储,所以这个问题的解决Ҏ是?tmpfs?tmpfs 是基于内存的文gpȝQ它主要用于减少对系l的不必要的闪存写操作这一唯一目的。因?tmpfs ȝ?RAM 中,所以写Q读Q擦除的操作发生?RAM 中而不是在闪存中。因此,日志消息写入 RAM 而不是闪存中Q在重新引导时不会保留它们。tmpfs q用磁盘交换空间来存储Qƈ且当为存储文件而请求页面时Q用虚拟内存(VMQ子pȝ?/p>
tmpfs ?优点包括Q?
- 动态文件系l大??文gpȝ大小可以Ҏ被复制、创建或删除的文件或目录的数量来~放。得能够最理想C用内存?
- 速度 ?因ؓ tmpfs ȝ?RAMQ所以读和写几乎都是瞬时的。即使以交换的Ş式存储文ӞI/O 操作的速度仍非常快?
tmpfs 的一?~点是当pȝ重新引导时会丢失所有数据。因此,重要的数据不能存储在 tmpfs 上?
挂装 tmpfs
诸如 Ext2fs ?JFFS2 {大多数其它文gpȝ都驻留在底层块设备之上,?tmpfs 与它们不同,它直接位?VM 上。因而,挂装 tmpfs 文gpȝ是很单的事:
清单 8. 挂装 tmpfs
/* Entries in /etc/rc.d/rc.sysinit for creating/using tmpfs */ # mount -t tmpfs tmpfs /var -o size=512k # mkdir -p /var/tmp # mkdir -p /var/log # ln -s /var/tmp /tmp
上面的命令将?/var 上创?tmpfs q将 tmpfs 的最大大限制ؓ 512 K。同Ӟtmp/ ?log/ 目录成ؓ tmpfs 的一部分以便?RAM 中存储日志消息?/p>
如果您想?tmpfs 的一个项d?/etc/fstabQ那么它可能看v来象q样Q?
tmpfs /var tmpfs size=32m 0 0
q将?/var 上挂装一个新?tmpfs 文gpȝ?/p>
![]()
![]()
![]()
![]()
回页?/font>
从用L观点来看Q图形用L面(GUIQ是pȝ的一个最臛_重要的方面:用户通过 GUI 与系l进行交互。所?GUI 应该易于使用q且非常可靠。但它还需要是有内存意识的Q以便在内存受限的、微型嵌入式讑֤上可以无~执行。所以,它应该是轻量U的Qƈ且能够快速装入?/p>
另一个要考虑的重要方面涉及许可证问题。一?GUI 分发版具有允许免费用的许可证,甚至在一些商业品中也是如此。另一些许可证要求如果惛_ GUI 合ƈ入项目中则要支付版税?/p>
最后,大多数开发h员可能会选择 XFree86Q因?XFree86 Z们提供了一个能使用他们喜欢的工L熟悉环境。但是市Z较新?GUIQ象 Century Software ?MicrowindowsQNano-XQ和 Trolltech ?QT/EmbeddedQ与 X 在嵌入式 Linux 的竞技舞台中展开了激烈竞争,q主要是因ؓ它们占用很少的资源、执行的速度很快q且h定制H口构g的支持?/p>
让我们看一看这些选项中的每一个?/p>
Xfree86 4.XQ带帧缓冲区支持?X11R6.4Q?/font>
XFree86 Project, Inc. 是一家生?XFree86 的公司,该品是一个可以免贚w复分发、开放源码的 X Window pȝ。X Window pȝQX11Qؓ应用E序以图形方式进行显C提供了资源Qƈ且它?UNIX 和类 UNIX 的机器上最常用的窗口系l。它很小但很有效Q它q行在ؓC多的g上,它对|络透明q且有良好的文档说明。X11 为窗口管理、事件处理、同步和客户机间通信提供强大的功??q且大多数开发h员已l熟悉了它的 API。它h对内核~冲区的内置支持Qƈ占用非常的资源 ?q非常有助于内存相对较少的设备。X 服务器支?VGA 和非 VGA 囑Ş卡,它对颜色深度 1????6 ?32 提供支持QƈҎ染提供内|支持。最新的发行版是 XFree86 4.1.0?/p>
它的 优点包括Q?
- 帧缓冲区体系l构的用提高了性能?
- 占用的资源相对很??大小?600 K ?700 K 字节的范围内Q这使它很容易在型讑֤上运行?
- 非常好的支持Q在U有许多文档可用Q还有许多专用于 XFree86 开发的邮递列表?
- X API 非常适合扩展?
它的 ~点包括Q?
- 比最q出现的嵌入?GUI 工具性能差?
- 此外Q当?GUI 中最新的开??象专门ؓ嵌入式环境设计的 Nano-X ?QT/Embedded ?相比ӞXFree86 g需要更多的内存?
Microwindows ?Century Software 的开放源代码目Q设计用于带型昄单元的微型设备。它有许多针对现代图形视H环境的功能部g。象 X 一P有多U^台支?Microwindows?/p>
Microwindows 体系l构是基于客hQ服务器的ƈ且具有分层设计。最底层是屏q和输入讑֤驱动E序Q关于键盘或鼠标Q来与实际硬件交互。在中间层,可移植的囑Ş引擎提供对线的绘制、区域的填充、多边Ş、裁剪以及颜色模型的支持?/p>
在最上层QMicrowindows 支持两种 APIQWin32/WinCE API 实现Q称?MicrowindowsQ另一U?API ?GDK 非常怼Q它UCؓ Nano-X。Nano-X 用在 Linux 上。它是象 X ?APIQ用于占用资源少的应用程序?/p>
Microwindows 支持 1?? ?8 bppQ每像素的位敎ͼ?palletized 昄Q以?8?6?4 ?32 bpp 的真彩色昄。Microwindows q支持它速度更快的~冲区。Nano-X 服务器占用的资源大约?100 K ?150 K 字节?/p>
原始 Nano-X 应用E序的^均大在 30 K ?60 K。由?Nano-X 是ؓ有内存限制的低端讑֤设计的,所以它不象 X 那样支持很多函数Q因此它实际上不能作为微?XQXfree86 4.1Q的替代品?/p>
可以?Microwindows 上运?FLNXQ它是针?Nano-X 而不?X q行修改?FLTKQ快速轻巧工L(Fast Light Toolkit)Q应用程序开发环境的一个版本。本文中描述 FLTK?/p>
Nano-X ?优点包括Q?
- ?Xlib 实现不同QNano-X 仍在每个客户Z同步q行Q这意味着一旦发送了客户求包Q服务器在ؓ另一个客h提供服务之前一直等待,直到整个包都到达为止。这使服务器代码非常单,而运行的速度仍非常快?
- 占用很小的资?
Nano-X ?~点包括Q?
- 联网功能部g至今没有l过适当地调_特别是网l透明性)?
- q没有太多现成的应用E序可用?
- ?X 相比QNano-X 虽然q来正在加速开发,但仍没有那么多文档说明而且没有很好的支持,但这U情形会有所改变?
FLTK 是一个简单但灉|?GUI 工具,它在 Linux 世界中赢得越来越多的xQ它特别适用于占用资源很的环境。它提供了您期望?GUI 工具׃获得的大多数H口构gQ如按钮、对话框、文本框以及的“赋值器”选择Q用于输入数值的H口构gQ。还包括滑动器、滚动条、刻度盘和其它一些构件?/p>
针对 Microwindows GUI 引擎?FLTK ?Linux 版本被称?FLNX。FLNX ׃个组件构成:Fl_Widget ?FLUID。Fl_Widget 由所有基本窗口构?API l成。FLUIDQ快速轻巧的用户界面设计?Fast Light User Interface Designer, FLUID)Q是用来产生 FLTK 源代码的囑Ş~辑器。ȝ来说QFLNX 是能用来为嵌入式环境创徏应用E序的一个出色的 UI 构徏器?/p>
Fl_Widget 占用的资源大U是 40 K ?48 KQ?FLUIDQ包括了每个H口构gQ大U占?380 K。这些非常小的资源占用率?Fl_Widget ?FLUID 在嵌入式开发世界中非常受欢q?/p>
优点包括Q?
- 习惯于在?Windows q样已徏立得较好的环境中开发基?GUI 的应用程序的M人都会非常容易地适应 FLTK 环境?
- 它的文档包括一本十分完整且~写良好的手册?
- 它?LGPL q行分发Q所以开发h员可以灵zd发放他们应用E序的许可证?
- FLTK 是一?C++ 库(Perl ?Python l定也可用)。面向对象模型的选择是一个好的选择Q因为大多数C GUI 环境都是面向对象的;q也使将~写的应用程序移植到cM?API 中变得更Ҏ?
- Century Software 的环境提供了几个有用的工P诸如 ScreenToP ?ViewML 览器?
它的 ~点是:
- 普通的 FLTK 可以?X ?Windows API 一同工作,?FLNX 不能。它?X 的不兼容性阻了它在许多目中的使用?
Qt/Embedded ?Trolltech 新开发的用于嵌入?Linux 的图形用L面系l。Trolltech 最初创?Qt 作ؓ跨^台的开发工L?Linux 台式机。它支持各种?UNIX 特点的系l以?Microsoft Windows。KDE ?最行?Linux 桌面环境之一Q就是用 Qt ~写的?/p>
Qt/Embedded 以原?Qt 为基Qƈ做了许多的调整以适用于嵌入式环境。Qt Embedded 通过 Qt API ?Linux I/O 设施直接交互。那些熟悉ƈ已适应了面向对象编E的人员发现它是一个理想环境。而且Q面向对象的体系l构使代码结构化、可重用q且q行快速。与其它 GUI 相比QQt GUI 非常快,q且它没有分层,q?Qt/Embedded 成ؓ用于q行Z Qt 的程序的最紧凑环境?/p>
Trolltech q推Z Qt 掌上机环境(Qt Palmtop EnvironmentQ俗U?QpeQ。Qpe 提供了一个基本桌面窗口,q且该环境ؓ开发提供了一个易于用的界面。Qpe 包含全套的个Z息管理(Personal Information Management (PIM)Q应用程序、因特网客户机、实用程序等{。然而,Z?Qt/Embedded ?Qpe 集成C个品中Q需要从 Trolltech 获得商业许可证。(原始 Qt 自版?2.2 以后可以根?GPL 获得 。)
它的 优点包括Q?
- 面向对象的体pȝ构有助于更快地执?
- 占用很少的资源,大约 800 K
- 抗锯齿文本和混合视频的象素映?
它的 ~点是:
- Qt/Embedded ?Qpe 只能在获得商业许可证的情况下才能使用?
![]()
![]()
![]()
![]()
回页?/font>
嵌入?Linux 开发正q速地发展着。您必须学习q从引导装蝲E序和分发版到文件系l和 GUI 中的每一个事物的各种选项中作出选择。但是要感谢有这U选择自由度以及非常活跃的 Linux CQLinux 上的嵌入式开发已l达C新的境界Qƈ且调整模块以适合您的规范从未比现在更单。这已经D出现了许多时新的手持和微型设备作为开攄Q这是g好事 ?因ؓ事实是您不必成ؓ一个专家从q些模块中进行选择来调整您的设备以满您自q要求和需要?/p>
我们希望q篇对嵌入式 Linux 领域的介l性概q能Ȁhq行试验的欲望,q且希望您将体会摆弄微型讑֤的乐以满您的爱好。ؓq一步有助于您的目Q请参阅下面的“参考资料”,链接到有x们这里已l概q的技术的更深入的信息?/p>
引导Q?
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文.
- 如需获得?vmlinux ?zimage 之间区别的极好解释,请在 Alessandro Rubini ~写的?Kernel Configuration: dealing with the unexpectedQ?Linux MagazineQ的一文中扑ֈ“Booting your kernel”一节?
型分发?/b>Q?
- The Embedded Linux Distributions Quick Reference Guide 늛了许多商业的和开放源码的分发版( Linux DevicesQ?001 q?8 月)?
- h看另一?详尽的分发版和有用的工具的清单( Linux-embedded.comQ?
工具?/b>Q?
- Wiki 工具N?/font> 包含到本文提到的所有三个工具链的链接,q有对它们的评论?
讑֤驱动E序Q?
- Memory Technology Device (MTD) Subsystem for Linux 的目的是化内存设备(特别是闪存设备)的驱动程序的创徏?
- Vipin Malik ~写?The Linux MTD, JFFS HOWTO帮助您?MTD ?JFFS2 一起工作?
- Linux for PowerPC Embedded Systems HOWTO 有一个很好的讑֤驱动E序清单?
- 理解 Linux device drivers有助于理解本介l性文章( Penguin MagazineQ?
- 要精?Linux 讑֤驱动E序Q请阅读 O'Reilly ?Linux Device DriversQ第 2 ?/font>一书?
有用的工?/b>Q?
- Binutils ?GCC?Glibc都可?Free Software Foundation 下蝲获得?
- 许多有用的下载都可从 Netwinder.org获得Q这是一个致力于 NetWinder q_上开发工作的志愿者站炏V?
- 请在 Mark Nielsen 写得非常的 How to use a Ramdisk for Linux一文中阅读有关 Ramdisk 的所有信息?
- FLNX 是以 FLTKQ快速轻巧的工具)为基的?
文gpȝQ?
- W二版扩展文件系l?Ext2fs的主在 SourceForge?
- Red Hat 英国公司?David Woodhouse 概述了大量有?JFFS2Q日志闪存文件系l,W?2 ?/font>的背景知识?
- 您可以在 Linux HeadQuarters 阅读更多有关 tmpfs的信息?
- Cliff Brake ?Jeff Sutherland ~写?Flash Filesystems for Embedded Linux Systems一文论qC用于闪存讑֤的更多文件系l( Embedded Linux JournalQ?
GUIQ?
- Xfree86 ?X 开?/font>的主c?
- h看一对 Microwindows 的一些缺?/font>QGNOME gtk 开发h员的邮递列表)的讨论(旉比较长了Q?
- ?Trolltech 上查找有?Qt/Embedded的更多信息?
- The Embedded Linux GUI/Windowing Quick Reference Guide 中有丰富的链接( Linux DevicesQ?002 q?2 月)?
一般参考资?/b>Q?
- General Public License ?GPL 保用户复制、分发和修改软g的权利?
- ARM Linux 是您了解有关 Linux 用于 ARM 处理器的信息的一个非常好的站炏V它?ARM 的创?Russell King 来维护?
- Penguinppc.org 是关?Linux 用于 PowerPC pd处理器的的主c该站点上有一个关于ؓZ PPC 的体pȝ构徏立工具链的资料丰富的教程?
- Linux Devices 是一个非常全面的站点Q它包含有关 Linux 和嵌入式开发的出版发行、快速参考、新d特色报告{各U信息?
- Silicon Penguin 列表站点上拥有嵌入式 Linux 参考资料的详尽集合?
- ARMLinux - the book 可从 Aleph One 上获得。您可以定购一本,也可?在线阅读?
- 嵌入?Linux 协会QEmbedded Linux ConsortiumQ?/font> 是一个非赢利的互助协会,它欢q致力于嵌入?Linux 领域的开发h员成Z员?
- IBM ?Linux wristwatch是运?Linux 的微型嵌入式讑֤的示例;本文的作者之一QVishal Kulkarni 也参与了它的研发。请?本文Q?FreeOS.comQ?001 q?3 月)中阅L兛_的信息?
- ?developerWorks上浏?更多 Linux 参考资?/font>?
- ?developerWorks上浏?更多无线领域的参考资?/font>?
![]()
![]()
Anand K Santhanam 在印?Madras 大学获得计算机科学工学学士学位。自 1999 q?7 月以来他一直在印度?IBM Global ServicesQY件实验室Q工作。他?IBM Linux 组的成员,q个组主要致力于嵌入式pȝ中的 ARM-Linux、设备驱动程序和甉|理的研I和开发。他感兴的其它领域?O/S 本质和联|。可以通过 asanthan@in.ibm.com 与他联系?
![]()
![]()
Vishal Kulkarni 从印?Maharashtra ?Shivaji 大学获得电子工程的学士学位。自 1999 q?3 月以来他一直在印度?IBM Global ServicesQY件实验室Q工作。在此之前,他曾在美?IBM Austin 工作了一q半多。他?IBM Linux 组的成员,q个组主要致力于嵌入式讑֤上的 ARM-Linux、设备驱动程序和 GUI。他感兴的其它领域?O/S 本质和联|。可以通过 kvishal@in.ibm.com与他联系?
]]> þAV| ٸлþþþ| Ʒݾþþþø99 | þ| պƷþþþþ| ݹƷþþþ| ֻƬþøպ| þóСƵ| ݺݺɫۺϾþ| պŷۺϾþӰԺDs | Ʒһþ| ݺɫþۺ| þ99Ʒ| Ʒþþþþ| 99ƷþþþĻ| Ժձһձþ | 97þþþ| ձһþ| þþƷ77777| ɫۺϾþ| þùŮѹۿƷ | þۺ77777| 7777þĻ| þþþùƷŮӰԺ| þ붯aëƬ| þһŷպ| þۺĻ| 7777þĻ| Ʒþþþþ12| þþƷAV| һɫƵþվ| Ʒþþþþù| 91þ㽶Ů߿| ŷþۺŷ| ѹۿ˾þѹۿ| ˹ھƷþþþӰԺ| þ99Ʒþþþþþþþ| þ99ۺϾƷŮͬ| þ99Ʒþþ| þþƷһ| þþ91Ʒһ |