280 likes | 504 Views
第十四章. Embedded Linux 開發環境. Linux 系統的發展. Linux 最早是在 1991 年,由芬蘭大學生 Linus Torvalds 在 Helsinki 大學模仿 UNIX 所發展的作業系統 Linux 依照自由軟體基金會 ( Free Software Foundation ) 出版的 GNU 通用公共許可證條款 ( GNU General Public License , GPL ) 開放原始碼內容 一般人可以透過網路下載其原始碼,也吸引了更多學者研究員藉此實現印證他們的理論來改善 Linux ,使得 Linux 的功能日漸強大.
E N D
第十四章 Embedded Linux 開發環境 嵌入式系統導論, 探矽工作室
Linux 系統的發展 • Linux最早是在1991年,由芬蘭大學生Linus Torvalds在Helsinki大學模仿UNIX所發展的作業系統 • Linux依照自由軟體基金會 (Free Software Foundation) 出版的 GNU 通用公共許可證條款 (GNU General Public License,GPL) 開放原始碼內容 • 一般人可以透過網路下載其原始碼,也吸引了更多學者研究員藉此實現印證他們的理論來改善Linux,使得Linux的功能日漸強大 嵌入式系統導論, 探矽工作室
Linux 受歡迎的特性 • 開放原始碼、模組化設計 • 穩定性夠 • 網路功能強大 • 跨平台 • 應用軟體眾多 嵌入式系統導論, 探矽工作室
桌上型Linux系統與嵌入式 Linux 系統 • 最初Linux系統是在桌上型電腦上所發展的作業系統 • 嵌入式系統與桌上型電腦有著許多差異,例如缺少螢幕、鍵盤或是磁碟機等周邊之外,CPU所執行的指令型態也不盡相同,因此需要特別移植有關CPU等硬體相關的程式碼部分 嵌入式系統導論, 探矽工作室
Linux 核心 嵌入式系統導論, 探矽工作室
Linux 檔案系統 嵌入式系統導論, 探矽工作室
Linux MMU的功能 嵌入式系統導論, 探矽工作室
具有MMU 與 non-MMU系統 • 許多嵌入式系統的中央處理器 (CPU) 缺少了記憶體管理單元 (MMU) 功能,使得Linux從標準版本衍生出稱為uClinux的Linux版本 • 原本藉由MMU所達到的記憶體保護與虛擬位址功能在uClinux裡不存在。這表示說核心與應用程式都屬於同一個定址空間,所以應用程式必須很小心的使用記憶體位址 • 並非所有的嵌入式處理器都缺乏 MMU 的機制,因此許多嵌入式為處理器還是可以使用一般的 Linux 核心 嵌入式系統導論, 探矽工作室
Embedded Linux的發展環境 • GNU (GNU‘s Not Unix) 的軟體開發環境 • 包括了編譯器、組譯器、文書處理軟體等各式各樣的應用軟體。藉由這些開發軟體可以順利的編譯出一套Linux系統環境核心或是Linux上的應用程式 嵌入式系統導論, 探矽工作室
跨平台編譯環境 • GNU同樣提供跨平台編譯器,這些方便的工具包括有C編譯器,C++編譯器,組譯器等等 • binutils - 用於操作二進位檔案的程式集合。它們包括諸如 ar、as、objdump、objcopy 這樣的程式 • gcc - GNU C 編譯器 • glibc - 所有應用程式都將鏈結到的 C 函式庫 嵌入式系統導論, 探矽工作室
VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 6 EXTRAVERSION = KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/ar m/ -e s/sa110/arm/) CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) TOPDIR := $(shell /bin/pwd) HPATH = $(TOPDIR)/include FINDHPATH = $(HPATH)/asm $(HPATH)/linux $(HPATH)/scsi $(HPATH)/net HOSTCC = gcc HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer CROSS_COMPILE = # # Include the make variables (CC, etc...) # AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld CC = $(CROSS_COMPILE)gcc CPP = $(CC) -E AR = $(CROSS_COMPILE)ar NM = $(CROSS_COMPILE)nm STRIP = $(CROSS_COMPILE)strip OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump MAKEFILES = $(TOPDIR)/.config GENKSYMS = /sbin/genksyms DEPMOD = /sbin/depmod MODFLAGS = -DMODULE CFLAGS_KERNEL = PERL = perl export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \ all: do-it-all ………….. ……… …. Linux 核心組態的Makefile部分內容 嵌入式系統導論, 探矽工作室
Linux 開機流程 • 開機載入者 (bootloader) • PC的版本來說,開機載入者的種類包含了lilo、grub與syslinux • Embedded Linux的開機載入者的種類例如Blob 、Redboot、Angel或是 PMON 嵌入式系統導論, 探矽工作室
Linux Bootloader • 初始化CPU及決定速度。 • 組態記憶體對映,包括了SRAM、Flash與ROM的位址對映。 • 初始SDRAM的控制器並且載入開機載入者的程式本體到SDRAM裡,然後有必要的話,依據系統規格進行重新對映的工作。 • 初始基本的周邊與載入驅動程式,例如RS-232,有些周邊需要在開機載入者執行的時候作初始化的動作,不過有些周邊可以留待Linux核心來進行初始。 • 設定堆疊指標與參數區域範圍指標。 • 載入Linux核心與根檔案系統 (RFS),並且將偵測到的CPU種類與其他平台參數傳遞給核心,如此便完成了開機載入者的工作了 嵌入式系統導論, 探矽工作室
Linux ROM或是Flash記憶體分配 嵌入式系統導論, 探矽工作室
設定核心 • Linux核心的程式碼可以分成兩大部分 • 與硬體相關的程式碼大部分放在arch目錄 • 與硬體無關的程式碼可以使用選單的方式來選擇核心的組成,然後透過鏈結器腳本 (linker script) 描述核心檔案內的物件配置與映設,製作出一個可執行的 Linux 核心檔案 嵌入式系統導論, 探矽工作室
鏈結器腳本 OUTPUT_ARCH(<arch>) /* <arch> includes architecture type */ ENTRY(stext) /* stext is the kernel entry point */ SECTIONS /* SECTIONS command describes the layout of the output file */ { . = TEXTADDR; /* TEXTADDR is LMA for the kernel */ .init : { /* Init code and data*/ _stext = .; /* First section is stext followed by __init data section */ __init_begin = .; *(.text.init) __init_end = .; } ……………….. 嵌入式系統導論, 探矽工作室
linux/init/main.c 裡的start_kernel函式片段 asmlinkage void __init start_kernel(void) { …… lock_kernel(); printk(linux_banner); setup_arch(&command_line); printk("Kernel command line: %s\n", saved_command_line); parse_options(command_line); trap_init(); init_IRQ(); sched_init(); time_init(); softirq_init(); …… console_init(); #ifdef CONFIG_MODULES init_modules(); #endif …… kmem_cache_init(); sti(); calibrate_delay(); …….. mem_init(); kmem_cache_sizes_init(); mempages = num_physpages; fork_init(mempages); proc_caches_init(); vfs_caches_init(mempages); buffer_init(mempages); page_cache_init(mempages); …….. signals_init(); ………. smp_init(); kernel_thread(init, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL); unlock_kernel(); current->need_resched = 1; cpu_idle(); } 對整個作業系統核心 每一部份做出始化的動作 嵌入式系統導論, 探矽工作室
視窗版核心組態環境 嵌入式系統導論, 探矽工作室
視窗系統 • 嵌入式 Linux 所使用的視窗系統都是藉由直接控制繪圖區域緩衝區 (frame buffer) 的方式,避免掉 X Server 這樣複雜的架構設計 • 目前嵌入式系統常見的視窗系統包括QT/Embedded、Microwindows、Tiny-X、GtkFB、MiniGUI等等 嵌入式系統導論, 探矽工作室
週邊設備驅動程式 • 繪圖區域緩衝區 (Frame Buffer) 嵌入式系統導論, 探矽工作室
Microwindows 嵌入式系統導論, 探矽工作室 Microwindows的MP3 Player和PIM軟體示範畫面
Qt/Embedded Qt/Embedded PDA應用上的示範畫面 嵌入式系統導論, 探矽工作室
MiniGUI MiniGUI的示範畫面 嵌入式系統導論, 探矽工作室
以Tiny X為基礎的JHE專案 以Tiny X為基礎的JHE(Just Handhelds Environment)專案 裡用Gtk+搭配做出來的畫面 嵌入式系統導論, 探矽工作室
GtkFB Red Hat, Inc. 提供的GtkFB在800x600螢幕上畫面範例 嵌入式系統導論, 探矽工作室
Real Time Linux 系統 • 原本的 Linux 設計之初,並不是為了嵌入式系統的環境所設計,不過因為其開放原始碼的特性,有些組織將其修改成符合嵌入式系統所需 • 例如 RTLinux 與 RTAI 嵌入式系統導論, 探矽工作室
應用程式修正 • 應用程式必須配合使用一些專為即時系統所設計的應用程式介面 (API) 來發展,並且搭配一個即時系統的排程器 (scheduler) • 所使用的演算法包括了 RMS (Rate Monotonic Scheduling) 與 EDF (Earliest Deadline First) 等方式,其中 RMS 因為其精簡的實作方式而廣為大家所採用 嵌入式系統導論, 探矽工作室
總結 • Linux原始碼的開放以及開發環境的齊全,使得Linux作業系統在短時間內便成為了嵌入式平台作業系統的一個熱門人選 • 以目前的技術來說,有Preemption Improvement以及Interrupt Abstraction這兩種機制可以為Linux作業系統加入即時系統的要素 • 應用在PDA上的handhelds專案為範例,讓大家能夠感受到Linux的魅力 嵌入式系統導論, 探矽工作室