作者snaketsai (林納斯依絲顧德)
看板Soft_Job
標題Re: [請益] Uclink? kernel ? Ubuntu?
時間Thu Nov 27 16:54:30 2014
回憶一下大三教的、跟自己學的東西好了:
以比較經典的 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