在Unix內核中使用浮點數非常困難,如果你想給自己找麻煩的話,可以試試。用戶空間代碼要使用浮點數指令時,一般來說會產生一個中斷,內核捕獲該中斷並作相應的處理。
然而,Unix內核沒法捕獲自己。而且,要使用浮點指令,不但要保存浮點寄存器,還要做很多繁瑣的事情——光看看Unix內核如何為用戶空間代碼使用浮點數就知道了,可以參考進程調度裡的上下文切換。
用戶空間的程序可以在棧上申請大量的空間——定義足夠多的局部變量,因為用戶空間的棧非常大,而且可以動態增長。不過有些不夠智能的系統做不到動態增長。然而,Unix內核的棧非常小,而且無法動態增長。
作為一個搶占式多任務、支持對稱多處理(SMP)的系統,同步和並發是任何一個Unix內核hacker都需要時時刻刻小心的問題。調度器“興之所至”,調度進程,這就需要同步;加上來自CPU外的各種中斷導致Unix內核需要對某些代碼或數據加以保護。
而搶占的意思就是,無論誰占用了CPU,都有可能被其他進程搶掉,內核也不例外。Linux對於競態條件提供了spinlock(自旋鎖)和semaphore(信號量)。
最後就是移植性問題。這個問題從來都不見簡單,而且linux的目標是多種平台都能運行,因此移植性顯得更為重要。字節序問題就是一個典型的移植性問題。然而,應用程序可能僅僅為一個平台開發。
看了這些,是不是覺得,其實Unix內核開發也不難呢?
有雄心的hacker們,不要被OS kernel這個名詞嚇倒。看看Linux Kernel Development,准備好Linux內核源碼,沏上一杯茶,然後你就可以開發內核了!
參考:
Linux Kernel Development, 2nd edition, by Robert Love
Copyleft (C) 2007 raof01. 本文可以用於除商業用途外的所有用途。若要用於商業用途,請與作者聯系。