看板 Soft_Job 關於我們 聯絡資訊
回憶一下大三教的、跟自己學的東西好了: 以比較經典的 GNU/Linux 為基準來看,系統架構大概長這樣- - (核心架構有分,這邊是用宏核心的觀點) ┌---------------------------------------------------------------------------- | |↑ 應用程式、較使用導向的lib,e.g. ncurse、Xlib ...... |----------------------------------------------------------------------------- |↓ C Runtime Lib: | C POSIX Lib | And so forth... | *NIX世界常見的有: | thread | | glibc/eglibc | file cntl | | uclibc (for uclinux) | ...... | | bionic (for android) +---------------+---------------------- | musl | | newlib | | ...... | | 提供你常見的一些utility function, | | 如printf()、fopen()、,malloc()... | | | | |↑ User-space Level |=====================系統呼叫================================================ |↓ Kernel-spce Level | | Filesystem | Inter-Process Communication (行程間通訊) | Network | ......etc | |----------------------------------------------------------------------------- | Memory Management | Scheduler (排程器) | Interup Handler (硬體中斷處理) | Device Driver | └--------------------以下是硬體---------------------------------------------- ************************************************************************** 再說明一下,我們說的Linux,其實嚴格起來說是指Linux 〝Kernel〞; Ubuntu我們稱作Distro. (Distribution,發行版)。 就如上面所示,Kerenl管的是系統最基本的事情, 像是對檔案系統(i.e. ext3/4,詳細來說來說是隔著VFS)讀寫、 幫你作到同時多工(行程排程)、 幫你掌控滑鼠鍵盤送來的訊號(IRQ handling)...... 要怎麼畫出漂亮的使用者登錄畫面、怎麼做登錄管理、 怎麼管理背景服務(daemon)、怎麼顯示出你的視窗...... 這些東西都是在Kernel之上的,每個功能也有著非常多不同的實做。 如登錄管理有:LightDM、LXDM、xdm ...... etc 背景服務管理,有:Upstart、Systemctl、OpenRC ...... etc 桌面環境,粗略可以概括為:Gnome、KDE、Unity、LXDE ...... etc (牽扯到X-Window細節的先跳過) 將這些東西配套起來,其實是非常耗費功夫的(玩過Linux From Scratch就知道這超級累), 所以就有像是Red Hat、Canonical、Debian Project......等等的團體站出來, 以他們心中的量尺選擇要用哪些程式、加上合適的設定檔、 調整kernel的編譯參數(如排程策略、要包含哪些kernel module), 最後將這一整包打點好的東西發布出來, 便是大家常說的「Linux作業系統」,如Fedora、Ubuntu、Debian。 然而,你提到的ucLinux,定義上來說,也可算是一種「發行版」,只是這個發行版很特別。 上面有提到,有一種東西叫做C Runtim Library, 而ucLinux使用的就不是於一般系統所用的glibc,而是他們特製的uclibc。 在嵌入式平台,資源是十分苛刻有限的,其中尤其對記憶體操控格外的艱困。 很多平台,沒有MMU(記憶體管理單元),這幾乎閹割了所有一般PC系統常見的記憶體分配機制; 詳細狀況,你以去翻一下恐龍書或者《程式設計師的自我修養》中有關於虛擬記憶體的章節。 這邊只快速提一下: 在現代作業系統裡,行程(process)都認為自己有頂天的記憶體大小(e.g. i686下有2^32 bits的虛擬空間), 這麼大的空間依照分頁(page)大小(最基礎4kB),被切為數份,將有用到的片段映射到實際的記憶體上面; 而系統會維護一個page table,紀錄哪些page有被映射、哪些沒有。(CPU上面的TLB是這個的snapshot) 當CPU要求要跑的code不存在實體記憶體時,會促使MMU發出分頁錯誤(page fault)的信號, 再交給對應的部份(如OS的page fault handler)來決定要怎麼辦。 但是......阿便宜的嵌入式平台就沒有MMU啊~ 所以這部份就只能交給CPU、跟軟體層來虛擬了, 但也因為這樣先天的限制,有很多事情是作不到的。 如ucLinux缺了一票相關的system call,像brk()、fork() ...... 說到最後,你想要學嵌入式的Linux開發, 我個人會建議你先去把歐萊禮的《建構嵌入式Linux系統》翻一遍 看到不懂的概念,可以去翻恐龍書(Operating System Concepts)、 《Understanding Linux The Linux Kernel》 或許巨O、聯O號稱可以幾堂課上完啦...... 但我覺得這麼多基礎要壓縮在那麼短的時間內上完,應該很困難。 = = = = = = = = = = = = = = rootfs那邊其實還有很東西可以說的...... Linux的開機流程其實一直在微調,從早年的initrd進化到initramfs,後來還有再改良 基本上Linux 2.6後引入initramfs後是個分水嶺。 不過大觀念來說依舊是:Kernel在完成他該完成的事情後,會把使用權交還給userspace。 他要做的事情大抵可以參考這篇:http://goo.gl/0tpauK 然而,在現今複雜的系統中,這段期間要做的事情需要C lib的協助(e.g. klibc), 譬如說今天你的系統放在LVM底下、或是usbdisk裡面、亦或有加密過、在SCSI硬碟......etc 這些東西都不是kernel直接應付得來的, 所以會需要一個能放在ramdisk上、堪用的執行環境,那就是initramfs。 (Kernel自己的實做上不能仰仗glibc一類的C lib,因為他就是最基礎的基石, 就一如dynamic loader不能依賴其他share lib是一樣的道理。) 當kernel幫忙把屁股擦完後,會把initramfs drop掉, 掛上真正硬碟上的filesystem,再執行init system(i.e. upstart、systemctl、sysvinit ...... ), -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.235.153 ※ 文章網址: http://www.ptt.cc/bbs/Soft_Job/M.1417078472.A.F41.html ※ 編輯: snaketsai (140.113.235.153), 11/27/2014 16:55:15
mp19990920: 好文11/27 17:34
allexj: 詳細的好文 11/27 18:59
※ 編輯: snaketsai (140.113.235.153), 11/27/2014 20:20:05
PoorLoser: 大三不是教魔獸嗎?11/27 21:51
我不打魔獸 :-P
flylee: 去上課還是有好處,畢竟先上濃縮版課,會比較有整體概念11/27 22:33
epicwonder: 認真好文 11/27 22:40
cha122977: push11/28 00:50
pizza12345: 推11/28 00:55
※ 編輯: snaketsai (140.113.235.153), 11/28/2014 05:22:49 ※ 編輯: snaketsai (140.113.235.153), 11/28/2014 05:33:46 ※ 編輯: snaketsai (140.113.67.151), 11/28/2014 06:03:25
TianBonBon: 推 11/28 08:05
davidhill: 推 11/28 08:15
aa40105: 推 11/28 11:36
BlazarArc: 推 11/28 13:25