《构建嵌入式linux系统》读书笔记

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第一章简介一直都将计算机,包括上面的软件作为工具,工具者,只求甚用,不求甚解。越到问题的时候就到网上共产主义一把。现在开始想定制linux操作系统,希望能在MID和手机这类手持移动设备中使用。必须提高理论水平。网上一搜,发现太多linuxbible,比如这位O'REILLY老兄。不知道能看完他老人家多少本书。格物致知,只好先格准备BuildingEmbeddedLinuxSystems,先从第一章介绍开始格起。这里面看GPL最绕来绕去,兼且英文有不太好。合法的license想了解一下。大致是如果你只是使用(不改动),那么你不会受到GPL的限制,如果你改动了,就要受到GPL的限制,不能对外发布,你的程序必须具有GPL,也就是需公布你的sourcecode等等。但如果在linuxkernel的app是不受GPL的限制。但是对二进制的module目前虽没有被监控,但是趋势是不能容忍,需要谨慎。『记得以前有个项目进行高速的voip检测,就是使用module的方式,不过因为只在公司内部使用,不会涉及什么问题。这就是运营商的好处,头次发现比厂家方便的地方。organization覆盖范围大。』如果我们希望有很高的控制权新,想建立我们自己的target,我们就需要长期地进行维护,这中方式需要和采用公开的或者社区的方式进行取舍。『考虑选择哪些』创建一个targetlinux系统包括以下四步:一、确定系统的组成:linux中有大量的东西并非你的目标系统需要,可以列一下你需要的组成部分。硬件部分也可以作为嵌入式系统的一个组成部分。在选择相关软件版本时,应避免不断地升级这些软件。当你要升级这些软件时,需要检查是否对你的系统造成影响。二、配置和build内核:我们需要选择合适的稳定的内核版本,出现问题的时候可能需要更新或者回退版本;三、建立root文件系统;四、setup启动软件和配置。第二章基本概念对于嵌入Linux,需要先熟悉Linux系统,有很多,也将有更多的Linux系统,因此不要限制与某个单一的类型。目前最大的三个是RedHat,Novell(SLES)和ubuntu。如果我们选择流行的Linux版本作为开发平台(可以选择windows或者Unix作为workstation),一般基于Eclipse的图像开发环境。有三种setup:Linkedsetup;可插拔存贮setup,standalonesetup。Target需要开发环境,bootloader,kernel,Root,文件系统。在Linkedsetup的时候,有些向我们以前在调测vxWorks板子上的程序,通过网线或者RS232,将host和target联系起来,通常用于开发的调测,其中kernel可以通过TFTP来获得,文件系统可以通过NFS来mount,避免在开发中大量copy。RemovableStorageSetup方式常用于初始化,bootloader在target上,其他在可插拔的存贮介质中。前两种方式,开发环境都在host上,对于standalonesetup方式,和我们的PC机开发没有什么区别,直接在机器上进行开发,都有的东西都在target上面,就如我们之前在linuxkernel上开发的voip监控仪表。Linked和standalone是可以结合在一起使用的。调测(Debug)setup有三种方式:串口、网络和特定的debug硬件。串口收到波特率的限制,以及连接一个terminal的限制,但是适合进行kernel调测。串口和网络会使用到target上的一些基本的I/O软件,对于某些新的板块,调测kernel的时候,这些软件还不存在,因此需要特别的debug硬件,例如用于CPU的JTAG和BDMpin,这些都是比较昂贵的编译器,并且可能需要和CPU厂家建立良好的合作伙伴关系,签注NDA。Linux操作系统的结构如图所示。在底层硬件包括至少32-bit的CPU(包含MMU:memorymanagementunit),RAM,I/O能力(允许进行debug调测)以及rootfilesystem(可以是本地的也可以是网络的)。Kernel,就是真正意义上的linux,底层的接口通过硬件独立的API来控制硬件资源,例如memorypages,处理特定CPU的操作,特定架构memory的操作,以及device的基本接口,想高层提供抽象的代码,包括头文件、宏、封装的函数。高层的单位提供对所有基于unix系统通用的抽象表达,包括进程、文件、socket、信号等等。kernel的底层接口是不同已经平台所通用的,高层抽象几乎是一样的。『这里有一个BSP,BSP应该是硬件根据linux内核底层接口给出的控制硬件的板卡支持包』。在这两层之间,kernel需要解析元件来交互数据,这就是文件系统和网络协议。在嵌入式系统中,经常使用flash作为存贮介质。不同的存贮格式通过不同的引擎,通过linux的虚拟文件系统(VFS)提供统一的API给上层使用。FAT和EXT3都是VFS。现在存贮设备厂家提供更高level的抽象,linux使用这种发展,使用ext的文件系统。在文件系统中,至少有一个rootfilesystem,用于load第一个在系统中run的app,通常还包括转载module,给进程提供一个工作目录。根文件系统可以是一个真实的硬件存贮设备,也可以是系统启动是价值到RAM中,一般是第一种方式。直接在kernel上面部署我们通常所谓的app是不太合适的,需要lib的支持。常见的是GNUC。对于动态链接,没有将相关的lib作为app的二进制代码,可以多个app一起share。Clib在RAM中加载一起,就可以分享。但是有些嵌入式操作系统的应用选择静态链接,这样不需要在线系统存贮整个lib。系统启动设计三个部分:bootloader、内核、init进程。bootloader和底层硬件有关,先对底层硬件进行初始化后,进入kernel的startupcode。内核的启动代码在起来一个C代码运行环境前不同平台由很大的差异,启动C环境后,运行start_kernel(),这初始化内核高层功能,mount根文件系统,并且启动初始进程。CPU的第一个指令由生产厂家指定的一个地址获得,这个地址通常是一个固定存贮器件,ROM或者flash芯片,这上面的软件是用于bootstrap的。很多linux嵌入系统都是使用固体存贮期间的方式,这里包括初始的bootloader,相关配置(bootparameters),内核和rootfilesystem。bootloader可能防止固态存贮的地址低位,也可能在地址高位,因此很多flash设备同时提供对高位地址和低位地址的配置,并通常对bootboader区域提供保护机制。虽然说分为四个部分,但是boot参数可以防止子bootlader中,kernel也可以防止在rootfilesystem中,在Linux2.6,如果需要可以很方便将kernel和根文件系统打包为一个img。Bootstorage介质可以使用devieprogrammer进行初始编程。出来固态存贮器件外,还有磁盘(disk)和网络两种方式。对于磁盘,最初的bootloader或者从disk中load一个更大更多功能的第二bootloader,或者直接从disk获得kernel。使用网络方式,可能将根文件系统或者将跟文件系统+kernel放置在网络,他哦通过TFTP来访问kernel,通过NFS来mount根文件系统,这种方式在适合早期的调测。系统存贮的物理地址和kernel的虚拟地址(在X86系统中成为逻辑地址)有很大的差异,很多硬件外设可以通过物理地址来获取,但限制或者不能通过虚拟地址来获取。因此如果我们需要设置kernel或者开发自己的driver,我们需要了解这些物理地址。在启动的时候,bootloader将kernel读至RAM,并跳到内核的startroutines,后续的系统启动将由linux来执行。当linux运行是,程序使用虚拟地址,这是虚拟地址将对kernel的配置和设备driver有个,driver有些信息放置在kernel空间,有些放置在用户空间,有些操作两者之间需要交互数据。第三章硬件支持在这章中将被讨论没有MMU的结构,虽然这已经在linux2.6版本中支持,这是对8bit的低价格微处理器,用于打印,家庭娱乐的方式,这本书不包含这些方面,针对32bit的CPU。3.1CPU的介绍ARM:久闻大名,很多终端使用,例如iPod、iPhone。ARM使用RISC(ReduceIntructionSetComputing)『和使用CISC(负责计算指令集)的x86的CPU不一样。RISC可以使电路更为紧凑,不需要BIOS,低功耗、低成本』。和他的竞争芯片厂家(IMB、Intel等)不一样,ARM公司不生产自己的芯片,他根据ARM的架构为他的客户设计芯片,这些芯片具有共同的ARM指令集,使得上面的软件可以兼容,这并不意味着可以在ARM的板块上进行同样的编程开发,只是汇编或者二进制代码在相同的修订架构上是一致的。修订架构包括有ARMv4T、ARMv5TE(Xscale)、ARMv6(其中ARMv6KZ是用于AppleiPhone)等家族系列。AVR32:惭愧,没怎么听过。和AVR(8bit处理器)是同一厂家,但是结构没有什么相关,支持通用的DSP和JAVA加速指令,兼容16bit指令和扩展32bit指令。AVR32在2006开始发展,目前Linuxkernel支持at32ap这种型号。Intelx86:这个大家都看起来很熟悉,包括Intel的、AMD的。有一个新的趋势是SoC。虽然在Linux系统中使用很多,但是在嵌入式OS中,占的份额比较少,原因是比较复杂、电源利用(正在改善)和价格。现在,x86架构在linux内核中有一个内置的debugger。M32R:在里面提到一个词FPGA,需要到网上共产主义学习一下。ASIC(ApplicationSpecificIntergratedCircuits)即专用集成电路,是指应特定用户要求和特定电子系统的需要而设计、制造的集成电路。目前用CPLD(复杂可编程逻辑器件)和FPGA(现场可编程逻辑阵列)来进行ASIC设计是最为流行的方式之一。FPGA(现场可编程门阵列)是专用集成电路(ASIC)中集成度最高的一种,用户可对FPGA内部的逻辑模块和I/O模块重新配置,以实现用户的逻辑,因而也被用于对CPU的模拟。用户对FPGA的编程数据放在Flash芯片中,通过上电加载到FPGA中,对其进行初始化。也可在线对其编程,实现系统在线重构,这一特性可以构建一个根据计算任务不同而实时定制的CPU。对M32R进行很简单的介绍,用于PDA、摄像头、引擎控制等。MISP:用于游戏机和其他电子设备。和ARM有些类似,就是将CPUcore的license给第三方,和ARM不同,但是不同系列的MISP的指令有很大的差异。MISP对Linux的支持不如Intelx86,PowerPc,当时仍有一些用于嵌入式草组哦系统,例如MontaVista。motorola68000:是个古老的可用于嵌入式操作系统的架构,现在已经很少使用。PowerPC:在工作站(Applemacs)和嵌入式操作系统中都大量使用,是IBM、Apple、Freescale共同发起的。SuperH:有日立发展起来,方式和ARM、MISP相似。SH-1和SH-2是没有MMU,linux不必支持,SH-3|4|5的某些系统Linux支持。3.2总线和接口(BusandInterface)总线和接口连接CPU和外设。先是著名的PCI,有120I/O线的32bitPCI,184线的64bitPCI,以及新的串口的PCI-Express。为了使驱动能够工作,PCI需要软件支持,第一步的支持是bootup的时候初始化和配置PCI设备,对于PC设备,由BIOS来完成,kernel从BIOS的表额中获

1 / 35
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功