原創,轉載時請注明,謝謝。郵箱:tangzhongp@163.com
博客園地址:http://www.cnblogs.com/embedded-tzp
Csdn博客地址:http://blog.csdn.net/xiayulewa
"生於憂患,死於安樂"。
說說linux如何閱讀內核源代碼,幾年里我所有的筆記和資料都用word寫的,看着它們靜靜的躺在硬盤里,就感覺有些浪費,希望能分享出來,因為包括ucos,u-boot,linux kernel的移植,我都喜歡下載官網比較新的版本,然后自己閱讀源代碼移植。因為要學的詳細點,而我word做的筆記太簡略了點,文章大部分還得重新整理。
源代碼下載
去http://www.kernel.org/中選擇某個適合自己的版本,我下載的是linux.3.10.53. 然后解壓,因為windows不支持符號鏈接,所以解壓還得去linux下,然后刪除arch下除所需體系結構外的所有目錄,如我的體系結構是arm,我就把除arm外的所有目錄都刪了,再去arm目錄下,將其它cpu的文件夾全部刪了,比如我的soc是s3c2440, 則mach-*類似的文件夾我只保留了mach-s3c24xx,而plat-*, 只保留plat-samsung,繼續目錄循環操作,最后只保留特定芯片相關的文件。 這里說說為什么要刪除,因為刪了看源代碼方便點,不然很多重名函數。
閱讀環境配置
使用source insight,閱讀代碼很方便。
略。
生成Map文件
看看map文件內容:
.text 0xc0008c40 0x4f34 arch/arm/kernel/built-in.o
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搜,就找到了。
之前調試時遇到過必須要對上述資源匯總的文件均進行查詢才查找到問題的案例,沒有做筆記,現在忘記了,一時沒有想到比較好的用例,有機會補上來。