歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux Kernel Development 3rd Edition 讀書筆記

Linux Kernel Development 3rd Edition 讀書筆記

日期:2017/3/1 10:39:43   编辑:Linux編程
該書有第二版中文版,第三版還沒看到,這裡記錄下該書的要點,並翻譯成中文以加深印象.歡迎指正
第一章 Introduction To The Linux Kernel
1. Linux內核類型Linux
Linux是單一的內核(monolithic kernel),就是說,Linux內核在單一的地址空間中運行,但是Linux借鑒了很多微內核(mircokernel)的優點. Linux使用了模塊化設計,內核搶占,支持內核線程和動態加載不同的內核模塊到內核映像空間.相反,Linux沒有微內核設計的性能較差的缺點:一切都運行在內核模式,直接函數調用,沒有消息傳遞.盡管如此,Linux是模塊化,線程支持及內核自我調度的內核.

2. Linux與Unix的區別
(1) Linux支持動態加載內核模塊,盡管Linux內核是單一型內核,它可以根據命令加載或者卸載模塊.
(2) Linux支持對稱多處理器架構(SMP),盡管多數商業Unix系統支持SMP,但傳統的Unix 實現多數不支持.
(3) Linux內核是可搶占式的,不像傳統的Unix內核,Linux可以搶占在內核運行的任務.商業Unix系統中Solaris and IRIX支持內核搶占,但多數Unix內核是非搶占式的.
(4) Linux的線程支持比較有趣,正常的進程和線程之間並沒有什麼區別,對於內核來說,所有的進程都一樣,僅僅會有不同的共享資源.
(5) Linux提供面向對象的設備模型,該設備模型設備類,即插即用事件和用戶空間的設備文件系統(sysfs).
(6) Linux忽略了Unix的一些內核開發者任務實現糟糕的通用特性,比如STREAMS,或者無法容易實現的標准.
(7) Linux的一切都是免費的.這樣Linux的開發都是自由的,

第二章 Getting Started with the Kernel
1. git使用
使用GIt可以獲得最近的linux版本:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
check out完成後,可以使用如下命令:
$ git pull
來更新Linux內核到最新的版本

2. The Kernel Source Tree


3. 配置內核
(1) 配置選擇有Boolean和tristates兩種類型.Boolean類型可以選擇yes或no.內核特性,比如 CONFIG_PREEMPT通常就是Boolean型.tristates類型有yes,no,module3個值可選.設置成module表示編譯成模塊(可動態加載的對象).tristates類型的數據中,yes表示將代碼編譯到內核映像中,而不是一個模塊.驅動通常就是tristates類型來配置的.
(2) 配置內核命令
文本模式下: $ make config
該命令會一個選項一個選項的讓用戶選擇,會花很多時間.因此最好使用圖形化的配置.
$ make menuconfig 或者基於gtk+的工具: $ make gconfig
$ make defconfig 該命令創建一個基於默認配置的配置.
$ make oldconfig 當更新了配置,或者使用了配置文件到新的內核代碼中,使用該命令進行驗證並更新配置.在編譯內核之前需要運行該命令.
配置選項CONFIG_IKCONFIG_PROC能夠將配置文件保存並壓縮到 /proc/config.gz中.可以使用如下命令將備份的配置文件恢復進行新的編譯.
$ zcat /proc/config.gz > .config
$ make oldconfig
內核配置完成後,使用make命令就可以編譯內核了.
$ make
如果不想看到過多的編譯信息,而只想看到警告和錯誤,可以使用如下命令重定向到其他文件:
$ make > ../detritus
還可以使用如下命令將無價值的輸出信息重定向到null,也就是丟棄.
$ make > /dev/null

4.安裝新內核
這取決於系統架構和Bootloader, 如果是x86使用grub引導,只需復制arch/i386/boot/bzImage目錄到 /boot,更名為 vmlinuz-version之類的名字,然後編輯 /boot/grub/grub.conf,為新內核添加一個新的entry.對於Lilo,則編輯/etc/lilo.conf然後重新運行Lilo.
使用% make modules_install命令來安裝內核模塊,該命令將編譯好的模塊放到 /lib/modules下.

5.內核區別與用戶程序的特點
(1) 內核不能訪問C庫和標准頭文件
常用的C庫函數有在內核中的實現,如printk()代替printf(),用法基本一樣,唯一的區別是printk可以添加一個表示信息優先級的宏(注意沒有逗號),如:
printk(KERN_ERR "this is an error!\n");
(2) 內核由GNU C編寫
支持內聯函數;內嵌匯編;likely()和unlikely()來優化分支語句.
(3) 內核缺少像用戶空間一樣的內存保護機制
(4) 內核很難進行浮點運算
(5) 內核的每個進程都只有固定的很小的棧空間
x86架構上一般為4KB或者8KB.32bit系統8KB,64bit系統16KB.
(6) 因為內核有異步中斷,可搶占,支持SMP,同步和並發運行是內核需要重點注意的方面
通常的解決辦法是使用自旋鎖和信號量.
(7) 可移植性非常重要

Copyright © Linux教程網 All Rights Reserved