SourceInsight 精确导入Linux kernel源码的方法

相信有很多人用 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 ‘[email protected]^.*<(acpi/.*)>@include/\[email protected]‘                 \
  34. -e ‘[email protected]^.*<(asm-generic/.*)>@include/\[email protected]‘\
  35. -e ‘[email protected]^.*<(config/.*)>@include/\[email protected]‘         \
  36. -e ‘[email protected]^.*<(crypto/.*)>@include/\[email protected]‘         \
  37. -e ‘[email protected]^.*<(drm/.*)>@include/\[email protected]‘                 \
  38. -e ‘[email protected]^.*<(generated/.*)>@include/\[email protected]‘         \
  39. -e ‘[email protected]^.*<(keys/.*)>@include/\[email protected]‘                 \
  40. -e ‘[email protected]^.*<(linux/.*)>@include/\[email protected]‘                 \
  41. -e ‘[email protected]^.*<(math-emu/.*)>@include/\[email protected]‘         \
  42. -e ‘[email protected]^.*<(media/.*)>@include/\[email protected]‘                 \
  43. -e ‘[email protected]^.*<(misc/.*)>@include/\[email protected]‘                 \
  44. -e ‘[email protected]^.*<(mtd/.*)>@include/\[email protected]‘                 \
  45. -e ‘[email protected]^.*<(net/.*)>@include/\[email protected]‘                 \
  46. -e ‘[email protected]^.*<(pcmcia/.*)>@include/\[email protected]‘         \
  47. -e ‘[email protected]^.*<(rdma/.*)>@include/\[email protected]‘                 \
  48. -e ‘[email protected]^.*<(rxrpc/.*)>@include/\[email protected]‘                 \
  49. -e ‘[email protected]^.*<(scsi/.*)>@include/\[email protected]‘                 \
  50. -e ‘[email protected]^.*<(sound/.*)>@include/\[email protected]‘                 \
  51. -e ‘[email protected]^.*<(target/.*)>@include/\[email protected]‘         \
  52. -e ‘[email protected]^.*<(trace/.*)>@include/\[email protected]‘                 \
  53. -e ‘[email protected]^.*<(uapi/.*)>@include/\[email protected]‘                 \
  54. -e ‘[email protected]^.*<(video/.*)>@include/\[email protected]‘                 \
  55. -e ‘[email protected]^.*<(xen/.*)>@include/\[email protected]‘                 \
  56. -e "[email protected]^.*<(asm/.*)>@arch/${ARCH}/include/\1 arch/${ARCH}/include/generated/\[email protected]"        \
  57. -e "[email protected]^.*<(mach/.*)>@arch/${ARCH}/mach-${MACH}/include/\[email protected]"        \
  58. -e ‘[email protected](^.*/)[^/]+\.c.*\"(.*)\"@\1\[email protected]‘         \
  59. -e ‘[email protected]/\*.*@@‘                                                         \
  60. -e ‘[email protected]^.*\#include.*[email protected]@‘                                  \
  61. -e ‘[email protected]^@ @‘ |                                                        \
  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}
时间: 2024-10-24 11:02:16

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

Linux内核源码分析方法

  一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写.编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内.如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码.通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一

轻松学习linux内核源码的方法

轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件组织:1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心. 本文基于稳定的2.2.5源代码,第二部分的实现平台为 RedHat Lin

Linux kernel源码阅读笔记2-2.6版本调度器sched.c功能

来自:http://www.ibm.com/developerworks/cn/linux/l-scheduler/ 2.6 版本调度器的源代码都很好地封装到了 /usr/src/linux/kernel/sched.c 文件中.我们在表 1 中对在这个文件中可以找到的一些有用的函数进行了总结. 表 1. Linux 2.6 调度器的功能 函数名 函数说明 schedule 调度器主函数.调度优先级最高的任务执行. load_balance 检查 CPU,查看是否存在不均衡的情况,如果不均衡,就

CentOS 安装 linux kernel 源码

原文链接:https://blog.csdn.net/qaz1qaz1qaz2/article/details/52825389 1.下载系统包yum install rpm-buildyum install redhat-rpm-config 2.下载并安装kernel包lynx http://vault.centos.org/6.0/os/SRPMS/Packages/kernel-2.6.32-71.el6.src.rpm rpm -ivh kernel-2.6.32-71.el6.src

centos的linux内核源码下载方法

刚开始进行写linux驱动时,写好Makefile后进行make,出现scripts/xxx/Makefile:没有那个文件或目录,编译停止!错误,这是linux系统没有安装内核源码导致的. 例如 下面就介绍下下载内核源码方法 1.查看自己centos版本 指令cat /etc/issue 2.查看自己linux内核版本 指令uname -r或者uname -a 3.进入官网下载 由上面两个步骤我们知道了自己centos版本为6.7,内核版本为2.6.32-573.el6.i686 源代码的官网

Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938395.html 前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化.在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就是创建并启动内核线

Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938396.html 在基本分析完内核启动流程的之后,还有一个比较重要的初始化函数没有分析,那就是do_basic_setup.在内核init线程中调用了do_basic_setup,这个函数也做了很多内核和驱动的初始化工作,详解

Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】

原文地址:Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938390.html 在构架相关的汇编代码运行完之后,程序跳入了构架无关的内核C语言代码:init/main.c中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段, 下面我就顺这代码逐个函数的解释,但是这里并不会过于深入

Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938393.html 在分析start_kernel函数的时候,其中有构架相关的初始化函数setup_arch. 此函数根据构架而异,对于ARM构架的详细分析如下: void __init setup_arch(char **cmdlin