隨手扎
【讀書筆記】你也可以撰寫Linux核心 從嵌入式系統切入
推薦指數:★☆☆☆☆
並不是說不推薦,只是不知道通用性有多高。本書主要是針對一個硬體平臺為標的,雖然利用了大量Linux核心的抽象,應該移植不會困難。但雖然我也沒有實際操作,但本書仍然可以看到Linux核心的設計和原則,其中我也進一步了解過去不清楚的部份。僅推薦給已經有一部分概念的人閱讀。那麼一樣,紀錄一下我認為值得紀錄的部份。(雖然這次不多,因為大部分段落沒完全看懂,感受不到很深刻)
還有,這篇筆記寫得蠻亂的XXDDD
Linux Kernel Module相關
lsmod
例出核心模組insmod
載入核心模組modinfo
模組訊息modprobe
rmmod
載出核心模組
作業系統中睡眠、阻塞、暫停的區別(Page 6-2)
- 暫停執行緒:讓執行緒睡眠(不佔用CPU),直到需要的時候主動喚醒。
- 執行緒睡眠(sleep):讓執行緒睡眠,並於約定的某時刻後繼續工作。
- 執行緒阻塞:實行緒工作缺乏所需資源,暫停執行直至資源被滿足。
阻塞IO、poll()、非阻塞IO、非同步通知
poll()
應該是非同步阻塞型I/O的一種相關工具。相關的應該還有 select
、 epoll
。之前在了解高連線數的高性能Web伺服器時多少有看到些(link)。Node.js使用到的libev背後概念似乎也是這個。
邏輯上應該是加入一個列隊串列,當資源可用時喚醒。
同步與互斥
- 自旋鎖(SpinLock)
- 互斥鎖(Mutex)
自旋鎖是程序處於忙等待的狀況,對於CPU使用率有所浪費,一般不建議使用,自行的實現效果可能也不好。用於無法中斷的部份,且盡可能區塊短小,盡快釋放支援。核心模組程式無法使用核心提供的服務,上下文(context)的切換通常難以保留,就必須使用自旋鎖。
互斥鎖則是等待資源的程序,會加入系統提供的服務,處於等待狀態。等待狀態可能是暫停狀態,直至資源可用。
原子操作也是一類不可中斷的操作,是實現互斥鎖的基礎。換句話說,互斥鎖應該有部份基於自旋鎖,並透過一些機制,使CPU使用率更高。(或許可以再參考事件模型或Actor Pattern)
嵌入式軟體v字型開發模式(page 12-21)
v字型開發模式是一種系統發展生命周期的模式。實際上不只是軟體專案,有許多工業亦採取類似方式。
本書所提到的主要流程為:
- 需求分析
- 系統設計(實現規劃)
- 概要設計(KO模組級)
- 詳細設計(函數級)
- 程式開發
- 單元測試
- 詳細設計(函數級)
- 整合測試
- 概要設計(KO模組級)
- 系統測試(與應用同步)
- 系統設計(實現規劃)
- 驗收測試
此外還有兩個部份:
- 靜態測試評鑑,程式碼檢查
- 檢驗,動態測試。
透過這張v型圖,更可以理解在軟體測試的藝術筆記中,所提到的多數測試的層級。
基本原則(page 13-2)
本書提到的一些基本原則,有些值得參考,有些個人認為依情況考量。
- 首先是人為撰寫程式,其次才是電腦。
(…只有易讀、易維護的軟體程式才具有生命力)- 保持程式的簡明清晰,避免過份的程式設計技巧。
- 可以適當的使用全域變數
- 可以適當的使用goto敘述
- 盡可能重用、修正老的程式,盡量使用核心函數,盡量不要重寫。
本書後面還提到不少原則可以參考。
關於第4點,有些程式語言根本沒有提供這樣的能力。程式撰寫的美感應該是在撰寫人身上,而非程式語言本身。不少程式語言的規範是可以參考,必要時打破的。這也是我喜歡Lisp的原因。不過多人共同作業時,一個硬性的死規定更容易合作。
尤達表達式(page 13-8)
我不認為尤達表達式現在重要,這反而造成閱讀困難,違反Clean Code最重要的原則——易讀。有許多編譯器已經會提示警告,可能已經不需要這樣的寫法。但如果你是在寫嵌入式系統,注意一下是否應該使用尤達表達式以避免誤寫的情況。
關於尤達表達式,也曾經出現在編寫可讀代碼的藝術的筆記裡。