继续努力,开始学习第二章:基本概念。
  对于嵌入Linux,需要先熟悉Linux系统,有很多,也将有更多的Linux系统,因此不要限制与某个单一的类型。目前最大的三个是Red Hat,Novell(SLES)和ubuntu。如果我们选择流行的Linux版本作为开发平台(可以选择windows或者Unix作为workstation),一般基于Eclipse的图像开发环境。
   有三种setup:Linked setup;可插拔存贮setup,standalone setup。Target需要开发环境,bootloader,kernel,Root,文件系统。在Linked setup的时候,有些向我们以前在调测vxWorks板子上的程序,通过网线或者RS232,将host和target联系起来,通常用于开发的调测, 其中kernel可以通过TFTP来获得,文件系统可以通过NFS来mount,避免在开发中大量copy。Removable Storage Setup方式常用于初始化,bootloader在target上,其他在可插拔的存贮介质中。前两种方式,开发环境都在host上,对于 standalone setup方式,和我们的PC机开发没有什么区别,直接在机器上进行开发,都有的东西都在target上面,就如我们之前在linux kernel上开发的voip监控仪表。Linked和standalone是可以结合在一起使用的。
  调测(Debug)setup有三种方式:串口、网络和特定的debug硬件。串口收到波特率的限制,以及连接一个terminal的限制,但是适合 进行kernel调测。串口和网络会使用到target上的一些基本的I/O软件,对于某些新的板块,调测kernel的时候,这些软件还不存在,因此需 要特别的debug硬件,例如用于CPU的JTAG和BDM pin,这些都是比较昂贵的编译器,并且可能需要和CPU厂家建立良好的合作伙伴关系,签注NDA。

读书笔记《Building embedded linux systems》Chapter 2_嵌入式操作系统

  Linux操作系统的结构如图所示。
  在底层硬件包括至少32-bit的CPU(包含MMU:memory management unit),RAM,I/O能力(允许进行debug调测)以及root filesystem(可以是本地的也可以是网络的)。
  Kernel,就是真正意义上的linux,底层的接口通过硬件独立的API来控制硬件资源,例如memory pages,处理特定CPU的操作,特定架构memory的操作,以及device的基本接口,想高层提供抽象的代码,包括头文件、宏、封装的函数。高层 的单位提供对所有基于unix系统通用的抽象表达,包括进程、文件、socket、信号等等。kernel的底层接口是不同已经平台所通用的,高层抽象几 乎是一样的。『这里有一个BSP,BSP应该是硬件根据linux内核底层接口给出的控制硬件的板卡支持包』。
  在这两层之间,kernel需要解析元件来交互数据,这就是文件系统和网络协议。在嵌入式系统中,经常使用flash作为存贮介质。不同的存贮格式通 过不同的引擎,通过linux的虚拟文件系统(VFS)提供统一的API给上层使用。FAT和EXT3都是VFS。现在存贮设备厂家提供更高level的 抽象,linux使用这种发展,使用ext的文件系统。在文件系统中,至少有一个root filesystem,用于load第一个在系统中run的app,通常还包括转载module,给进程提供一个工作目录。根文件系统可以是一个真实的硬 件存贮设备,也可以是系统启动是价值到RAM中,一般是第一种方式。
  直接在kernel上面部署我们通常所谓的app是不太合适的,需要lib的支持。常见的是GNU C。对于动态链接,没有将相关的lib作为app的二进制代码,可以多个app一起share。C lib在RAM中加载一起,就可以分享。但是有些嵌入式操作系统的应用选择静态链接,这样不需要在线系统存贮整个lib。
  系统启动设计三个部分:bootloader、内核、init进程。bootloader和底层硬件有关,先对底层硬件进行初始化后,进入kernel的startup code。内核的启动代码在起来一个C代码运行环境前不同平台由很大的差异,启动C环境后,运行start_kernel(),这初始化内核高层功能,mount根文件系统,并且启动初始进程。
  CPU的第一个指令由生产厂家指定的一个地址获得,这个地址通常是一个固定存贮器件,ROM或者flash芯片,这上面的软件是用于 bootstrap的。很多linux嵌入系统都是使用固体存贮期间的方式,这里包括初始的bootloader,相关配置(boot parameters),内核和root filesystem。bootloader可能防止固态存贮的地址低位,也可能在地址高位,因此很多flash设备同时提供对高位地址和低位地址的配 置,并通常对bootboader区域提供保护机制。虽然说分为四个部分,但是boot参数可以防止子bootlader中,kernel也可以防止在 root filesystem中,在Linux2.6,如果需要可以很方便将kernel和根文件系统打包为一个img。Boot storage介质可以使用devie programmer进行初始编程。出来固态存贮器件外,还有磁盘(disk)和网络两种方式。对于磁盘,最初的bootloader或者从disk中 load一个更大更多功能的第二bootloader,或者直接从disk获得kernel。使用网络方式,可能将根文件系统或者将跟文件系 统+kernel放置在网络,他哦通过TFTP来访问kernel,通过NFS来mount根文件系统,这种方式在适合早期的调测。
  系统存贮的物理地址和kernel的虚拟地址(在X86系统中成为逻辑地址)有很大的差异,很多硬件外设可以通过物理地址来获取,但限制或者不能通过 虚拟地址来获取。因此如果我们需要设置kernel或者开发自己的driver,我们需要了解这些物理地址。在启动的时候,bootloader将 kernel读至RAM,并跳到内核的start routines,后续的系统启动将由linux来执行。当linux运行是,程序使用虚拟地址,这是虚拟地址将对kernel的配置和设备driver 有个,driver有些信息放置在kernel空间,有些放置在用户空间,有些操作两者之间需要交互数据。