【linux】內核源代碼下載與閱讀

 

原創,轉載時請註明,謝謝。郵箱:tangzhongp@163.comhtml

博客園地址:http://www.cnblogs.com/embedded-tzplinux

Csdn博客地址:http://blog.csdn.net/xiayulewawindows

 

"生於憂患,死於安樂"。 函數

說說linux如何閱讀內核源代碼,幾年裏我全部的筆記和資料都用word寫的,看着它們靜靜的躺在硬盤裏,就感受有些浪費,但願能分享出來,由於包括ucos,u-boot,linux kernel的移植,我都喜歡下載官網比較新的版本,而後本身閱讀源代碼移植。由於要學的詳細點,而我word作的筆記太簡略了點,文章大部分還得從新整理。ui

源代碼下載

http://www.kernel.org/中選擇某個適合本身的版本,我下載的是linux.3.10.53. 而後解壓,由於windows不支持符號連接,因此解壓還得去linux下,而後刪除arch下除所需體系結構外的全部目錄,如個人體系結構是arm,我就把除arm外的全部目錄都刪了,再去arm目錄下,將其它cpu的文件夾所有刪了,好比個人soc是s3c2440, 則mach-*相似的文件夾我只保留了mach-s3c24xx,而plat-*, 只保留plat-samsung,繼續目錄循環操做,最後只保留特定芯片相關的文件。 這裏說說爲何要刪除,由於刪了看源代碼方便點,否則不少重名函數。spa

閱讀環境配置

    使用source insight,閱讀代碼很方便。.net

    略。調試

生成Map文件

 

    看看map文件內容:htm

.text 0xc0008c40 0x4f34 arch/arm/kernel/built-in.oblog

0xc0008c40 elf_check_arch

0xc0008ccc arm_elf_read_implies_exec

0xc0008cf0 elf_set_personality

0xc00090d4 no_fp

0xc0009134 ret_from_exception

0xc0009144 __switch_to

0xc0009210 ret_to_user

 

Map文件包含了函數,函數地址,函數所在的文件夾,如ret_to_user函數(標號?)的地址爲0xc0009210,其函數所屬文件在文件夾arch/arm/kernel/下。

    Map文件存在的意義,linux跨平臺,有時同一個函數名可能在不一樣的文件出現,用source insight搜索獲得不少結果,此時根據map文件就能夠定位linux編譯採用的是哪個函數,在內核調試時就很是方便。

    Map文件添加方法:

在src/Makefile中export LDFLAGS_vmlinux以前添加

LDFLAGS_vmlinux += -Map vmlinux.map

 

而後編譯make menuconfig, make。最後會在.config文件相同的目錄下生成該文件。

Make時也能夠make -V > make.log,將make輸出信息打印到文件。

 

生成反彙編文件vmlinux.dis

    推薦文章的方法:http://www.cnblogs.com/sdphome/archive/2012/03/05/2380703.html

    簡便一點能夠直接使用arm-linux-gcc -S vmlinux > vmlinux.dis

   

 

資源彙總

    內核閱讀與調試 主要涉及到的文件:

    最重要的linux內核源代碼,vmlinux.dis, make.log, vmlinux.map, vmlinux.lds, Makefile。

vmlinux.lds在linux內核src\arch\arm\kernel目錄下。

 

實例

    cdev_init, 直接在source insight搜,就找到了。

    以前調試時遇到過必需要對上述資源彙總的文件均進行查詢才查找到問題的案例,沒有作筆記,如今忘記了,一時沒有想到比較好的用例,有機會補上來。

相關文章
相關標籤/搜索