(太原理工大学 计算机与软件学院 中国 太原030024)
摘要:建立在uClinux-2.4.x及兼容三星SNDS100实验板基础之上,对嵌入式操作系统的源代码文件的作用及目录构成进行了分析,并深入分析了嵌入式操作系统的编译过程和系统启动过程。
关键词:嵌入式操作系统 编译 启动 uClinux
Analysis of embedded operation system uClinux
& its source code
 
(Taiyuan University of Technology, College of computer and software,
Taiyuan, 030024 China)
Abstract: Based on uClinux-2.4.x and compatible board with Samsung SNDS100, uClinux source code and directory are analyzed and interpreted. Meanwhile, more attention is paid on the process of compile and startup procedure, with thorough analysis and interpretation.
Key words: embedded operation system, compile, startup, uClinux
1       前言
嵌入式技术飞速发展,其高端微控制器已有九成是建立在ARM体系结构之上,可选用的嵌入式操作系统则主要是VxWorks和uClinux。由于开源、免费和可裁减等诸多优点,uClinux逐渐成为科研和应用的首选。uClinux源自Linux,它们的内核核心部分基本相同
2       源代码文件及目录构成
在系统源代码根目录uClinux-dist下,原始子目录主要有:config、linux-2.4.x、lib、tools、user和vendors,还有文件Makefile。另外,在编译后生成子目录images和romfs,以及文件autoconfig.h、config.in和两个隐含文件:.config和.depend。
config子目录包含文件及下一级子目录,所有这些文件及子目录均与系统配置有关;linux-2.4.x子目录是嵌入式操作系统uClinux-2.4.x的核心目录,包括下一级子目录arch、include、init、drivers、fs、ipc、kernel、lib、mmnommu、scripts和关键文件Makefile、rules.make,编译后还要生成新文件romfs.o、linux和system.map;lib子目录为嵌入式操作系统提供压缩和改进了的函数库支持;tools子目录包含romfs-inst.sh文件,通过调用此文件,可以把目录或文件加入到romfs子目录中;user子目录包含各种驱动程序文件目录,根据用户的配置情况,不同的驱动程序会被编译进最后形成的操作系统中;vendors子目录包括与特定硬件平台相关的分类目录组。
3       编译过程分析
标准编译过程分为八步:make menuconfig通过执行脚本文件来调用函数显示用户配置文件中的选项,完成系统及内核配置,最后生成系统配置文件;make dep读取系统配置以创建编译时可依赖的关系树,结果被存储在隐含文件.depend中,makefile通过包含.depend文件来包含这种依赖关系树,用于指导编译;make clean清除以前配置和编译后生成的一些目录和文件;make user_only根据配置递归进入各子目录,编译所需的驱动程序,结果生成了user目录的各级子目录下的目标文件(*.o)和执行文件(*.exe)等;make romfs根据配置在根目录uClinux-dist下生成Romfs子目录及下属目录和文件;make image在根目录uClinux-dist下生成images子目录及下属文件;最后,make命令生成images子目录下的嵌入式操作系统及内核文件。
对最后一步make命令详细分析如下:
[uClinux-dist/makefile]                                        /*根目录下的入口*/
21 all:subdirs romfs modules modules_install image        /*检查依赖项,从subdirs开始*/
259 .PHONY: subdirs                                              
260 subdirs: linux                                         /*转向检查依赖项linux*/
249 linux linux%_only:                   
250 略4行,判断不是2.5内核又没有.depend文件则报错。
254         $(MAKEARCH_KERNEL) -C $(LINUXDIR) $(LINUXTARGET) || exit 1
   /*引导进入linux-2.4.x/子目录,做make bzImage。LINUXTARGET=bzImage*/
[uClinux-dist/linux-2.4.x/makefile]:          /* 此makefile文件中并没有bzImage项!*/
301 include arch/$(ARCH)/Makefile                      /*但却有包含(include)文件!*/
/*在arch/armnommu/Makefile文件中有bzImage项,继续make bzImage*/
[uClinux-dist/linux-2.4.x/arch/armnommu/Makefile]
269 bzImage zImage zinstall Image bootpImage install: $(LINUX)          /*先检查linux*/
[uClinux-dist/linux-2.4.x/makefile]             /*linux在原makefile中,返回原makefile*/
328 $(LINUX):include/linux.version.h $(CONFIGURATION) init/main.o inot/version.o
      Init/do_mounts.o linuxsubdirs            /*检查各依赖项,并生成相应目标文件*/
329        $(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o init/do_mounts.o /
330 --start-group /            /*内核头文件HEAD=kernel/head-armv.o kernel/init_task.o*/
331 $(CORE_FILES) /            /*LINKFLAGS=-P –X –T arch/armnommu/vmlinux.lds*/
332 $(DRIVERS) /       /*CORE_FILES=kernel/kernel.o mmnommu/mmnommu.o fs/fs.o
333 $(NETWORKS) /                       ipc/ipc.o arch/armnommu/mach-snds100.o */
334 $(LIBS) /                /*DRIVERS:=$(DRIVERS-y),NETWORKS=net/network.o*/
335 -end-group//*LIBS=$(TOPDIR)/lib/lib.a /*(无此文件,因是静态链接,不用提供)*/
336  -o $(LINUX)         /*根据链接文件的安排,生成内核linux,包括Romfs.o文件*/
337$(NM)$(LINUX)|grep-v'/(compiled/)/|/(/.o$$/)/|/([aUw]/)/|/(/./.ng$$/)/|/
(LASH[RL]DI/)'|sort>System.map                        /*生成内核映像图文件*/
/*以上linuxsubdirs项引导分目录编译了内核文件,生成了相应的目标文件。注意这时引用的SUBDIRS是被arch/armnommu/Makefile扩充了的,包括12项,分别覆盖标准linux内核程序和与硬件相关的内核类程序。而CORE_FILES、DRIVERS、NETWORKS、LIBS分别引用了这些目标文件,从而构成了内核组(group)。内核组前附有内核头文件和内核初始化文件,后则附有系统文件目录romfs.o,三部分共同构成了系统内核。链接前生成链接文件arch/armnommu/vmlinux.lds */
[uClinux-dist/linux-2.4.x/arch/armnommu/Makefile]:         /*返回armnommu/Makefile*/
270 @$(MAKEBOOT) $@ /*展开为make arch/armnommu/boot LINUX=linux bzImage*/
/*已定义MAKEBOOT=$(MAKE) –C arch/$(ARCH)/boot LINUX=$(LINUX) */
[uClinux-dist/linux-2.4.x/arch/armnommu/boot/Makefile]:        /*忽略LINUX=linux */
129 bzImage: zImage                 /*实际执行make arch/armnommu/boot bzImage*/
131 zImage: $(CONFIGURE) compressed/$(LINUX)
137 compressed/$(LINUX): $(TOPDIR)/$(LINUX) dep
138 @$(MAKE) -C compressed $(LINUX)     /*转入compressed/子目录,做make linux*/
[uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/Makefile]            
72 $(LINUX):$(HEAD)$(OBJS)piggy.o$(LINUX).lds /*系统HEAD=head.o,OBJS=misc.o*/
              /*首先要逐项检查更新依赖文件,条件如后所附。完成后,做下面的链接*/
73   $(LD) $(ZLDFLAGS) $(HEAD) $(OBJS) piggy.o -o $(LINUX)
/*根据链接文件linux.lds,链接生成嵌入式操作系统映像文件linux*/
75 $(HEAD):$(HEAD:.o=.S)                  /*以下12行为上面依赖文件的检查条件*/
76          $(CC) $(AFLAGS) -traditional -c $(HEAD:.o=.S)
78 piggy.o:$(SYSTEM)          /*SYSTEM=linux-2.4.x/linux内核文件,已在前面生成*/
79          $(OBJCOPY)-O binary -R.note -R.comment -S $(SYSTEM)    /*拷贝成piggy文件*/
80          g*** $(GZFLAGS) < piggy > piggy.gz               /*压缩piggy
 
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:23 天前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐