嵌入式作業系統uClinux及其原始碼分析(ZT)

來源:互聯網
上載者:User
(太原理工大學 電腦與軟體學院 中國 太原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, uClinux1       前言嵌入式技術飛速發展,其高端微控制器已有九成是建立在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.o333 $(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) dep138 @$(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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.