DIY编程器网

标题: 基于现场总线的开关量 I/O 模块的设计----操作系统移植与驱动开发 (二) [打印本页]

作者: admin    时间: 2015-4-27 23:34
标题: 基于现场总线的开关量 I/O 模块的设计----操作系统移植与驱动开发 (二)
5.3.3嵌入式Linux的移植
          在同一个硬件平台上可以嵌入不同的嵌入式操作系统,就好比PC既可以安装Windows又 可以安装Linux一样。同样,有些操作系统经过移植后可以运行在不同的硬件平台上。如果一个系统可以在不同硬件平台上运行,那么这个系统就是可移植的。 使某一个平台的代码运行在其他平台上的。过程叫做移植。
       
        在Linux系统内核代码中有arch目录,其中包含了不同平台(包括i386、 ARM)的代码,arch目录中的代码是为多平台设计并使用的,与体系结构相关的代码都存放在arch/<architecture>/和 include/asm-/目录中,architecture是Linux支持的体系结构的简称。例如,ARM体系结构对应的简称是arm.与这种体系结 构相关的代码都存放在arch/arm/以及include/asm-arm /目录下。嵌入式系统是“硬件可剪裁”的,因此工程师设计的硬件电路会有所不同,从而这些代码可能无法正确运行(比如内核解压的地址不同)。因此,在剪裁 系统内核是必须结合硬件电路对内核代码进行修改移植。
          本系统采用Linux2.6.12,Samsung S3C2440已经成为Linux的一个标准支持平台,对内核做简单的修改和配置后,无需任何其他的patch就可以在S3C2440的目标板上运行得很好。
       
        (1)针对内核源码的修改
          设置flash分区
          内核对flash分区的支持是内核移植成功的一个关键步骤,一共要修改三个文件,分别如下:
          指明分区信息
          在arch/arm/machs3c2410/devs.c文件中,添加如下内容:
          /**************增加的头文件**************/
          # include< linux/mtd/partitions.h>
        #include < asm/arch/nand.h>
        #include < linux/mtd/nand.h>
         
          /**************建立NANDFlash分区表**************/
           
         
         
            ●指定启动时初始化在
          arch/arm/machs3c2410/machsmdk2410.c目录,kernel启动时依据对分区的设置进行初始配置,修改smdk_devices[]:指明初始化时包括前面所设置的flash分区信息,
          static struct platform_device*smdk2410_devices[]__initdata={
          3c_device_usb,
          3c_device_lcd,
          3c_device_wdt,
          3c_device_i2c,
          3c_device_iis,
          3c_device_nand,/*添加该语句即可*/
          };
          ●禁止Flash ECC校验kernel是通过bootloader写到Nand Flash的,bootloader通过软件ECC算法产生ECC校验码。这与内核校验的ECC码不一样,内核中的ECC码是由S3C2440中的Nand Flash控制器产生的。
       
        修改drivers/mtd/nand/s3c2410.c文件:找到s3c2410_nand_init_chip( )函数,在该函数体最后加上如下语句。
       
        chip ->eccmode = NAND_ECC_NONE ;
           
          (2)内核配置及编译
          主要是在make menuconfig中设置CPU以及设备驱动相关的配置信息,可以参考SMKD2410开发平台上的有关配置,除了自定义的文件系统以及命令行参数外,基本上有关S3C2410处理器开发平台上的配置均相同,在虚拟机上配置界面如图5.2所示。
         
       
         
        根目录下只需修改Makefile文件。这个Makefile文件的任务有两个:产生vmlinux件和产生内核模块。为了达到此目的,Makefile将递归进入到内核的各个子目录中,分别调用位于这些子目录中的Makefile.
          指定目标平台
          ARCH:=arm
          指定交叉编译器
          CROSS_COMPILE=arm-linux-gcc
          设置好交叉编译器之后,执行make clean、makeu Image,生成在IO模块上运行的内核映象文件uImage,通过网口或串口进行烧写。
       
        5. 4嵌入式根文件系统的构建
          Linux的一个最重要特点就是它支持许多不同的文件系统。这使Linux非常灵活,能够与许多其他的操作系统共存。Linux支持的常见的文件系统有:JFS、ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC等。随着时间的推移,Linux支持的文件系统数还会增加。
       
        Linux是通过把系统支持的各种文件系统链接到一个单独的树形层次结构中,来实现对多文件系统的支持的。该树形层次结构把文件系统表示成一个整个的独立实体。无论什么类型的文件系统,都被装配到某个目录上,由被装配的文件系统的文件覆盖该目录原有的内容。该个目录被称为装配目录或装配点。在文件系统卸载时,装配目录中原有的文件才会显露出来。
       
        文件系统都会被烧录在与某一存储设备上。在嵌入式设备上很少使用大容量的ID E硬盘作为自己的存储设备,嵌入式设备往往选用ROM、闪存( flash memory )等作为它的主要存储设备。在嵌入式设备上选用哪种文件系统格式与闪存的特点是相关的。
       
        本硬件平台是以NAND Flash (闪存)作为主要的存储媒介,这类存储器与传统存储器最大的不同在于其是按扇区擦除、按位编程。Flash存储介质的这种技术特点使得传统的Linux文件系统已经不再适合在其上构建,比如Ext2文件系统,是专为像IDE那样的块设备设计的,没有提供很好的扇区擦写支持,不支持损耗平衡,没有掉电保护,也没有很好的扇区管理。这些缺点都表明,在Flash存储介质上应用为设备设计的传统文件系统不是一个很好的选择。基于这样的原因,产生了很多专为Flash设备而设计的文件系统。
       
        利用BusyBox构建嵌入式根文件系统
           
          Linux下的根文件系统目录结构如下:
          目录      习惯用法
          /bin      用户命令所在目录
          /dev      硬件设备文件及其它特殊文件
          /etc      系统配置文件,包括启动文件等
          /home     多用户主目录
          /lib      链接库文件目录
          /mnt      装配点,用于装配临时文件系统或其他的文件系统
          /opt      附加的软件套件目录
          /proc     虚拟文件系统,用来显示内核及进程信息
          /root     root用户主目录
          /sbin     系统管理员命令目录
          /tmp      临时文件目录/usr用户命令目录
          /var      监控程序和工具程序所存放的可变数据
           
          对于用途单一的嵌入式系统,上边的一些用于多用户的目录可以省略,例如/home、/opt、/root目录等。而/bin、/dev、/etc、/lib、/proc、/sbin和/usr目录,是几乎每个系统必备的目录,也是不可或缺的目录。
       
        制作根文件系统,就是创建各种目录,并在里面创建各种文件。比如在/bin、/sbin目录下存放各种可执行程序,在/etc目录下存放配置文件,在/lib目录下存放库文件。使用Busy box制作根文件系统,就是利用Busy box来创建/bin、/sbin等目录下的可执行的文件。
       
        5.4.1 Buybox简介
          Buybox被非常形象地称为嵌入式Linux系统中的“瑞士军刀”,它是一个Uinx工具集。它可提供一百多种GNU常用工具、shell脚本工具等。虽然Buybox中的这些工具相对于GNU提供的完全工具有所简化,但是它们都很实用。
       
        Buybox在设计上就充分考虑了硬件资源受限的特殊工作环境。它采用模块化设计,使得它很容易被定制和裁剪。可以根据实际的用途,裁剪出一个最精简的工具集。
       
        Buybox的特色是所有命令都编译成一个文件:Buybox,其他命令工具(如sh、cp、ls等)都是指向Buybox文件的链接。在使用Buybox生成的工具时,会根据工具的文件名链接到特定的处理程序。这样,所有这些程序只需被加载一次,而所有的Buybox工具组件都可以共享相同的代码段,这在很大程度上节省了系统的内存资源也提高了应用程序的执行速度。
       
        Buybox仅需要几百KB的空间就可以运行,这使得Buybox很适合嵌入式系统使用。同时,Buybox的安装脚本也使得它很容易建立基于Buybox的根文件系统。通常只需要添加/dev、/etc等目录以及相关的配置脚本,就可以实现一个简单的根文件系统。
           
          5.4.2 Buybox的配置编译
          将Buybox的源码从网站上下载到本地目录,运行命令:
        $tarzxvf Buybox-1.1.3.tar.gz
          $cd Buybox-1.1.3
          $make menuconfig
           
          在虚拟机上配置界面如图5.3所示
         
       
         
        典型的Buybox文件大小在动态链接的情况下是300KB左右,静态链接为800KB左右,用它实现的文件系统完全可以控制在1MB以下。
       
        5.4.3根文件系统镜像构建
          通常情况下根文件系统镜像是系统构建的最后一步。利用交叉编译工具将应用程序、内核分别配置和编译之后,把获得的C链接库、内核模块以及应用程序按照FHS规则放到相应位置,利用文件系统自带的工具mkyaffs image来最终生成一个根文件系统镜像file system.yaffs.




欢迎光临 DIY编程器网 (http://diybcq.com/) Powered by Discuz! X3.2