linux系統是軟體開發歷史上的乙個傳奇。來自全球的個人、公司、團體為了完成開放和自由的訴求,在一種鬆散但是卻有效的方式下,成功地建立乙個偉大的生態系統。無論從軟體的規模和穩定性上面,linux都是首屈一指的。當然這裡說的linux更多的是乙個生態,它包括核心、驅動、庫檔案、gui、資料庫以及上層應用軟體。linux產生的基因決定了它的應用只能侷限在乙個小的範圍內。當然,你可以不服氣地說不是還有android嘛,但是我們要清楚android事實上是乙個建立在linux之上的虛擬機器,嚴格意義上說和linux的關係不是那麼大。沒有google的推廣和移動終端聯盟的支援,linux系統本身只能偏安一隅,在特定的領域發揮特定的作用,而不是像windows一樣成為所有人每天必須要面對的系統軟體。
當然,說了這麼多,我們真正關心的是自身可以從這個生態圈中獲得些什麼?說得更直白一點就是,我們可以從linux系統上面學到點什麼,它對我們個人的成長和發展有哪些積極的因素。個人覺得,完全可以通過下面四個維度並結合自己的興趣進行選擇和判斷。
(1)熟練學習linux、配置linux和使用linux
(2)利用linux開發應用層軟體
通俗意義上來說,利用linux開發應用層的軟體和windows上面開發應用軟體沒有什麼不同。可能,在windows上面使用得比較多的就是mfc、gdi、win32這些介面,而在嵌入式上面使用的就比較多種多樣了,什麼qt、minigui、gtk都是可以用來進行開發的。當然,上面說的都是介面程式,很多公司的linux程式是沒有介面的,比如說遊戲公司的linux工程師。相比較而言,他們看中的更多的是linux的穩定性,所以在linux上開發的更多的都是伺服器端程式。很多人都有乙個誤解,認為作業系統就一定比應用軟體高階,其實不然。在我看來,office、webkit、samba、mplayer這些軟體的**都是在百萬行以上,本身的結構也是相當複雜的。說到應用開發,網上有幾本書,分別是《linux程式設計》、《unix環境高階程式設計》、《unix網路程式設計》,對我們都很有借鑑意義。誠然有些書是基於unix系統的,但是基本的程式設計介面都是差不多的,相應的**在linux跑絕對沒問題。
(3)利用linux開發驅動
linux驅動其實並不複雜,我們要做的就是在linux統一的驅動框架下實現對外設的統一管理。很多的**架構都是現成的,所以我們只要做好模仿、學習、測試和驗證就可以了。比較簡單的**就是下面的這一段話,
#include #include module_license("gpl");
module_author("feixiaoxing");
module_description("this is just a hello module!\n");
static int __init hello_init(void)
static void __exit hello_exit(void)
module_init(hello_init);
module_exit(hello_exit);
載入模組就是輸入insmod hello.ko,解除安裝模組就是rmmod hello.ko。在這過程中,我們都可以看到相應的列印內容。當然,朋友們可以一直往裡面加**,一步步除錯,一步步學習,只要堅持和總結,都是可以學習好linux的驅動**的。
這裡順便把makefile也寫一下,
ifneq ($(kernelrelease),)
obj-m := hello.o
else
pwd := $(shell pwd)
kver := $(shell uname -r)
kdir := /lib/modules/$(kver)/build
all:
$(make) -c $(kdir) m=$(pwd) modules
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif
(4)linux kernel**移植、修改和維護
linux kernel**相信是被很多人奉為經典的,但是linux kernel的**很長也很難。一方面,linux**存在技巧**、彙編**,同時部分函式冗長、檔案冗長、命名不規範,另外一方面linux的**分布合理、系統流程明顯、相關資料眾多。關鍵是我們自己怎麼從linux kernel中學到東西?是看書呢,還是看**呢?是每一行都看呢,還是按照模組看呢?是掌握主要原理呢,還是看實現技巧呢?是看高版本呢,還是先熟悉低版本呢?下面,我想就自己的經歷談談自己的看法,
a)熟悉的**認真看,不熟悉的**了解一下介面就可以,對於記憶體管理只要了解__get_free_page、kmalloc、vmalloc這幾個函式就可以了;
b)**不要貪多求快,多思考多實踐;
c)忽視技巧,看中**的處理流程和策略的權衡,多多思考為什麼要這麼設計;
d)利用module特性檢視**的執行日誌,代替函式堆疊的功能;
e)了解linux效能的改進方法,了解為什麼有軟中斷、rcu、slab和各種各樣的延時函式;
f)自己編寫os,實現記憶體管理、訊號量、訊息佇列、驅動開發、中斷和執行緒排程,深入理解os的流程。
隨想錄(linux的四個維度)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!linux系統是軟體開發歷史上的乙個傳奇。來自全球的個人 公司 團體為了完成開放和自由的訴求,在一種鬆散但是卻有效的方式下,成功地建立乙個偉大的生態系統。無論從軟體的規模和穩定性上面,linux都是首屈一指的。當然這裡說的linux更多的是乙個生態...
隨想錄(uclibc的學習)
對於交叉工具鏈來說,uclibc一般都是包括在工具鏈裡面的。通過uclibc,大家可以像開發x86使用者程式一樣,開發其他cpu上的應用程式。uclibc相比較glibc而言,包含的檔案較少,功能也有刪減,且每乙個目錄代表乙個動態庫,閱讀起來基本不會遇到什麼問題。1 uclibc的 怎麼看?建議直接...
隨想錄(epoll的使用)
要說linux下面最好用的介面恐怕就是epoll了。不管是網路程式設計,還是其他pipe程式設計,使用epoll都很方便。而且,epoll的函式個數少,結構也非常簡單。一般只要學好了epoll create epoll ctl epoll wait close這四個函式就可以了。如果大家有這方面的需...