相信有很多人用 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. PHP 面向对象编程(2)

    一些内建方法: class Person { public $isAlive = true; function __construct($name) { //这里我们创建了一个name的属性 $thi ...

  2. QuartZ.net 常用配置说明

    配置文件说明 app.config中的quartz部分 <quartz> <!-- configure Thread Pool--> <addkey="quar ...

  3. linux下各种软件的安装过程

    //////知识储备//////////////////////////////////////////////////////////////////// /var 下存放着服务和经常改变的文件 / ...

  4. 新手入门之GDB调试

    写这篇文章算是对最近两天工作的一个经验总结吧. 要让可执行文件比较方便地在DGB上调试,在用gcc编译的时候要使用-g选项. 如何使用GDB启动被调试程序? "gdb path_to_deb ...

  5. 项目中使用oracle序列

    在数据库设计的时候我们可以将表的ID定义为String 然后我们可以使用序列来得到唯一的ID 手写一个mapper: <?xml version="1.0" encoding ...

  6. The data is said to include information from networks

    The data is said to include information from networks as well as from individual computers and smart ...

  7. supervisor安装配置与使用

    supervisor:C/S架构的进程控制系统,可使用户在类UNIX系统中监控.管理进程.常用于管理与某个用户或项目相关的进程. 组成部分supervisord:服务守护进程supervisorctl ...

  8. iOS-音频和视频

    一.视频 视频播放器需要添加MediaPlayer.framework. 视频播放主要提供了两个类,一个MPMoviePlayerController, 另一个是MPMoviePlayerViewCo ...

  9. 收集的maven 仓库地址(maven repository)

    maven 仓库地址: 共有的仓库http://repo1.maven.org/maven2/http://repository.jboss.com/maven2/http://repository. ...

  10. 这些 Git 技能够你用一年了

    这些 Git 技能够你用一年了 原文出处: Pyper 用git有一年了,下面是我这一年来的git使用总结,覆盖了日常使用中绝大多数的场景.嗯,至少是够用一年了,整理出来分享给大家,不明白的地方可以回 ...