關於Linux核心學習(尚觀Linux研究室)

來源:互聯網
上載者:User
 
 

1. 請推薦一些好的Linux核心參考書?
a.《Linux Device Drivers, Second Edition》,有中文譯本
b.《Understanding the Linux Kernel, 2nd Edition》
c.《Linux核心原始碼情景分析》,分上下兩冊
d.《邊幹邊學-Linux核心指導》

2. 核心原始碼問題
2.1 如何得到某一版本的Linux核心原始碼?
a. http://www.kernel.org或ftp://ftp.kernel.org,這是Linux核心版本的發布
網站。
b. 很多鏡像或以磁碟為基礎的網站也提供部分Linux核心版本的下載,多用ftp搜尋引擎。
c. 一般的Linux發行版如Redhat之類會隨盤提供相應的核心原始碼,不過這個源代
碼往往是改動過的,與同版本的標準Linux核心可能有些差異。

2.2 請推薦一些原始碼查看工具?
a. Windows系統可以用Source Insight,Linux系統可以用Source Navigator。
b. vim或emacs編輯器,配合cscope、ctags、etags等交叉索引工具。
c. vim或emacs編輯器,配合grep、egrep等文本搜尋工具,不過最好要對原始碼目
錄結構有所熟悉
d. LXR,以網頁的形式通過瀏覽器瀏覽,安裝複雜,可從http://lxr.linux.no/下
載該工具也可以直接存取http://lxr.linux.no/source/線上閱讀Linux核心源
代碼。

2.3 xx結構的定義在哪個核心源檔案中?
a. 請使用源碼查看工具,見問題2.2。
b. 如果用grep等文本搜尋工具,主要在include/linux和include/asm兩個目錄下
搜尋。

2.4 volatile和__volatile__是什麼意思?
a. volatile是C語言定義的關鍵字,gcc為了需要又定義了__volatile__,它和
volatile表達的是同一意思。
b. volatile的本意是"易變的",由於訪問寄存器的速度快於訪存,所以編譯器一般
都會作最佳化以減少訪存。如果變數加上volatile修飾,則編譯器就不會對此變數
的讀寫操作進行最佳化,即不通過寄存器緩衝而直接訪存。
c. __asm__ __volatile__一起指示編譯器不要改動最佳化後面的彙編語句。

2.5 do{ ... } while(0)是什麼意思?
a. 主要是為了避免宏在不同情況展開可能會出現的一些錯誤。
b. 在http://www.kernelnewbies.org/faq/上有詳細介紹。

2.6 list_entry的定義是怎麼回事?
a. list_entry的定義在核心源檔案include/linux/list.h中:
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
b. 其功能是根據list_head型指標ptr換算成其宿主結構的起始地址,該宿主結構是
type型的,而ptr在其宿主結構中定義為member成員。如:

req>|type型對象起始地址
|
|... ...
ptr>|ptr指標所指的member成員地址
|
|... ...

ptr指向圖中所示的位置,通過(unsigned long)(&((type*)0)->member)得到ptr
和req之間的差值,ptr減去這個差值就得到了type型宿主結構的指標req,返回
類型為(type*)。

3. 模組編程問題
3.1 模組編程需要注意什嗎?
a. 在gcc編譯選項中增加-c
b. 在gcc編譯選項中定義兩個宏:-DMODULE -D__KERENL__
或直接在源檔案中定義這兩個宏:
#define MODULE
#define __KERNEL__
c. 在源檔案中包括module.h檔案:
#include
d. 如果要用inline功能,需要在gcc編譯選項中增加-O2

3.2 為什麼insmod一個模組時顯示版本不匹配?
假定你現在啟動並執行核心的源碼目錄絕對路徑是MyKernelSrcPath,在gcc編譯時間
增加選項:
-I $MyKernelSrcPath/include

3.3 為什麼出現Unresolved Symbol?
a. 首先查看檔案/proc/ksyms,看核心有沒有輸出這個符號,不同的核心版本如
2.2和2.4輸出的符號會有些變化。
b. 如果核心輸出的符號帶有版本控制資訊如符號printk_R12345678,則性質同
問題3.2。

3.4 為什麼出現no license錯誤?
在源檔案加入下面一行:
MODULE_LICENSE("GPL");

3.5 為什麼看不到用printk列印的資訊?
a. 列印訊息受層級的限制,訊息層級可以通過printk設定,如:
printk("something"); /* 其中0<=n<=7 */
假設控制台的訊息層級為m, 當n
這樣一方面可以提高要列印訊息本身的層級(數字越小層級越高),
另一方面可以改變控制台的訊息層級(可從1到8),如改為8可用以下命令:
# echo "8" > /proc/sys/kernel/printk
b. 用dmesg命令看。
c. 當系統運行klogd和syslogd時,核心訊息就會由klogd分發到syslogd,
syslogd會根據設定檔/etc/syslog.conf作相應處理,具體可以查看syslogd
和syslog.conf的man頁。

4. 核心開發問題
4.1 怎麼製作、使用patch檔案?
patch檔案是由diff命令產生的,使用patch檔案用patch命令,具體可查看diff和
patch的man頁和info。

4.2 在核心中可以使用系統調用嗎?
a. 可以。核心原始碼中就有使用系統調用的例子,如open()、execve()等。
b. 在核心中使用系統調用必須要在源檔案中包括以下兩行:
#define __KERNEL_SYSCALLS__
#include
c. 核心中使用系統調用的相關定義可查看檔案include/asm/unistd.h。
如果要用的系統調用該檔案中沒有定義,可以按照其格式自行添加。

4.3 在核心中怎麼開啟並操作一個檔案?
a. 直接用open()、read()等系統調用,見問題4.2。
b. 用filp_open()函數開啟檔案,得到struct file *的指標fp。
使用指標fp進行相應操作,如讀檔案可以用fp->f_ops->read。
最後用filp_close()函數關閉檔案。
filp_open()、filp_close()函數在fs/open.c定義,在include/linux/fs.h中
聲明。
c. 自己寫封裝函數,可參照檔案fs/exec.c中的open_exec()和kernel_read()函數。
在http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK
&Number=363455&page=&view=&sb=&o=&vc=1上有些代碼可以參照。

4.4 在核心中讀寫檔案時為什麼會出現EFAULT錯誤?
a. 核心檔案系統提供的read()和write()之類的函數,期望是對使用者態程式服務的,
所以它會驗證讀寫緩衝區不超過使用者空間的上限即0xC000 0000。但現在核心中
要讀寫檔案,緩衝區在核心中即地址會超過0xC000 0000。
b. 在讀寫檔案前先得到當前fs:mm_segment_t old_fs=get_fs();
並設定當前fs為核心fs:set_fs(KERNEL_DS);
在讀寫檔案後再恢複原先fs: set_fs(old_fs);
set_fs()、get_fs()等相關宏在檔案include/asm/uaccess.h中定義。

5. 其它

5.1 請問xx命令、xx庫的源碼是哪個檔案?
a. 一個系統除了核心以外,還需要有shell、gcc等一系列工具和命令以及C庫等一
系列庫,這些作為應用程式其原始碼都不在核心中,需要另外下載相應的原始碼。
b. 對於Redhat系統,可以用rqm -qf命令來尋找某一命令所在的軟體包,然後再找
相應的原始碼包安裝。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.