请教一下,阅读 Linux Kernel 最快的解决方案(@Windows)是啥呢? - V2EX
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 10009 次点击
    这是一个创建于 2030 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看 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
    这么厉害(滑稽)
    dlyxy
        36
    dlyxy  
       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     Solana     2857 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 14:12 PVG 22:12 LAX 07:12 JFK 10:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86