原創,轉載時請註明,謝謝。郵箱: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文件內容: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輸出信息打印到文件。
推薦文章的方法: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搜,就找到了。
以前調試時遇到過必需要對上述資源彙總的文件均進行查詢才查找到問題的案例,沒有作筆記,如今忘記了,一時沒有想到比較好的用例,有機會補上來。