一、前言
WSL2 的全称是 Windows Subsystem for Linux 2 (适用于 Linux 的 Windows 子系统第二代)。简单来说,它是一项由微软开发的技术,让你能够在 Windows 操作系统上直接、无缝地运行一个真正的 Linux 环境,而不需要安装笨重的双系统或传统的虚拟机(如 VMware、VirtualBox)。
它在底层使用了一个高度轻量级的 Hyper-V 虚拟机 ,并在里面运行了一个由微软维护和定制的真正的 Linux 内核。
二、 开启 Windows 虚拟化支持
在安装之前,必须确保你的 Windows 已经开启了硬件虚拟化。
右键点击任务栏,打开任务管理器。
点击"性能"选项卡,在CPU一栏查看右下角的虚拟化是否显示为"已启用"。
如果未启用,需进入 BIOS 开启 Intel VT-x 或 AMD-V。
三、安装命令
wsl --install
注意 :这个命令会自动安装 WSL2 核心组件以及默认的 Ubuntu 分发版。
如果系统提示已安装,或者你想指定版本,可以使用
wsl --install -d Ubuntu-22.04。
四、重启与初始化
命令执行完毕后,必须重启电脑。
重启后,会弹出一个 Linux 终端窗口,等待几分钟进行解压。
设置用户名和密码:
注意:有可能重新后并不会有linux中断,这样的话只有手动打开wsl窗口重新执行安装命令:
wsl --install -d Ubuntu-22.04。
避坑问题
检查 WSL 版本
wsl -l -v
如果
VERSION下方显示的是 1,请执行wsl --set-version Ubuntu 2
限制内存占用(防卡死)
WSL2 默认会占用 Windows 80% 的内存,编译内核时可能会把宿主机带崩。
在 Windows 中按
Win + R,输入%UserProfile%。新建一个名为
.wslconfig的文本文件(注意前面有个点)。写入以下内容(假设你电脑 32G 内存,给 Linux 分 16G):
[wsl2]
memory=16GB
processors=8
五、clangd配置
clangd配置是为了让我们更好的去阅读linux内核源码,再次自己的linux内核编译完成。
5.1环境配置
vscode安装clangd插件。(注意是在wsl远程环境下安装的插件,不是本地)
ubuntu需要安装clangd类似于服务器的概念:
sudo apt update sudo apt install clangd -y
5.2收集编译命令
方法一
执行内核自带的脚本,搜集所有编译命令
python3 ./scripts/clang-tools/gen_compile_commands.py
方法二
从 Linux 5.x 版本开始,内核的 Makefile 里其实已经内置了生成 Clangd 索引文件的专门命令:
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make compile_commands.json
5.3解决交叉编译爆红
由于我们是交叉编译(在 x86 电脑上为 ARM64 编译),Clangd 默认会用本机的 x86 编译器去寻找头文件。为了让跳转 100% 完美,我们需要给 Clangd 写一个配置文件。
例如在你的内核源码根目录(~/rk3588/kernel/),新建一个名叫 .clangd 的文本文件,把下面这段代码复制进去并保存:
CompileFlags:
告诉 Clangd,我们是在为 ARM64 架构编译
Add: ["--target=aarch64-linux-gnu", "-Wno-everything"]
允许 Clangd 去探测交叉编译器的内部头文件路径
Compiler: aarch64-linux-gnu-gcc
如果由于你裁剪或某些特殊配置导致 make compile_commands.json 报错或仍然没有生成,我们还有一个在原厂被誉为"万能拦截器"的神器:bear。
sudo apt install bear -y
bear -- make Image dtbs -j28
注意vscode再执行终端命令时,确保是在ubuntu环境下,而不是在本地。
也需要将C/C++的intense功能关闭
可能会遇到的报错及无法跳转的问题
[object Object]
I[16:54:50.640] <-- textDocument/codeAction(37)
I[16:54:50.640] --> reply:textDocument/codeAction(37) 0 ms, error: invalid AST
I[16:54:50.640] --> textDocument/clangd.fileStatus
[Error - 4:54:50 PM] Request textDocument/codeAction failed.
[object Object]
I[16:54:50.703] <-- textDocument/definition(38)
I[16:54:50.703] --> reply:textDocument/definition(38) 0 ms, error: invalid AST
I[16:54:50.703] --> textDocument/clangd.fileStatus
[Error - 4:54:50 PM] Request textDocument/definition failed.
[object Object]
compile_commands.json 7.7MB 的导航图里,全都是写给 gcc 看的编译参数。但是 clangd 底层用的是 clang 引擎。Linux 内核里有大量极其偏门的 GCC 专属参数(比如 -fconserve-stack 等)。当 clangd 读到这些它根本不认识的参数时,它的解析器直接就"脑死亡"了,连树都建不起来,于是抛出 invalid AST。
要彻底制服它,我们需要在项目根目录建一个配置文件(.clangd),专门把那些导致崩溃的参数剔除掉。
bash
CompileFlags:
# 强行指定交叉编译器的名字,让 clangd 去找它的头文件
Compiler: aarch64-linux-gnu-gcc
# 告诉 clangd 我们的目标架构,并关掉所有烦人的警告
Add:
- "--target=aarch64-linux-gnu"
- "-Wno-everything"
# 极其关键:剔除导致 clangd 解析崩溃的 GCC 专属参数!
Remove:
- "-fconserve-stack"
- "-fno-allow-store-data-races"
- "-mgeneral-regs-only"
- "-Wno-psabi"
- "-mabi=lp64"
- "-fno-var-tracking-assignments"
修改 VS Code 的 settings.json 参数格式
-
按
Ctrl + Shift + P,输入Open Remote Settings。 -
选择
首选项: 打开远程设置 (WSL: Ubuntu-22.04) (JSON)。 -
确保你的
clangd.arguments是这样的(特别是--query-driver的路径,为了防止通配符失效,我们直接写死绝对路径):
bash
{
"clangd.arguments": [
"--background-index",
"--query-driver=/usr/bin/aarch64-linux-gnu-gcc",
"--log=verbose"
]
}
既然换了配置文件,必须再次抹除它的记忆,否则它还是会直接抛出之前的 invalid AST 缓存
执行:
bash
rm -rf .cache/clangd
重启VScode