原创,转载时请注明,谢谢。邮箱: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搜,就找到了。

    之前调试时遇到过必须要对上述资源汇总的文件均进行查询才查找到问题的案例,没有做笔记,现在忘记了,一时没有想到比较好的用例,有机会补上来。

【linux】内核源代码下载与阅读的更多相关文章

  1. Linux内核源代码获取教程

    Linux内核源代码获取方法 什么叫Linux 什么叫Linux内核 Linux内核源代码的获取 什么叫Linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UN ...

  2. Linux内核源代码情景分析系列

    http://blog.sina.com.cn/s/blog_6b94d5680101vfqv.html Linux内核源代码情景分析---第五章 文件系统  5.1 概述 构成一个操作系统最重要的就 ...

  3. Ubuntu:编译Linux内核源代码和内核模块

    1. 目的 内核模块需要运行在Linux 3.8.13内核中,因此需要为此内核重新编译内核模块源代码. 2. 步骤 1.在Ubuntu 14.04 64位(内核3.13.0-24-generic)上, ...

  4. Linux内核源代码分析方法

    Linux内核源代码分析方法   一.内核源代码之我见 Linux内核代码的庞大令不少人"望而生畏",也正由于如此,使得人们对Linux的了解仅处于泛泛的层次.假设想透析Linux ...

  5. linux内核源代码、配置与编译

    内核源代码下载:www.kernel.org Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具可读性. linux内核代码最好不要在windows ...

  6. 在windows下解压缩Linux内核源代码出现重复文件原因

    在windows下解压缩Linux内核源代码出现重复文件原因 2009年06月30日 13:35 来源:ChinaUnix博客 作者:embededgood 编辑:周荣茂     原因一.因为在Lin ...

  7. Linux内核源代码

    说明:只供学习交流 一,目录结构 Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具有可读性. 二,目录结构 arch目录 arch是archite ...

  8. Linux内核源代码目录树结构

    Linux内核源代码目录树结构. arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录.和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分).mm(内 ...

  9. 《深入分析Linux内核源代码》读书、私藏笔记大放送

    秉承着"不懂操作系统原理的程序员不是合格的程序员"的至理名言,鄙人又是买陈莉君老师的“Linux教学视频”,又是研读其力作<深入分析Linux内核源代码>,先将总结笔记 ...

随机推荐

  1. Card Game Cheater(贪心+二分匹配)

    Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. Vmware ESX 5.0 安装与部署

    近期我公司部署了虚拟化,採购了两台Dell R710的server(CPU:64位双核,主频:2.4GHZ, 32G 内存.硬盘:2块300G做Riad 1.3块2T做Riad 5 .10块网卡),在 ...

  3. VC问题 IntelliSense:“没有可用的附加信息”,[请参见“C++项目 IntelliSense 疑难解答”,获得进一步的帮助]

    当出现以上的问题时,若按照网上所说的解决方法: 1.安装VA(Visual_AssistX) 2.安装Microsoft SQL Server Compact 3.5 3.更改设置“工具-选项-文本编 ...

  4. HashMap,LinkedHashMap,TreeMap的区别(转)

    Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复.Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快 ...

  5. JS - 删除确认

    <a href="javascript:if(confirm('确实要删除吗?'))location='<{:U('Admin/Update/deleteuserinfo', a ...

  6. Python中函数式使用

    对于链表来讲,有三个内置函数非常有用: filter(),map() 以及 reduce(). filter(function, sequence) 返回一个 sequence(序列),包括了给定序列 ...

  7. 树莓派deian的linux常用命令

    Linux系统,这个强大的系统,现在树莓派也要用到.给大家普及一下. 那些常用的Linux命令 linux的文件结构 /   根目录下的目录 /bin /home /dev /usr /opt /et ...

  8. 面向对象程序设计-C++ Operator Overloading & Type conversion (Static)【第十一次上课笔记】

    本次上课继续讲解了 [ ] .-> 等运算符重载的具体例子 也讲解了C++单个参数的类的类型转换的案例 最后稍微提到了 static 的第三种作用:静态数据成员 具体详解我都已注释出来了,大家可 ...

  9. Page的生命周期及相关事件苛

    (1)请求页面:页请求发生在页生命周期开始之前. (2)开始:在开始阶段,将设置页属性,如Request和Response.在此阶段,页还将确定请求是回发请求还是新请求,并设置IsPostBack属性 ...

  10. Unity3D 4.x 使用Mecanim实现动画控制

    Unity3D 4.x 版本号之后提供了一种新的动画机制Mecanim,尽管眼下还支持之前的Animation.但看到Unity3D 4.3 预览版里Sprite的动画也是基于Animator的,可知 ...