Linux內核學習之一-Take It Easy!

起-作個瞭解底層的碼農

節前上班的日子老是那麼清閒,這麼集中的時間,正好集中學習一下。一直以來都作的是Java開發,對不瞭解底層,總以爲心有不安。聽到別人提及「進程切換」、「內存管理」、「內核態和用戶態」,也老是以爲似懂非懂。因此就乾脆把目標定大一點,學學Linux內核吧!linux

承-下載Linux內核及編譯

下載

其實若是你使用Linux系統,那麼內核的源碼就直接在/usr/src目錄下了。不過仍是建議去下載一份最新的源碼!哪裏下載呢?Linux的做者-大名鼎鼎的Linus Torvalds也是Git的做者,因此你知道最新的源碼去哪裏下載了吧!趕忙去https://github.com/torvalds/linux拉一份最新代碼吧!git

git clone https://github.com/torvalds/linux

代碼一共有1.4G,因此耐心等待一會吧…github

編譯內核

編譯內核是個苦力活。首先,你必須得在Linux系統下,由於編譯Linux是依賴gcc的。而後,你編譯的版本得跟當前版本一致(博主不徹底確定,可是實踐下來是這樣)。安全

而後就是編譯了!Linux內核編譯反而會簡單,由於它沒有太多的依賴要編譯。因此能夠用經常使用的三段式(須要root權限):網絡

make config
make
make install #install就替換當前內核了,三思然後行!
  1. make config是交互式的,會須要指定使用什麼不使用什麼。不過這選項實在太多了點,第一次大概選了幾百個選項吧…後面才知道,能夠圖個方便,用make allyesconfig來替代了。反正咱們只是看看能不能編譯嘛,嗯。
  2. make是個很漫長的過程。
  3. make install會替換當前內核了,咱們這邊就不替換了。

總之到了這裏,已經有一些成就感了!編輯器

開始讀代碼?

關於Linux的代碼結構有不少文章,例如這篇:http://blog.csdn.net/liaoshengjiong/article/details/3957654,就不贅述了。查看一下代碼,乖乖,一共500多萬行,估計一兩年也讀不完吧!個人目的只是瞭解底層的基本原理,沒有必要深刻到各類細節。更況且,好多驅動、文件、內存的概念也不熟悉,怎麼辦呢?仍是先看書吧!性能

轉-仍是讀書吧

我以前的觀點是讀源碼前至少了解項目的領域知識。對於Java碼農來講,操做系統畢竟不是熟悉的領域,一開始就看源碼不太現實。一兩本參考書是必不可少的。這裏我也瀏覽過幾本書,最後以爲比較好的是《Linux內核設計與實現》,這本書大部分是理論爲主,可是最後總會介紹到大體對應的代碼在哪裏,就起到很是好的提綱挈領的效果。對於有過一些代碼經驗的人來講,會以爲異常親切。關鍵是,它只有200頁!學習

瀏覽的另外幾本書,包括大名鼎鼎的《深刻理解計算機系統》,這本書全面詳盡,可是更適合作教材,實踐性弱了點(雖然它也有不少例子)。還有一本《深刻理解LINUX內核》,內容對於入門又深了一點。一句話,講了「深刻」的都不太適合入門!還有本《30天自制操做系統》,不是說書很差,而是太基礎了點,看到「用二進制編輯器寫代碼」就看不下去了。atom

合-Take It Easy!

好了,下面開始學習了。其實弄了那麼多,我想說一件事就是,內核雖然很難,不少人只靠研究它就已經成了大牛。可是它難在於,越是底層的東西,對質量、穩定性、性能要求越高,同時須要考慮的狀況越多,可是其實其理論和思想,可能你們都是耳熟能詳的。操作系統

例如,在「進程管理」部分,咱們常見的「進程描述符」對應的是sched.h中的一個結構:task_struct:

struct task_struct {
	volatile long state;	/* -1 unrunnable, 0 runnable, >0 stopped */
	struct thread_info *thread_info;
	atomic_t usage;
	unsigned long flags;	/* per process flags, defined below */
	unsigned long ptrace;
	…
}

而進程是保存在一個帶優先級的雙向鏈表裏的,這跟Java裏的PriorityQueue原理類似。怎麼樣,是否是以爲「進程調度」也沒有那麼神祕了呢?

同理,咱們常常說「內核態」和「用戶態」,實際上二者的代碼都是c實現,搞出一個「內核態」是爲了安全和某些性能的考慮,可是區別也沒有想象中的那麼大!其實這跟咱們熟悉的「平臺」和「業務邏輯」是否是有那麼點類似呢?

總之,掌握基本的內核知識,應該仍是不難的!好處就是,之後對程序設計的理解會更進一步了!

關於內核實現的一些原理的具體內容,《Linux內核設計與實現》(Linux Kernel Development,簡稱LKD)已經比較全面了,網絡上的資料也很是多。這系列博文主要想站在初學者的角度,在瞭解How以前,先了解What跟Why,從而對內核有個穩固的大局觀。同時會尋根究底的方式,找到對應的內核代碼,知足一下考究的愛好。 PS:博主對c和Linux的理解都是入門水平都算不上,若是有問題歡迎指正,我會很開心接受的!

相關文章
相關標籤/搜索