相信有很多人用 SourceInsight 查看 Linux Kernel 源码,但导入源码时会遇到一些问题。
1、如果把整个源码树都导入进去,查看符号定义的时候,会发现有大量重复定义,很难找到正确的位置
2、如果手动导入只和该硬件平台相关的源码,工作量太大
本帖提供了一个方法,可用脚本生成只和该硬件平台相关的源码的文件列表,然后通过该文件列表,将相应文件导入 SourceInsight 。
以下是步骤,共4步:
1、新建 SourceInsight 项目
     先不要导入文件,停在如下界面:
    

2、完整编译内核,将编译时输出的信息保存到一个文件中
    例如:

  1. make ARCH=arm > build_log.txt

build_log.txt 文件中内容大致如下:

  1. CC      init/main.o
  2. CHK     include/generated/compile.h
  3. CC      init/do_mounts.o
  4. HOSTCC  usr/gen_init_cpio
  5. CC      arch/arm/vfp/vfpmodule.o
  6. CC      arch/arm/kernel/elf.o
  7. AS      arch/arm/kernel/entry-armv.o
  8. AS      arch/arm/vfp/entry.o
  9. AS      arch/arm/kernel/entry-common.o
  10. CC      arch/arm/kernel/irq.o
  11. AS      arch/arm/vfp/vfphw.o
  12. GEN     usr/initramfs_data.cpio
  13. CC      arch/arm/kernel/opcodes.o

3、生成文件列表
     下载 帖子 最后面的附件,解压后是 linux shell 脚本。
    编辑脚本两个变量,ARCH 和 MACH,MACH是平台的名字。如果你用的平台对应 arch/arm/mach-at91 的话,就改成 MACH=at91,以此类推。
           
    在内核源码目录下执行:

  1. ./sg.sh build_log.txt file_list.txt

复制代码

这样,SourceInsight 需要的 文件列表 file_list.txt 就生成了。里面的内容大致如下:
      

4、导入文件列表
     回到 SourceInsight,点击窗口右下角 help 按钮上方的 “add from list” 按钮导入生成的 file_list.txt 文件。
       
     到此为止,文件导入完成了。重新打开工程,会提示同步、构建,之后就可以正常的查看源码了。

这样导入的文件和硬件平台是完全对应的。
下面是本帖的核心,就是这个脚本,有兴趣的可以看看:

  1. #!/bin/sh
  2. ARCH=arm
  3. MACH=at91
  4. FILE_IN=$1
  5. FILE_OUT=$2
  6. # .c
  7. SOURCE_LIST=""
  8. # generated file list
  9. FILE_LIST=""
  10. # nest depth for function get_includes()
  11. NEST_DTPTH=0
  12. # recursive function, used to get included files from files.
  13. # result is stored in FILE_LIST
  14. # $1 : file list, e.g. "fs/ext4/file.c fs/ext4/fsync.c"
  15. get_includes()
  16. {
  17. local includes
  18. local file
  19. for file in $1
  20. do
  21. if [ ! -e ${file} ]; then
  22. continue
  23. fi
  24. if echo "${FILE_LIST}" | grep -E ${file} > /dev/null; then
  25. continue
  26. fi
  27. FILE_LIST="${FILE_LIST} ${file}"
  28. NEST_DTPTH=$((NEST_DTPTH+1))
  29. echo "<${NEST_DTPTH} : ${file}"
  30. includes=$(                                                                                \
  31. grep -E -H '^#include' ${file} |                                \
  32. sed -r \
  33. -e 's@^.*<(acpi/.*)>@include/\1@'                 \
  34. -e 's@^.*<(asm-generic/.*)>@include/\1@'\
  35. -e 's@^.*<(config/.*)>@include/\1@'         \
  36. -e 's@^.*<(crypto/.*)>@include/\1@'         \
  37. -e 's@^.*<(drm/.*)>@include/\1@'                 \
  38. -e 's@^.*<(generated/.*)>@include/\1@'         \
  39. -e 's@^.*<(keys/.*)>@include/\1@'                 \
  40. -e 's@^.*<(linux/.*)>@include/\1@'                 \
  41. -e 's@^.*<(math-emu/.*)>@include/\1@'         \
  42. -e 's@^.*<(media/.*)>@include/\1@'                 \
  43. -e 's@^.*<(misc/.*)>@include/\1@'                 \
  44. -e 's@^.*<(mtd/.*)>@include/\1@'                 \
  45. -e 's@^.*<(net/.*)>@include/\1@'                 \
  46. -e 's@^.*<(pcmcia/.*)>@include/\1@'         \
  47. -e 's@^.*<(rdma/.*)>@include/\1@'                 \
  48. -e 's@^.*<(rxrpc/.*)>@include/\1@'                 \
  49. -e 's@^.*<(scsi/.*)>@include/\1@'                 \
  50. -e 's@^.*<(sound/.*)>@include/\1@'                 \
  51. -e 's@^.*<(target/.*)>@include/\1@'         \
  52. -e 's@^.*<(trace/.*)>@include/\1@'                 \
  53. -e 's@^.*<(uapi/.*)>@include/\1@'                 \
  54. -e 's@^.*<(video/.*)>@include/\1@'                 \
  55. -e 's@^.*<(xen/.*)>@include/\1@'                 \
  56. -e "s@^.*<(asm/.*)>@arch/${ARCH}/include/\1 arch/${ARCH}/include/generated/\1@"        \
  57. -e "s@^.*<(mach/.*)>@arch/${ARCH}/mach-${MACH}/include/\1@"        \
  58. -e 's@(^.*/)[^/]+\.c.*\"(.*)\"@\1\2@'         \
  59. -e 's@/\*.*@@'                                                         \
  60. -e 's@^.*\#include.*$@@'                                  \
  61. -e 's@^@ @' |                                                        \
  62. sort |                                                                                 \
  63. uniq |                                                                                \
  64. tr -d '\n' |                                                                 \
  65. tr -d '\r'                                                                        \
  66. )
  67. if [ -n "${includes}" ]; then
  68. get_includes "${includes}"
  69. fi
  70. echo ">${NEST_DTPTH}) : ${file}"
  71. NEST_DTPTH=$((NEST_DTPTH-1))
  72. done
  73. }
  74. # get *.c from kernel build log
  75. SOURCE_LIST=$(                                                \
  76. grep -E '^\s*CC' ${FILE_IN} |        \
  77. sed -r                                                         \
  78. -e 's/^\s*CC\s*/ /'                        \
  79. -e 's/\.o/\.c/'                        |        \
  80. tr -d '\n' |                                         \
  81. tr -d '\r'                                                \
  82. )
  83. echo ${SOURCE_LIST}
  84. get_includes "${SOURCE_LIST}"
  85. FILE_LIST=$(echo "${FILE_LIST}" | sed -r -e 's/\s/\r\n/g' )
  86. echo "${FILE_LIST}" > ${FILE_OUT}

SourceInsight 精确导入Linux kernel源码的方法的更多相关文章

  1. Linux内核源码分析方法_转

    Linux内核源码分析方法 转自:http://www.cnblogs.com/fanzhidongyzby/archive/2013/03/20/2970624.html 一.内核源码之我见 Lin ...

  2. Linux内核源码分析方法

    一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...

  3. 【转】Linux内核源码分析方法

    一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...

  4. linux kernel 源码安装

    有时我们在安装系统后,发现没有安装当前系统的内核源码在/usr/src/kernels目录下,其实我们是少安装了一个rpm包: 当你配置好yum源后: yum install kernel-devel ...

  5. CentOS 安装 linux kernel 源码

    原文链接:https://blog.csdn.net/qaz1qaz1qaz2/article/details/52825389 1.下载系统包yum install rpm-buildyum ins ...

  6. Linux Kernel源码浏览

    https://www.kernel.org/http://lxr.linux.no/

  7. centos的linux内核源码下载方法

    http://vault.centos.org/ http://blog.csdn.net/xiongzhizhu/article/details/51816243

  8. git获取内核源码的方法

    [转]http://www.360doc.com/content/17/0410/16/23107068_644444795.shtml 1. 前言 本文主要讲述ubuntu下通过git下载linux ...

  9. linux内核源码注解

    轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件 ...

随机推荐

  1. 【转载】VMware虚拟机修改硬盘容量大小

    很多人在安装虚拟机系统的时候,为了节省硬盘空间,把硬盘容量设置得较小,可是后来发现硬盘容量不够用了.在VMware中又不能直接修改虚拟机的硬盘容量大小,或者重建虚拟机系统,非常麻烦. 其实在VMwar ...

  2. 初学DOM树解析xml文件

    做了一次设计模式实验的题目: 某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通过该功能可以将原本存储在手机中的通信录.短信.照片.歌曲等资料一次性全部拷贝到移动存储介质(例如MMC卡或 ...

  3. Android_Layout (一)

    layout (布局)  --->Android 有五大布局,分别是: LinearLayout : 线性布局,子组件按照垂直或者水平方向来布局. RelativeLayout :相对布局,按照 ...

  4. 循环打印i值(面试题)

    /* * 下面的代码,为了实现每隔1秒说一句话, * 找出存在的问题,并改正,然后描述一下你的解决方案. * */ var arr = [ '第一句话', '第二句话', '第三句话', '第四句话' ...

  5. Android Studio下SQLite数据库的配置与使用(完)

    一,AS开发app用,所用的数据库有限制,必须使用较小的SQLite(MySql和Sql Server想想就不显示) 但是该数据库并不需要我们单独下载,安装的SDK中已经有了,在C:\AndroidS ...

  6. 开发经验之状态机思想,分别使用了swift,OC,C,PHP语言实现

    这里设计一个简单的练习,使用状态机思想实现,分别使用了swift,OC,C,PHP语言实现 题目:1到10000遍历,开始-打印奇数-遇到7的倍数开始打印偶数--遇到10的倍数打印奇数   //部分结 ...

  7. 国内较快的maven镜像

    原文网址:http://www.cnblogs.com/dingyingsi/p/3856456.html 国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以 ...

  8. web移动端input获得光标Fixed定位失效解决方案

    移动端业务开发,iOS 下经常会有 fixed 元素和输入框(input 元素)同时存在的情况. 但是 fixed元素在有软键盘唤起的情况下,会出现许多莫名其妙的问题. 这篇文章里就提供一个简单的有输 ...

  9. dataWithContentsOfURL报错问题

    NSError *error = nil; NSData* videoData = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.re ...

  10. 项目中如果管理前端文件CSS和JS

    如何管理CSS和JS文件,一直是前端一个热门的话题.下面将简单分享一下使用心得,欢迎大家吐槽.拍砖和提供更好的实现方式. 一.管理CSS文件,本博客将讨论less管理. iReset.less.iBu ...