V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
nevin47
V2EX  ›  Linux

请教一下,阅读 Linux Kernel 最快的解决方案(@Windows)是啥呢?

  •  1
     
  •   nevin47 · 2020-03-26 11:46:36 +08:00 · 9272 次点击
    这是一个创建于 1685 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看 Kernel 相关的源码,但是因为 Kernel 中各种神级 arch,花式宏封装,试了好几个工具( VSC,CLion,SI,Vim ...)都觉得不得劲

    尤其是遇到一个xxx_arch_xxx接口的时候,全局搜索( ag 、ack 、各种自带全局搜索全试过了)慢的让人崩溃( nvme 盘、Ramdisk 全试过了)

    想问问万能的 V 友们,有没有比较优雅的阅读 Kernel 代码的方案可以推荐的……

    49 条回复    2022-07-14 10:13:32 +08:00
    abutter
        1
    abutter  
       2020-03-26 12:04:49 +08:00
    能问一下你读 Linux 内核代码的目的是啥吗?
    reus
        2
    reus  
       2020-03-26 12:08:47 +08:00
    ctags..
    wsy2220
        3
    wsy2220  
       2020-03-26 12:15:26 +08:00
    abcdabcd987
        4
    abcdabcd987  
       2020-03-26 12:15:51 +08:00
    scriptB0y
        5
    scriptB0y  
       2020-03-26 12:15:55 +08:00   ❤️ 1
    scriptB0y
        6
    scriptB0y  
       2020-03-26 12:16:17 +08:00   ❤️ 4
    我勒个去,为啥有三个人在几秒内一起回这个。。。
    nevin47
        7
    nevin47  
    OP
       2020-03-26 12:26:34 +08:00
    @wsy2220 #3
    @abcdabcd987 #4
    @scriptB0y #5

    多谢三位……这个站点老早就在看了,但是 u1s1,这玩意儿还不如我全局搜来的快 尤其是高频追踪一个入口的 reference 路径的时候
    nevin47
        8
    nevin47  
    OP
       2020-03-26 12:31:06 +08:00
    @reus #2 tags 只是能跳转,但是 arch 场景会乱跳,更恼火

    全局搜索主要是为了 reference
    nevin47
        9
    nevin47  
    OP
       2020-03-26 12:32:00 +08:00
    @abutter #1 工作目的嘛
    byaiu
        10
    byaiu  
       2020-03-26 12:36:57 +08:00
    eclipse=>Properities=>C/C++ General => Paths and Symbols => Source Location => /linux filters
    把不需要的 arch 目录都放进去就可以
    zhuangzhuang1988
        11
    zhuangzhuang1988  
       2020-03-26 12:43:34 +08:00
    https://sysprogs.com/VisualKernel/ 这个??
    不过我没用过,
    读内核 肯定是先看驱动 怎么玩
    动态调试学习
    https://sysprogs.com/tutorials/wp-content/uploads/2018/02/13-floppy.png
    xsen
        12
    xsen  
       2020-03-26 12:49:35 +08:00
    qtcreator,很久前看内核源码是用这个,现在 c/c++源码基本也是这个
    另外,添加源码的时候,不要把所有**_arch 都加到工程,只加关注的几个
    abutter
        13
    abutter  
       2020-03-26 12:49:50 +08:00
    如果是驱动,就关心接口及其规范;如果是某个子模块,那就看设计文档。

    如果是单纯看某个 arch 的,你可以把内核的调试信息 dump 初来,把文件路径提取出来,然后 sed 工具处理一下,导入到某个特定的 IDE 里面。
    inwar
        14
    inwar  
       2020-03-26 12:58:56 +08:00 via Android
    难道不是 sourceinsight?
    Chenamy2017
        15
    Chenamy2017  
       2020-03-26 13:03:45 +08:00
    我用 sourcesight,然后会把 arch 下所有的体系架构的代码都删掉,只保留一个,比如 ARM,有时候还会把驱动目录下全删掉。
    我就是只想看内核的核心代码。
    season4675
        16
    season4675  
       2020-03-26 13:21:51 +08:00
    arch 看一个就行了,driver 也看几个就行了,其他的都删了。
    woai110120130
        17
    woai110120130  
       2020-03-26 13:33:36 +08:00
    clion
    Nitroethane
        18
    Nitroethane  
       2020-03-26 13:36:52 +08:00 via iPhone   ❤️ 1
    neovim + ctags,然后用 vim 插件 leaderF,堪称搜索神器
    nightwitch
        19
    nightwitch  
       2020-03-26 13:47:29 +08:00   ❤️ 1
    ctags + gtags
    控制一下要索引的目录,还算勉强能看。
    nevin47
        20
    nevin47  
    OP
       2020-03-26 14:01:32 +08:00
    @season4675 #16
    @byaiu #10
    @Chenamy2017 #15

    现在就是类似这样玩的,但是很麻烦的是,我需要关注 4 个 arch 下的差异……所以遇到重载的时候还是很头疼
    james122333
        21
    james122333  
       2020-03-26 14:31:42 +08:00 via Android
    自己写个 parser
    byaiu
        22
    byaiu  
       2020-03-26 15:07:43 +08:00
    @nevin47 #20
    Eclipse 的快捷键多用用,ctrl+alt+h
    nevin47
        23
    nevin47  
    OP
       2020-03-26 15:18:19 +08:00
    @byaiu #22 和 IDE 用法无关的,痛点在于全局搜索太慢了……
    byaiu
        24
    byaiu  
       2020-03-26 15:19:03 +08:00
    那看来只能上 ssd 了哈
    nevin47
        25
    nevin47  
    OP
       2020-03-26 15:25:05 +08:00
    @byaiu #24 已经是 M.2 了……我连 RamDisk 都试过了
    fuis
        26
    fuis  
       2020-03-26 15:26:08 +08:00
    Rheinmetal
        27
    Rheinmetal  
       2020-03-26 15:31:01 +08:00
    4 个 IDE 窗口( or 4 个屏)分别删得只剩一个 arch 如何?
    shujun
        28
    shujun  
       2020-03-26 16:51:43 +08:00 via iPhone
    和 ramdisk 有啥关系

    先熟悉目录结构吧
    然后 source insight 就够了 创建工程的时候注意导入源码不要全部塞进去 arch 的选择一个 driver 的选择一部分自己关注的即可
    nmap
        29
    nmap  
       2020-03-26 17:10:27 +08:00
    当然是神器 source insight 啊!
    nevin47
        30
    nevin47  
    OP
       2020-03-26 17:14:57 +08:00
    @shujun #28
    @nmap #29

    现在感觉最快的就是 SI+RamDisk 了,但是 SI 的弊端就是必须要鼠标配合,同时在几个 Arch 中轮番换的时候,如果搜索限定为符号还好,但是有些接口必须要搜到 asm 或者.s 里面,这个时候搜索速度还是很慢了
    james122333
        31
    james122333  
       2020-03-26 17:17:44 +08:00 via Android
    james122333
        32
    james122333  
       2020-03-26 17:18:30 +08:00 via Android
    甚换系统 (滑稽
    james122333
        33
    james122333  
       2020-03-26 17:18:43 +08:00 via Android
    甚至
    nevin47
        34
    nevin47  
    OP
       2020-03-26 17:23:03 +08:00
    @james122333 #31 实际上如果在 Linux 上面,我可以开个 10G 的 Hugepage,然后自己做个驱动就有一个巨型 ramdisk 了,那这个问题基本就迎刃而解了。。。然而 Windows 上面并不支持这么做
    james122333
        35
    james122333  
       2020-03-26 17:29:05 +08:00 via Android
    @nevin47
    这么厉害(滑稽)
    zoumouse
        36
    zoumouse  
       2020-03-26 20:17:33 +08:00
    SourceInsight
    mingl0280
        37
    mingl0280  
       2020-03-26 22:41:28 +08:00
    @nevin47 IMDisk Virtual Disk 可以挂很大的 ramdisk 。
    另外为什么不试试 vs 的打开文件夹呢 lol
    Mirana
        38
    Mirana  
       2020-03-27 00:07:13 +08:00
    linux 内核细节太多 感觉不如看更简单点的内核 自己照着写一个
    oddtux
        39
    oddtux  
       2020-03-27 00:41:40 +08:00
    这都 0202 年了, 还有那么多人用祖传的 ctags.
    SourceInsight 确实是 windows 下可用的*不编译*的最好方案了。

    但绝对不是目前最舒服的解决方案了。
    我现在是这么看内核代码的( Linux 平台),
    1. 编个 bzImage, 然后执行 scripts/gen_compile_commands.py 生成 compile_commands.json 这个文件
    2. 安装 clang
    3. vscode + clangd 插件

    (备注: 不喜欢 clang 或者安装困难可以用 ccls, 关键是要有 compile_commands.json
    哪里有问题可以回复我,有时间会帮忙看 )
    james122333
        40
    james122333  
       2020-03-27 08:35:14 +08:00 via Android
    @oddtux
    ctags 还是可以用 毕竟支持语言多
    缺点就是能分析的少 看来自写 parser 好
    nevin47
        41
    nevin47  
    OP
       2020-03-27 09:19:15 +08:00
    @mingl0280 #37 实测远不如 SI


    @oddtux #39 我搞整 Clion 的时候想过,不过 windows 上面我猜测因为 aux/文件重名等问题,生成 compile_commands.json 有点问题,我周末再试试这个办法

    @james122333 #40 ctags 应对相对不那么复杂的工程还好,但是 Linux Kernel 这种套了各种“魔法”的东东,ctags 还是有点无力了
    james122333
        42
    james122333  
       2020-03-27 09:22:05 +08:00 via Android
    还有 lsp
    不过我想自己弄一个
    purplewall
        43
    purplewall  
       2020-03-27 10:34:30 +08:00
    (删代码)
    arch 里面留下你用的那个架构,driver 删除,documentation 删除,script 删除,fs 留下目录文件和随便哪个 fs
    嫌速度慢可以装 grep 搜,
    内核里的间接跳转用函数指针了,似乎不能直接搜。
    oddtux
        44
    oddtux  
       2020-03-27 12:25:54 +08:00
    @nevin47
    文件名的关系, windows 下很麻烦的, 还是 linux 下看吧. 双系统, 虚拟机, WSL2 都行的.
    sublime, vscode, atom 都有 clangd 的扩展, 不一定用 clion
    rockcat
        45
    rockcat  
       2020-03-27 14:17:30 +08:00
    最好是带着特定的目标去看,否则通篇看下来估计要晕菜的。
    hyperion1
        46
    hyperion1  
       2020-04-18 18:39:04 +08:00
    vim+global
    pmx1990
        47
    pmx1990  
       2022-07-01 11:46:04 +08:00
    @woai110120130 打开项目一片红 怎么解决的~
    nevin47
        48
    nevin47  
    OP
       2022-07-04 09:29:26 +08:00
    @pmx1990 #47 你要自己编译一份 compile_command_json(好像这个名字?)
    pmx1990
        49
    pmx1990  
       2022-07-14 10:13:32 +08:00
    @nevin47 我 Mac 下直接 clion 导入,然后 makefile 报错,注释掉几个过不去的,基本上能看了,反正不能编译,不飘红就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5555 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:47 · PVG 14:47 · LAX 22:47 · JFK 01:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.