用VSCODE看linux内核代码

前言

使用VSCODE在看内核代码时一定会出现如下几种情况:

  1. 跳转等半天
  2. 跳转出现错误
  3. 跳转时出现N多定义
  4. 目录结构繁杂,找文件困难等等

通过settings.json屏蔽的方式

该方式比较方便,但是需要自行修改屏蔽规则

    "files.exclude": {
        /* 隐藏某种固定类型文件 */
        "**/.history": true,
        "**/.git": true,
        // "**/.svn": true,
        "**/.hg": true,
        "**/CVS": true,
        "**/.DS_Store": true,
        "**/*.ihex": true,
        //"**/*.o":true,
        "**/*.a": true,
        "**/*.su": true,
        "**/*.cmd": true,
        "**/*.order": true,
        "**/*.builtin": true,
        "**/*.gitignore": true,
        "**/*.tmp*": true,
        "**/*.mod.o": true,
        "**/*.mod.c": true,
        "**/built-in.o": true,
        "**/Module.symvers": true,
        //     "kernel/kernel_sdk/arch": false, /* 这个文件夹包含了一个Kconfig文件,它用于设置这个目录里的源代码编译所需的一系列设定*/
        //     "kernel/kernel_sdk/block": false, /* 此文件夹包含块设备驱动程序的代码。块设备是以数据块方式接收和发送的数据的设备。数据块都是一块一块的数据而不是持续的数据流。 */
        //     "kernel/kernel_sdk/certs": true, /* 与证书相关,不需要 */
        //     "kernel/kernel_sdk/crypto": false, /* 这个文件夹包含许多加密算法的源代码。如crc32、md5、sha1等 */
        //     "kernel/kernel_sdk/Documentation": true, /* 此文件夹包含了内核信息和其他许多文件信息的文本文档 */
        //     "kernel/kernel_sdk/drivers": false, /* 该目录包含了驱动代码,必须要的 */
        //     "kernel/kernel_sdk/firmware": true, /* 包含了让计算机读取和理解从设备发来的信号的代码 */
        //     "kernel/kernel_sdk/fs": false, /* 文件系统 */
        //     "kernel/kernel_sdk/include": false, /* 包含了内核所需的各种头文件 */
        //     "kernel/kernel_sdk/init": false, /* 包含了内核启动的处理代码(INITiation)。main.c是内核的核心文件,这是用来衔接所有的其他文件的源代码主文件 */
        //     "kernel/kernel_sdk/ipc": false, /* IPC代表进程间通讯。此文件夹中的代码是作为内核与进程之间的通信层。*/
        //     "kernel/kernel_sdk/kernel": false, /* 文件夹中的代码控制内核本身 */
        //     "kernel/kernel_sdk/lib": false, /*  这个文件夹包含了内核需要引用的一系列内核库文件代码。 */
        //     "kernel/kernel_sdk/mm": false, /*  包含了内存管理代码。 */
        //     "kernel/kernel_sdk/net": false, /* 包含了网络协议代码。这包括IPv6、AppleTalk、以太网、WiFi、蓝牙等的代码,此外处理网桥和DNS解析的代码也在net目录。 */
        //     "kernel/kernel_sdk/samples": true, /* 此文件夹包含了程序示例和正在编写中的模块代码 */
        //     "kernel/kernel_sdk/scripts": true, /*  这个文件夹有内核编译所需的脚本。最好不要改变这个文件夹内的任何东西 */
        //     "kernel/kernel_sdk/security": false, /* 这个文件夹是有关内核安全的代码 */
        //     "kernel/kernel_sdk/sound": true, /* 目前没用上, 这个文件夹中包含了声卡驱动。 */
        //     "kernel/kernel_sdk/tools": true, /* 这个文件夹中包含了和内核交互的工具 */
        //     "kernel/kernel_sdk/usr": false, /* 这个文件夹中的代码在内核编译完成后创建这些文件 */
        //     "kernel/kernel_sdk/virt": true, /* 此文件夹包含了虚拟化代码,它允许用户一次运行多个操作系统,不需要 */
        //     /* 屏蔽排除不用的配置文件 */
        //     "**/arch/arm/configs/[a-g]*": true,
        //     "**/arch/arm/configs/[i-z]*": true,
        //     "**/arch/arm/configs/imo*": true,
        //     "**/arch/arm/configs/in*": true,
        //     "**/arch/arm/configs/io*": true,
        //     "**/arch/arm/configs/ix*": true,
        //     /* 屏蔽掉不用的DTB文件,只保留h开头的 */
        //     "**/arch/arm/boot/dts/[a-g]*": true,
        //     "**/arch/arm/boot/dts/[i-z]*": true,
        //     "**/arch/arm/boot/dts/*.tmp": true,
        //     /* 屏蔽不用的架构相关的文件(只保留arm相关) */
        //     "**/arch/alpha": true,
        //     "**/arch/arc": true,
        //     "**/arch/arm64": false,
        //     "**/arch/avr32": true,
        //     "**/arch/[b-z]*": true,
        //     "**/arch/arm/plat*": true,
        //     "**/arch/arm/mach-[a-g]*": true,
        //     "**/arch/arm/mach-[i-z]*": true,
        //     "**/arch/arm/mach-hi[a-j]*": true,
        //     "**/arch/arm/mach-hi[l-z]*": true,
        //     /* 隐藏kernel下无关紧要的文件夹 */
        //     "**/kernel/debug": true,
        //     "**/kernel/livepatch": true,
        //     "**/kernel/gcov": true,
        //     "**/kernel/trace": false,
        //     /* 驱动 a */
        //     "**/drivers/accessibility": true, /* 这些驱动提供支持一些辅助设备。在Linux 3.9.4中,这个文件夹中只有一个驱动就是盲文设备驱动 */
        //     "**/drivers/acpi": true, /* 高级配置和电源接口(ACPI : Advanced Configuration and Power Interface)驱动用来管理电源使用。 */
        //     "**/drivers/amba": false, /* 高级微控制器总线架构(AMBA : Advanced Microcontroller Bus Architecture)是与片上系统(SoC)的管理和互连的协议 */
        //     "**/drivers/android": true,
        //     "**/drivers/ata": true, /* 串行ATA(SATA)是一种连接主机总线适配器到像硬盘那样的存储器的计算机总线接口。
        //                                并行ATA(PATA)用于连接存储设备,如硬盘驱动器,软盘驱动器,光盘驱动器的标准 */
        //     "**/drivers/atm": true, /* 异步通信模式(ATM : Asynchronous Transfer Mode)是一种通信标准。
        //                                这里有各种接到PCI桥的驱动(他们连接到PCI总线)和以太网控制器(控制以太网通信的集成电路芯片) */
        //     "**/drivers/auxdisplay": true, /* 这个文件夹提供了三个驱动。LCD 帧缓存(framebuffer)驱动、LCD控制器驱动和一个LCD驱动。这些驱动用于管理液晶显示器 */
        //     /* 驱动 b */
        //     "**/drivers/base": false, /* 这是个重要的目录包含了固件、系统总线、虚拟化能力等基本的驱动 */
        //     "**/drivers/bcma": true, /* 这些驱动用于使用基于AMBA协议的总线。AMBA是由博通公司开发 */
        //     "**/drivers/block": false, /* 这些驱动提供对块设备的支持,像软驱、SCSI磁带、TCP网络块设备等等 */
        //     "**/drivers/bluetooth": true, /* 蓝牙驱动 */
        //     "**/drivers/bus": true, /* 这个目录包含了三个驱动。一个转换ocp接口协议到scp协议。一个是设备间的互联驱动,第三个是用于处理互联中的错误处理 */
        //     /* block 专门排除 */
        //     "**/drivers/block/aoe": true,
        //     "**/drivers/block/drbd": true,
        //     "**/drivers/block/mtip32xx": true,
        //     "**/drivers/block/paride": true,
        //     "**/drivers/block/rsxx": true,
        //     "**/drivers/block/xen-blkback": true,
        //     "**/drivers/block/zram": true,
        //     /* 隐藏没用上的驱动 c */
        //     "**/drivers/cdrom": true, /* 这个目录包含两个驱动。一个是cd-rom,包括DVD和CD的读写。第二个是gd-rom(只读GB光盘),
        //                                  GD光盘是1.2GB容量的光盘,这像一个更大的CD或者更小的DVD。GD通常用于世嘉游戏机中*/
        //     "**/drivers/char": false, /* 字符设备驱动就在这里 */
        //     "**/drivers/clk": false, /* 这些驱动用于系统时钟 */
        //     "**/drivers/clocksource": false, /* 这些驱动用于作为定时器的时钟 */
        //     "**/drivers/connector": true, /* 这些驱动使内核知道当进程fork并使用proc连接器更改UID(用户ID)、GID(组ID)和SID(会话ID)。
        //                                      内核需要知道什么时候进程fork(CPU中运行多个任务)并执行。否则,内核可能会低效管理资源 */
        //     "**/drivers/cpufreq": true, /* 这些驱动改变CPU的电源能耗 */
        //     "**/drivers/cpuidle": true, /* 这些驱动用来管理空闲的CPU。一些系统使用多个CPU,其中一个驱动可以让这些CPU负载相当 */
        //     "**/drivers/crypto": false, /* 这些驱动提供加密功能 */
        //     /* char 专门排除 */
        //     "**/drivers/char/agp": true,
        //     "**/drivers/char/ipmi": true,
        //     "**/drivers/char/mwave": true,
        //     "**/drivers/char/pcmcia": true,
        //     "**/drivers/char/tpm": true,
        //     "**/drivers/char/xilinx_hwicap": true,
        //     "**/drivers/char/xillybus": true,
        //     /* clk 专门排除 */
        //     "**/drivers/clk/[a-b]*": true,
        //     "**/drivers/clk/h8300": true,
        //     "**/drivers/clk/[d-g]*": true,
        //     "**/drivers/clk/[i-z]*": true,
        //     /* crypto(加密) 专门排除 */
        //     "**/drivers/crypto/hif*": true,
        //     "**/drivers/crypto/[a-g]*": true,
        //     "**/drivers/crypto/[i-z]*": true,
        //     /* 驱动 d */
        //     "**/drivers/dax": true,
        //     "**/drivers/dca": true, /* 直接缓存访问(DCA : Direct Cache Access)驱动允许内核访问CPU缓存。CPU缓存就像CPU内置的RAM。
        //                                CPU缓存的速度比RAM更快。然而,CPU缓存的容量比RAM小得多。CPU在这个缓存系统上存储了最重要的和执行的代码。 */
        //     "**/drivers/devfreq": true, /* 这个驱动程序提供了一个通用的动态电压和频率调整(DVFS : Generic Dynamic Voltage and Frequency Scaling)框架,
        //                                    可以根据需要改变CPU频率来节约能源。这就是所谓的CPU节能。 */
        //     "**/drivers/dio": true, /* 数字输入/输出(DIO :Digital Input/Output)总线驱动允许内核可以使用DIO总线 */
        //     "**/drivers/dma": false, /* 直接内存访问(DMA)驱动允许设备无需CPU直接访问内存。这减少了CPU的负载。 */
        //     "**/drivers/dma-buf": true,
        //     /* dma 专门排除 */
        //     "**/drivers/dma/bestcomm": true,
        //     "**/drivers/dma/dw": true,
        //     "**/drivers/dma/hsu": true,
        //     "**/drivers/dma/ioat": true,
        //     "**/drivers/dma/ipu": true,
        //     "**/drivers/dma/ppc4xx": true,
        //     "**/drivers/dma/qcom": true,
        //     "**/drivers/dma/sh": true,
        //     "**/drivers/dma/xilinx": true,
        //     /* 驱动 e */
        //     "**/drivers/edac": true, /* 错误检测和校正( Error Detection And Correction)驱动帮助减少和纠正错误 */
        //     "**/drivers/eisa": true, /* 扩展工业标准结构总线(Extended Industry Standard Architecture)驱动提供内核对EISA总线的支持 */
        //     "**/drivers/extcon": true, /* 外部连接器(EXTernal CONnectors)驱动用于检测设备插入时的变化。例如,extcon会检测用户是否插入了USB驱动器 */
        //     /* 驱动 f */
        //     "**/drivers/firewire": true, /* 这些驱动用于控制苹果制造的类似于USB的火线设备 */
        //     "**/drivers/firmware": true, /*  这些驱动用于和像BIOS(计算机的基本输入输出系统固件)这样的设备的固件通信 */
        //     "**/drivers/fmc": true, /* 一种接口 */
        //     "**/drivers/fpga": true, /* 一种接口 */
        //     /* 驱动 g */
        //     "**/drivers/gpio": false, /* 通用输入/输出(GPIO :General Purpose Input/Output)是可由用户控制行为的芯片的管脚 */
        //     "**/drivers/gpu": true, /* 这些驱动控制VGA、GPU和直接渲染管理 */
        //     /* 驱动 h */
        //     "**/drivers/hid": false, /* 这驱动用于对USB人机界面设备的支持 */
        //     "**/drivers/hsi": true, /* 这个驱动用于内核访问像Nokia N900这样的蜂窝式调制解调器 */
        //     "**/drivers/hv": true, /* 这个驱动用于提供Linux中的键值对(KVP :Key Value Pair)功能 */
        //     "**/drivers/hwmon": false, /* 硬件监控驱动用于内核读取硬件传感器上的信息。比如,CPU上有个温度传感器。那么内核就可以追踪温度的变化并相应地调节风扇的速度。 */
        //     "**/drivers/hwspinlock": true, /* 硬件转锁驱动允许系统同时使用两个或者更多的处理器,或使用一个处理器上的两个或更多的核心。 */
        //     "**/drivers/hwtracing": true,
        //     /* 驱动 i */
        //     "**/drivers/i2c": false,
        //     "**/drivers/ide": true, /* 这些驱动用来处理像CDROM和硬盘这些PATA/IDE设备 */
        //     "**/drivers/idle": true, /*  这个驱动用来管理Intel处理器的空闲功能 */
        //     "**/drivers/iio": true, /* 工业I/O核心驱动程序用来处理数模转换器或模数转换器 */
        //     "**/drivers/infiniband": true, /* Infiniband是在企业数据中心和一些超级计算机中使用的一种高性能的端口。这个目录中的驱动用来支持Infiniband硬件 */
        //     "**/drivers/input": false, /* 这里包含了很多驱动,这些驱动都用于输入处理,包括游戏杆、鼠标、键盘、遥控器、触控、耳麦按钮和许多其他的驱动 */
        //     "**/drivers/iommu": true, /* 输入/输出内存管理单元(IOMMU :Input/Output Memory Management Unit)驱动用来管理内存管理单元中的IOMMU。
        //                                  IOMMU连接DMA IO总线到内存上。IOMMU是设备在没有CPU帮助下直接访问内存的桥梁。这有助于减少处理器的负载 */
        //     "**/drivers/ipack": true, /* Ipack代表的是IndustryPack。 这个驱动是一个虚拟总线,允许在载体和夹板之间操作 */
        //     "**/drivers/irqchip": false, /* 这些驱动程序允许硬件的中断请求(IRQ)发送到处理器 */
        //     "**/drivers/isdn": true, /* 这些驱动用于支持综合业务数字网(ISDN),这是用于同步数字传输语音、视频、数据和其他网络服务使用传统电话网络的电路的通信标准 */
        //     /* i2c 专门排除 */
        //     "**/drivers/i2c/busses/i2c-[a-c]*": true,
        //     "**/drivers/i2c/busses/i2c-[e-g]*": true,
        //     "**/drivers/i2c/busses/i2c-[i-z]*": true,
        //     /* input 专门排除 */
        //     "**/drivers/input/gameport": true,
        //     "**/drivers/input/joystick": true,
        //     "**/drivers/input/keyboard": true,
        //     "**/drivers/input/misc": true,
        //     "**/drivers/input/mouse": true,
        //     "**/drivers/input/rmi4": true,
        //     "**/drivers/input/tablet": true,
        //     "**/drivers/input/touchscreen": true,
        //     /* 驱动 l */
        //     "**/drivers/leds": true, /*  用于LED的驱动 */
        //     "**/drivers/lguest": true, /* 一种虚拟方案,lguest用于管理客户机系统的中断。*/
        //     "**/drivers/lightnvm": true,
        //     /* 驱动 m */
        //     "**/drivers/macintosh": true, /* 苹果设备的驱动在这个文件夹里 */
        //     "**/drivers/mailbox": true, /* 这个文件夹(pl320-pci)中的驱动用于管理邮箱系统的连接 */
        //     "**/drivers/mcb": true,
        //     "**/drivers/md": true, /* 多设备驱动用于支持磁盘阵列,一种多块硬盘间共享或复制数据的系统 */
        //     "**/drivers/memstick": true, /* 这个驱动用于支持Sony记忆棒 */
        //     "**/drivers/message": true, /* 这些驱动用于运行LSI Fusion MPT(一种消息传递技术)固件的LSI PCI芯片/适配器 */
        //     "**/drivers/misc": true, /* 这个目录包含了不适合在其他目录的各种驱动。就像光线传感器驱动 */
        //     "**/drivers/media": true, /* 媒体驱动提供了对收音机、调谐器、视频捕捉卡、DVB标准的数字电视等等的支持。驱动还提供了对不同通过USB或火线端口插入的多媒体设备的支持 */
        //     "**/drivers/memory": true, /* 支持内存的驱动 */
        //     "**/drivers/mfd": false, /* 多用途设备(MFD)驱动提供了对可以提供诸如电子邮件、传真、复印机、扫描仪、打印机功能的多用途设备的支持 */
        //     "**/drivers/mmc": false, /* MMC卡驱动用于处理用于MMC标准的闪存卡 */
        //     "**/drivers/mtd": false, /* 内存技术设备(MTD :Memory technology devices) */
        //     /* 驱动 n */
        //     "**/drivers/net": false, /* 网络驱动提供像AppleTalk、TCP和其他的网络协议。这些驱动也提供对调制解调器、USB 2.0的网络设备、和射频设备的支持 */
        //     "**/drivers/nfc": true, /* 这个驱动是德州仪器的共享传输层之间的接口和NCI核心 */
        //     "**/drivers/ntb": true, /* 不透明的桥接驱动提供了在PCIe系统的不透明桥接。PCIe是一种高速扩展总线标准 */
        //     "**/drivers/nubus": true, /* NuBus是一种32位并行计算总线。用于支持苹果设备 */
        //     "**/drivers/nvdimm": true,
        //     "**/drivers/nvme": true,
        //     "**/drivers/nvmem": true,
        //     /* net 专门排除 */
        //     "**/drivers/net/arcnet": true,
        //     "**/drivers/net/bonding": true,
        //     "**/drivers/net/cris": true,
        //     // "**/drivers/net/ethernet/[0-9]*": true,
        //     // "**/drivers/net/ethernet/[a-g]*": true,
        //     // "**/drivers/net/ethernet/[i-z]*": true,
        //     "**/drivers/net/fddi": true,
        //     "**/drivers/net/fjes": true,
        //     "**/drivers/net/hamradio": true,
        //     "**/drivers/net/hippi": true,
        //     "**/drivers/net/hyperv": true,
        //     "**/drivers/net/ieee802154": true,
        //     "**/drivers/net/ipvlan": true,
        //     "**/drivers/net/plip": true,
        //     "**/drivers/net/team": true,
        //     "**/drivers/net/vmxnet3": true,
        //     "**/drivers/net/wan": true,
        //     "**/drivers/net/wireless": true,
        //     "**/drivers/net/xen-netback": true,
        //     /* 驱动 o */
        //     "**/drivers/of": false, /* 此驱动程序提供设备树中创建、访问和解释程序的OF助手。设备树是一种数据结构,用于描述硬件 */
        //     "**/drivers/oprofile": true, /* 这个驱动用于从驱动到用户空间进程(运行在用户态下的应用)评测整个系统。这帮助开发人员找到性能问题 */
        //     /* 驱动 p */
        //     "**/drivers/parisc": true, /* 这些驱动用于HP生产的PA-RISC架构设备。PA-RISC是一种特殊指令集的处理器 */
        //     "**/drivers/parport": true, /* 并口驱动提供了Linux下的并口支持 */
        //     "**/drivers/pci": true, /* 这些驱动提供了PCI总线服务 */
        //     "**/drivers/pinctrl": true, /* 这些驱动用来处理引脚控制设备。引脚控制器可以禁用或启用I/O设备 */
        //     "**/drivers/pcmcia": true, /* 这些是笔记本的pc卡驱动 */
        //     "**/drivers/platform": true, /* 这个文件夹包含了不同的计算机平台的驱动像Acer、Dell、Toshiba、IBM、Intel、Chrombooks等等 */
        //     "**/drivers/pnp": true, /* 即插即用驱动允许用户在插入一个像USB的设备后可以立即使用而不必手动配置设备 */
        //     "**/drivers/power": false, /* 电源驱动使内核可以测量电池电量,检测充电器和进行电源管理 */
        //     "**/drivers/powercap": true,
        //     "**/drivers/pps": true, /* Pulse-Per-Second驱动用来控制电流脉冲速率。这用于计时 */
        //     "**/drivers/ptp": true, /* 图片传输协议(PTP)驱动支持一种从数码相机中传输图片的协议 */
        //     "**/drivers/ps3": true, /* 这是Sony的游戏控制台驱动- PlayStation3 */
        //     "**/drivers/pwm": false, /* 脉宽调制(PWM)驱动用于控制设备的电流脉冲 */
        //     /* 驱动 r */
        //     "**/drivers/rapidio": true, /* RapidIO驱动用于管理RapidIO架构,它是一种高性能分组交换,用于电路板上交互芯片的交互技术,也用于互相使用底板的电路板 */
        //     "**/drivers/ras": true,
        //     "**/drivers/regulator": true, /* 一种电源管理芯片的驱动 */
        //     "**/drivers/remoteproc": true, /* 这些驱动用来管理远程处理器 */
        //     "**/drivers/rpmsg": true, /* 这个驱动用来控制支持大量驱动的远程处理器通讯总线(rpmsg)。这些总线提供消息传递设施,促进客户端驱动程序编写自己的连接协议消息 */
        //     "**/drivers/reset": false,
        //     "**/drivers/rtc": false,
        //     /* 驱动 s */
        //     "**/drivers/s390": true, /* 用于31/32位的大型机架构的驱动 */
        //     "**/drivers/sbus": true, /* 用于管理基于SPARC的总线驱动 */
        //     "**/drivers/scsi": false, /* 允许内核使用SCSI标准外围设备 */
        //     "**/drivers/sfi": true, /* 简单固件接口(SFI)驱动允许固件发送信息表给操作系统。这些表的数据称为SFI表 */
        //     "**/drivers/sh": true, /* 该驱动用于支持SuperHway总线 */
        //     "**/drivers/sn": true, /* 该驱动用于支持IOC3串口 */
        //     "**/drivers/spi": false,
        //     "**/drivers/soc": true,
        //     "**/drivers/spmi": true,
        //     "**/drivers/ssb": true, /* ssb(Sonics Silicon Backplane)驱动提供对在不同博通芯片和嵌入式设备上使用的迷你总线的支持 */
        //     "**/drivers/staging": true, /* staging tree建立之目的是用来放置一些未充分测试或者因为一些其他原因未能进入内核的新增驱动程序和新增文件系统 */
        //     /* scsi 专门排除 */
        //     "**/drivers/scsi/aacraid": true,
        //     "**/drivers/scsi/aic*": true,
        //     "**/drivers/scsi/arcmsr": true,
        //     "**/drivers/scsi/arm": true,
        //     "**/drivers/scsi/be2iscsi": true,
        //     "**/drivers/scsi/bfa": true,
        //     "**/drivers/scsi/bnx*": true,
        //     "**/drivers/scsi/csiostor": true,
        //     "**/drivers/scsi/cx*": true,
        //     "**/drivers/scsi/device_handler": true,
        //     "**/drivers/scsi/dpt": true,
        //     "**/drivers/scsi/esas2r": true,
        //     "**/drivers/scsi/fcoe": true,
        //     "**/drivers/scsi/fnic": true,
        //     "**/drivers/scsi/hisi_sas": true,
        //     "**/drivers/scsi/ibmvscsi": true,
        //     "**/drivers/scsi/ibmvscsi_tgt": true,
        //     "**/drivers/scsi/isci": true,
        //     "**/drivers/scsi/libfc": true,
        //     "**/drivers/scsi/libsas": true,
        //     "**/drivers/scsi/lpfc": true,
        //     "**/drivers/scsi/megaraid": true,
        //     "**/drivers/scsi/mpt3sas": true,
        //     "**/drivers/scsi/mvsas": true,
        //     "**/drivers/scsi/osd": true,
        //     "**/drivers/scsi/pcmcia": true,
        //     "**/drivers/scsi/pm8001": true,
        //     "**/drivers/scsi/qla*": true,
        //     "**/drivers/scsi/smartpqi": true,
        //     "**/drivers/scsi/snic": true,
        //     "**/drivers/scsi/sym53c8xx_2": true,
        //     "**/drivers/scsi/ufs": true,
        //     // "**/drivers/scsi/[0-9]*":true,
        //     /* spi 专门排除 */
        //     "**/drivers/spi/spi-[a-g]*": true,
        //     "**/drivers/spi/spi-[i-z]*": true,
        //     /* 驱动 t */
        //     "**/drivers/target": true, /* SCSI设备驱动 */
        //     "**/drivers/tc": true, /* 这些驱动用于TURBOchannel,TURBOchannel是数字设备公司开发的32位开放总线。这主要用于DEC工作站 */
        //     "**/drivers/thermal": true, /* Linux Thermal 是 Linux 系统下温度控制相关的模块,主要用来控制系统运行过程中芯片产生的热量 */
        //     "**/drivers/tty": false, /* tty驱动用于管理物理终端连接 */
        //     "**/drivers/thunderbolt": true,
        //     /* 驱动 u-v-w-x */
        //     "**/drivers/uio": true, /* 该驱动允许用户编译运行在用户空间而不是内核空间的驱动。这使用户驱动不会导致内核崩溃 */
        //     "**/drivers/usb": false,
        //     "**/drivers/uwb": true, /* 室内定位 */
        //     "**/drivers/vdio": false, /* 这是用来管理显卡和监视器的视频驱动 */
        //     "**/drivers/vme": true, /* WMEbus最初是为摩托罗拉68000系列处理器开发的总线标准 */
        //     "**/drivers/vfio": true, /* 允许设备访问用户空间的VFIO驱动 */
        //     "**/drivers/vhost": true, /* 这是用于宿主内核中的virtio服务器驱动。用于虚拟化中 */
        //     "**/drivers/virt*": true, /* 这些驱动用来虚拟化 */
        //     "**/drivers/vlynq*": true, /* 这个驱动控制着由德州仪器开发的专有接口。这些都是宽带产品,像WLAN和调制解调器,VOIP处理器,音频和数字媒体信号处理芯片 */
        //     "**/drivers/w1": true, /* 这些驱动用来控制one-wire总线。 */
        //     "**/drivers/xen": true, /* 该驱动是Xen管理程序系统。这是个允许用户运行多个操作系统在一台计算机的软件或硬件。
        //                                这意味着xen的代码将允许用户在同一时间的一台计算机上运行两个或更多的Linux系统。
        //                                用户也可以在Linux上运行Windows、Solaris、FreeBSD、或其他操作系统 */
        //     "**/drivers/zorro": true, /* 该驱动提供Zorro Amiga总线支持 */
        //     /* usb 专门排除 */
        //     "**/drivers/usb/atm": true,
        //     "**/drivers/usb/c67x00": true,
        //     "**/drivers/usb/chipidea": true,
        //     "**/drivers/usb/isp1730": true,
        //     "**/drivers/usb/musb": true,
        //     "**/drivers/usb/renesas_usbhs": true,
        //     "**/drivers/usb/wusbcore": true,
        //     /* video 专门排除 */
        //     "**/drivers/video/backlight": true,
        //     "**/drivers/video/logo": true,
        //     "**/drivers/video/fbdev/aty": true,
        //     "**/drivers/video/fbdev/geode": true,
        //     "**/drivers/video/fbdev/i810": true,
        //     "**/drivers/video/fbdev/intelfb": true,
        //     "**/drivers/video/fbdev/kyro": true,
        //     "**/drivers/video/fbdev/matrox": true,
        //     "**/drivers/video/fbdev/mb862xx": true,
        //     "**/drivers/video/fbdev/mbx": true,
        //     "**/drivers/video/fbdev/mmp": true,
        //     "**/drivers/video/fbdev/nvidia": true,
        //     "**/drivers/video/fbdev/omap*": true,
        //     "**/drivers/video/fbdev/riva": true,
        //     "**/drivers/video/fbdev/savage": true,
        //     "**/drivers/video/fbdev/sis": true,
        //     "**/drivers/video/fbdev/vermilion": true,
        //     "**/drivers/video/fbdev/via": true,
        //     /* 屏蔽占时不用的文件系统 */
        //     "**/fs/9p": true,
        //     "**/fs/adfs": true,
        //     "**/fs/affs": true,
        //     "**/fs/afs": true,
        //     "**/fs/autofs*": true,
        //     "**/fs/befs*": true,
        //     "**/fs/bfs*": true,
        //     "**/fs/btrfs*": true,
        //     "**/fs/cache*": true,
        //     "**/fs/ceph": true,
        //     "**/fs/coda": true,
        //     "**/fs/cramfs": true,
        //     "**/fs/dlm": true,
        //     "**/fs/ecryptfs": true,
        //     "**/fs/efivarfs": true,
        //     "**/fs/efs": true,
        //     "**/fs/exofs": true,
        //     "**/fs/f2fs": true,
        //     "**/fs/freevxfs": true,
        //     "**/fs/gfs2": true,
        //     "**/fs/hfs*": true,
        //     "**/fs/hostfs": true,
        //     "**/fs/hpfs": true,
        //     "**/fs/hugetlbfs": true,
        //     "**/fs/isofs": true,
        //     "**/fs/longfs": true,
        //     "**/fs/minix": true,
        //     "**/fs/ncpfs": true,
        //     "**/fs/nilfs2": true,
        //     "**/fs/nls": true,
        //     "**/fs/ntfs": true,
        //     "**/fs/ocfs*": true,
        //     "**/fs/omfs": true,
        //     "**/fs/openpromfs": true,
        //     "**/fs/orangefs": true,
        //     "**/fs/overlayfs": true,
        //     "**/fs/pstore": true,
        //     "**/fs/qnx*": true,
        //     "**/fs/reiserfs": true,
        //     "**/fs/romfs": true,
        //     "**/fs/squashfs": true,
        //     "**/fs/sysv": true,
        //     "**/fs/tracefs": true,
        //     "**/fs/udf": true,
        //     "**/fs/ufs": true,
        //     // "**/fs/xfs": true,
        //     /* 屏蔽占时不用的net文件夹 */
        //     "**/net/6lowpan": true,
        //     "**/net/9p": true,
        //     "**/net/appletalk": true,
        //     "**/net/atm": true,
        //     "**/net/ax25": true,
        //     "**/net/batman-adv": true,
        //     "**/net/bluetooth": true,
        //     "**/net/caif": true,
        //     "**/net/can": true,
        //     "**/net/ceph": true,
        //     "**/net/dab": true,
        //     "**/net/dccp": true,
        //     "**/net/decnet": true,
        //     "**/net/dsa": true,
        //     "**/net/ipx": true,
        //     "**/net/irda": true,
        //     "**/net/iucv": true,
        //     "**/net/kcm": true,
        //     "**/net/": true,
        //     "**/net/l3mdev": true,
        //     "**/net/lapd": true,
        //     "**/net/mpls": true,
        //     "**/net/ncsi": true,
        //     "**/net/nfs": true,
        //     "**/net/openvswitch": true,
        //     "**/net/phonet": true,
        //     "**/net/qrtr": true,
        //     "**/net/rds": true,
        //     "**/net/rfkill": true,
        //     "**/net/rose": true,
        //     "**/net/rxrpc": true,
        //     "**/net/phtipconet": true,
        //     "**/net/vmw-vsock": true,
        //     "**/net/wimax": true,
        //     "**/net/x25": true,
        //     /* 额外新增 */
        //     "**/arch/unicore32/mm":true,
    },
    "search.exclude": {
        /* 该选项专门为了去掉搜索文件 */
        ".history": true,
        "**/node_modules": true,
        "**/bower_components": true,
        "**/*.o": true,
        "**/*.su": true,
        "**/*.cmd": true,
        /* 隐藏kernel下无关紧要的文件夹 */
        "**/Documentation": true,
        "**/firmware": true,
        "**/samples": true,
        "**/sound": true, /* 目前没用上 */
        /* 屏蔽不用的架构相关的文件 */
        "**/arch/alpha": true,
        "**/arch/arc": true,
        "**/arch/arm64": true,
        "**/arch/avr32": true,
        "**/arch/[b-z]*": true,
        "**/arch/arm/plat*": true,
        "**/arch/arm/mach-[a-g]*": true,
        "**/arch/arm/mach-[i-z]*": true,
        "**/arch/arm/mach-hi[a-j]*": true,
        "**/arch/arm/mach-hi[l-z]*": true,
        /* 屏蔽排除不用的配置文件 */
        "**/arch/arm/configs/[a-g]*": true,
        "**/arch/arm/configs/[i-z]*": true,
        "**/arch/arm/configs/imo*": true,
        "**/arch/arm/configs/in*": true,
        "**/arch/arm/configs/io*": true,
        "**/arch/arm/configs/ix*": true,
        /* 屏蔽掉不用的DTB文件 */
        "**/arch/arm/boot/dts/[a-g]*": true,
        "**/arch/arm/boot/dts/[i-z]*": true,
        "**/arch/arm/boot/dts/*.tmp": true,
        "**/.history": true,
        "**/.git": true,
        // "**/.svn": true,
        "**/.hg": true,
        "**/CVS": true,
        "**/.DS_Store": true,
        "**/*.ihex": true,
        //"**/*.o":true,
        "**/*.a": true,
        "**/*.order": true,
        "**/*.builtin": true,
        "**/*.gitignore": true,
        "**/*.tmp*": true,
        "**/*.mod.o": true,
        "**/*.mod.c": true,
        "**/built-in.o": true,
        "**/Module.symvers": true,
    },

通过make编译的方式

其实本质上是因为内核代码太多导致,而实际上我们在看内核代码时很多是不需要的。
因此作为VSCODE 单推人,是时候解决如上问题了,思路就是make工具在make源码时会自动根据makefile找到需要的文件,所以只要能够修改make,只把需要的文件找出来,然后再搞个脚本,把需要的文件拷出来创建工作区,然后再看代码。就能解决上述各种问题

如下为make源码下载地址。我这里使用的make4.4最新版源码进行修改
http://ftp.gnu.org/gnu/make/

make代码修改

1.修改make-4.4\src\file.c 在 enter_file 函数处修改

#include 
int gol_show = 0;
char clist[256]={0};
char hlist[256]={0};

int put_clist(const char *name)
{
  char pwdbuf[256];
  char *pwd = NULL;
  FILE *fp;	
  if(!name)
    return -1;
  if(clist[0]==0){
    pwd = getcwd(pwdbuf, 240);
    if (!pwd)
      return -1;
    sprintf(clist, "%s/clist", pwd);
    printf("clist:%s\n", clist);
  }
  fp = fopen(clist, "a+");
  fprintf(fp, "%s\n", name);
  fflush (fp);
  fclose (fp);
  return 0;
}

int put_hlist(const char *name)
{
  char pwdbuf[256];
  char *pwd = NULL;
  FILE *fp;	
  if(!name)
    return -1;
  if(hlist[0]==0){
    pwd = getcwd(pwdbuf, 240);
    if (!pwd)
      return -1;
    sprintf(hlist, "%s/hlist", pwd);
    printf("hlist:%s\n", hlist);
  }
  fp = fopen(hlist, "a+");
  fprintf(fp, "%s\n", name);
  fflush (fp);
  fclose (fp);
  return 0;
}

struct file *enter_file(const char *name)
{
  struct file *f;
  struct file *new;
  struct file **file_slot;
  struct file file_key;
  char *tmp = NULL;
  int len = 0, tlen = 0;

  assert (*name != '\0');
  assert (! verify_flag || strcache_iscached (name));

#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS)
  if (*name != '.')
    {
      const char *n;
      char *lname, *ln;
      lname = xstrdup (name);
      for (n = name, ln = lname; *n != '\0'; ++n, ++ln)
        if (isupper ((unsigned char)*n))
          *ln = tolower ((unsigned char)*n);
        else
          *ln = *n;

      *ln = '\0';
      name = strcache_add (lname);
      free (lname);
    }
#endif
  file_key.hname = name;
  file_slot = (struct file **) hash_find_slot (&files, &file_key);
  f = *file_slot;
  if (! HASH_VACANT (f) && !f->double_colon)
    {
      f->builtin = 0;
      return f;
    }

  new = xcalloc (sizeof (struct file));
  new->name = new->hname = name;
  new->update_status = us_none;

  if (HASH_VACANT (f))
    {
      new->last = new;
      hash_insert_at (&files, new, file_slot);
      if(gol_show){
        if(strstr(name, ".c")) {
          printf("gy make get c:%s\n", name);
          put_clist(name);
        }    
      }

      len = strstr(name, ".h"); 
      if (len){
        tlen = strlen(name);
        if(tlen!=2){
          tmp = name + tlen - 2;
          if(strncmp(tmp,".h",2)==0){
            if(!strstr(name, "%") && !strstr(name, "*")){
              printf("gy make get inc:%s\n", name);
              put_hlist(name);
            }
          }   
        }
      }

      len = strstr(name, ".S"); 
      if (len){
        tlen = strlen(name);
        if(tlen!=2){
          tmp = name + tlen - 2;
          if(strncmp(tmp,".S",2)==0){
            if(!strstr(name, "%") && !strstr(name, "*")){
              printf("gy make get ASM.S:%s\n", name);
              put_hlist(name);
            }
          }   
        }
      }

      len = strstr(name, ".s"); 
      if (len){
        tlen = strlen(name);
        if(tlen!=2){
          tmp = name + tlen - 2;
          if(strncmp(tmp,".s",2)==0){
            if(!strstr(name, "%") && !strstr(name, "*")){
              printf("gy make get asm.s:%s\n", name);
              put_hlist(name);
            }
          }   
        }
      } 
          
    }
  else
    {
      /* There is already a double-colon entry for this file.  */
      new->double_colon = f;
      f->last->prev = new;
      f->last = new;
      
    }

  return new;
}

2.修改make-4.4\src\implicit.c 在 pattern_search 函数处修改

208  extern int gol_show;
209  static int pattern_search(struct file *file, int archive, unsigned int depth, unsigned int recursions,
210                          int allow_compat_rules)

783        DBS (DB_IMPLICIT,
784             (is_rule
785              ? _("Trying rule prerequisite '%s'.\n")
786              : _("Trying implicit prerequisite '%s'.\n"), d->name));
787
788        df = lookup_file (d->name);
789        gol_show = 1; /* 在此处增加 */
790
791        if (df && df->is_explicit)
792            pat->is_explicit = 1;

make编译

关于make的编译,我这里使用的arm,因此进行如下配置,配置完成直接make即可编译出make工具

./configure -target=arm-linux -program-prefix=arm-linux-

编译参数说明:

  1. CC:编译gdb使用的交叉编译工具链,3536和3519的工具不一样
  2. –host:编译出来的gdb运行在什么机器上
  3. –target:要调试的目标板
  4. –program-prefix:编译生成可执行文件的前缀
  5. –prefix:make install的的位置
    注: -target=arm-linux 意思是说目标平台是运行于ARM体系结构的linux内核;
    -program-prefix=arm-linux- 是指生成的可执行文件的前缀,比如arm-linux-gdb,
    -prefix 是指生成的可执行文件安装在哪个目录,这个目录需要根据实际情况作选择。
    如果该目录不存在,会自动创建,当然,权限足够的话。

脚本代码

然后是脚本:

#!/bin/sh

Dist=""
OBJ=""
CROSS_COMPILE=aarch64-linux-gnu-
CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}')

str_to_lower()
{
	echo $1 | tr '[A-Z]' '[a-z]'
}

str_to_upper()
{
	echo $1 | tr '[a-z]' '[A-Z]'
}

usage()
{
	echo "***********************************************************"
	echo "USAGE:"
	echo "./make.sh [dir] [kernel/uboot]"
	echo "DESCIPTION"
	echo "	dir:         kernel or uboot Source code path"
	echo "***********************************************************"
}

parse_param()
{
	str=$(str_to_lower $1)
	if [ "$str" == "kernel" ] || [ "$str" == "uboot" ] ; then
		OBJ=$str
	else
		usage
		exit 1
	fi
}

#shell param parse
if [ $# -lt 2 ]; then
    echo "Please makesure Dist and Source"
else
    Dist=$1
    parse_param $2
fi

function trim_path() {
    local _path="${1}"
    # 如果路径最后有 '/',需要去掉,否则无法获取绝对路径
    while true; do
        if [[ ${_path} =~ /$ ]]; then
            _path=${_path:0:-1}
        else
            break
        fi
    done
    echo "${_path}"
}

function cpfun() {
    cat $1 | awk -F/ '{
    for ( i=1;i | xargs mkdir -p

    sum=$(cat $1 | wc -l)
    mod=$(expr $sum / 25)
    str='#'
    ch=('|' '\' '-' '/')
    i=0
    j=0
    echo "文件总数为:$sum"
    while read rows; do
        ln "$Dist$rows" ./$rows >/dev/null 2>&1
        let j++
        if [ $mod = $j ]; then
            j=0
            str+='#'
            let i++
            let index=i%4
        fi
        printf "[%-26s][%d%%][%c]\r" $str $(($i * 4)) ${ch[$index]}
    done <$1
    printf "\n"
}

function get_abspath() {
    local _path="${1}"

    # 对于相对路径,把他的绝对路径补齐
    if [[ ${_path} =~ ^/ ]]; then
        _path=${_path}
    else
        _path="$(pwd)/${_path}"
    fi
    _path=$(trim_path ${_path})

    while [ -h "${_path}" ]; do
        local _topath=$(ls -ld ${_path} | awk '{print $NF}')
        local _frompath=$(ls -ld ${_path} | awk '{print $(NF-2)}')
        if [[ ${_topath} =~ ^/ ]]; then
            _path=${_topath}
        else
            _path="$(dirname ${_frompath})/${_topath}"
        fi
        _path=$(trim_path ${_path})
    done

    if [ -e ${_path}/hlist_new ]; then
        rm ${_path}/hlist_new
    fi

    if [ -e ${_path}/clist_new ]; then
        rm ${_path}/clist_new
    fi

    if [ -e ${_path}/hlist ]; then
        sort -u ${_path}/hlist >${_path}/hlist_new
        mv ${_path}/hlist_new ${_path}/hlist_tmp
        while read line; do
            if [ ${line:0:1} != "/" ]; then
                echo /$line # 排除掉已经是绝对路径的文件
            fi
        done <${_path}/hlist_tmp >>${_path}/hlist_new
        rm ${_path}/hlist_tmp
        echo -n "正在拷贝所需.h文件:"
        cpfun ${_path}/hlist_new
    else
        echo "not find hlist!"
        exit 1
    fi

    if [ -e ${_path}/clist ]; then
        while read line; do
            if [ ${line:0:1} != "/" ]; then
                echo /$line  # 排除掉已经是绝对路径的文件
            fi
        done <${_path}/clist >>${_path}/clist_new
        echo -n "正在拷贝所需.c文件:"
        cpfun ${_path}/clist_new
    else
        echo "not find clist!"
        exit 1
    fi
}


function make_fun() {
    if [ -e ${Dist}/hlist ]; then
        rm ${Dist}/hlist
    fi
    if [ -e ${Dist}/clist ]; then
        rm ${Dist}/clist
    fi

    if [ "$KorU" == "kernel" ] || [ "$KorU" == "KERNEL" ];then
        ./make CROSS_COMPILE=$CROSS_COMPILE -j$CPU_JOB_NUM -C ${Dist}/ uImage # kernel
    else
        ./make CROSS_COMPILE=$CROSS_COMPILE all -j${CPU_JOB_NUM} -C ${Dist}/  # uboot
    fi
}

#删除kernel结构下的全部目录文件
function del_dir() {
    ls |grep -v make |xargs rm -rf
}

del_dir
make_fun
get_abspath ${1}


使用方法:

  1. 先对源码进行编译
  2. 创建一个新的文件夹,将make和make.sh放入该文件夹中
  3. 执行make.sh 并指出对应源码的路径 ./make.sh 源码路径
  4. 等待完成,然后再VSCODE中打开对应文件夹

最终效果

正在拷贝所需.h文件:文件总数为:3660
[##########################][100%][]
正在拷贝所需.c文件:文件总数为:2229
[##########################][100%][]

如下为未处理前
用VSCODE看linux内核代码_第1张图片
如下为处理后
用VSCODE看linux内核代码_第2张图片

你可能感兴趣的:(Linux,vscode,linux,ide)