Linux 源码阅读环境配置一条龙

Linux 源码文件太多了,整体导入 source insight 会非常卡慢,Sync 也需要很久。且不同硬件平台又有很多相同的 symbol,需要阅读的时候眼动区分太累了。这个方法就可以精准导入你的平台所需的源码文件。

一、下载所需文件

Linux 源代码:

复制代码
https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.18.1.tar.xz

Source Insight 4 安装文件:

复制代码
https://assets-sourceinsight.sfo2.digitaloceanspaces.com/v4/release/sourceinsight40148_7177-setup.exe

Source Insight 4 免费使用的 patch:

复制代码
https://github.com/YukiIsait/SourceInsight4Patch/releases/download/v1.0.1/msimg32.dll

二、安装 source insght 4

运行安装 source insight 4,并在安装后将 dll 文件放到 sourceinsight4.exe 同级文件夹中。即可正常使用。

三、编译 Linux 内核源码(wsl2 Ubuntu24.04)

安装编译 Linux 内核所需编译器(我编译是 RISC-V 平台,根据自己的平台选择相应的编译器)

bash 复制代码
sudo apt install -y gcc-riscv64-linux-gnu

安装编译 Linux 内核所需环境

bash 复制代码
sudo apt install -y build-essential libncurses-dev flex bison openssl   libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf

解压 Linux 源码压缩包

bash 复制代码
tar Jxvf linux-6.18.1.tar.xz

配置编译 config

bash 复制代码
make ARCH=riscv defconfig

编译(将打印重定向到文件中,后续有用)

bash 复制代码
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- all -j8 > build_log.txt

编译时间可能需要十几分钟,由电脑性能决定。期间可以用以下指令查看编译进度

bash 复制代码
cat build_log.txt | tail

四、解析 Build Log

编译时我们来准备解析编译 Log 提取文件列表的脚本。可以用 vim 创建脚本

复制代码
vim sg.sh

将以下脚本粘贴进去,注意 ABS_PATH 配置为 Windows 路径,但是斜杠用 Linux 的正斜杠,脚本最后会替换。

bash 复制代码
#!/bin/sh
ARCH=arm
MACH=imx
FILE_IN=$1
FILE_OUT=$2
#windows abs path
ABS_PATH="D:/Codes/C/linux-6.18.1/"
# .c
SOURCE_LIST=""
# generated file list
FILE_LIST=""
# nest depth for function get_includes()
NEST_DTPTH=0
# recursive function, used to get included files from files.
# result is stored in FILE_LIST
# $1 : file list, e.g. "fs/ext4/file.c fs/ext4/fsync.c"
get_includes()
{
        local includes
        local file
        for file in $1
        do
                if [ ! -e ${file} ]; then
                        continue
                fi
                if echo "${FILE_LIST}" | grep -E ${file} > /dev/null; then
                        continue
                fi
                FILE_LIST="${FILE_LIST} ${file}"
                NEST_DTPTH=$((NEST_DTPTH+1))
                echo "<${NEST_DTPTH} : ${file}"
                includes=$(                                                                                \
                        grep -E -H '^#include' ${file} |                                \
                        sed -r \
                                -e 's@^.*<(acpi/.*)>@include/\1@'                 \
                                -e 's@^.*<(asm-generic/.*)>@include/\1@'\
                                -e 's@^.*<(config/.*)>@include/\1@'         \
                                -e 's@^.*<(crypto/.*)>@include/\1@'         \
                                -e 's@^.*<(drm/.*)>@include/\1@'                 \
                                -e 's@^.*<(generated/.*)>@include/\1@'         \
                                -e 's@^.*<(keys/.*)>@include/\1@'                 \
                                -e 's@^.*<(linux/.*)>@include/\1@'                 \
                                -e 's@^.*<(math-emu/.*)>@include/\1@'         \
                                -e 's@^.*<(media/.*)>@include/\1@'                 \
                                -e 's@^.*<(misc/.*)>@include/\1@'                 \
                                -e 's@^.*<(mtd/.*)>@include/\1@'                 \
                                -e 's@^.*<(net/.*)>@include/\1@'                 \
                                -e 's@^.*<(pcmcia/.*)>@include/\1@'         \
                                -e 's@^.*<(rdma/.*)>@include/\1@'                 \
                                -e 's@^.*<(rxrpc/.*)>@include/\1@'                 \
                                -e 's@^.*<(scsi/.*)>@include/\1@'                 \
                                -e 's@^.*<(sound/.*)>@include/\1@'                 \
                                -e 's@^.*<(target/.*)>@include/\1@'         \
                                -e 's@^.*<(trace/.*)>@include/\1@'                 \
                                -e 's@^.*<(uapi/.*)>@include/\1@'                 \
                                -e 's@^.*<(video/.*)>@include/\1@'                 \
                                -e 's@^.*<(xen/.*)>@include/\1@'                 \
                                -e "s@^.*<(asm/.*)>@arch/${ARCH}/include/\1 arch/${ARCH}/include/generated/\1@"        \
                                -e "s@^.*<(mach/.*)>@arch/${ARCH}/mach-${MACH}/include/\1@"        \
                                -e 's@(^.*/)[^/]+\.c.*\"(.*)\"@\1\2@'         \
                                -e 's@/\*.*@@'                                                         \
                                -e 's@^.*\#include.*$@@'                                  \
                                -e 's@^@ @' |                                                        \
                        sort |                                                                                 \
                        uniq |                                                                                \
                        tr -d '\n' |                                                                 \
                        tr -d '\r'                                                                        \
                )
                if [ -n "${includes}" ]; then
                        get_includes "${includes}"
                fi
                echo ">${NEST_DTPTH}) : ${file}"
                NEST_DTPTH=$((NEST_DTPTH-1))
        done
}
# get *.c from kernel build log
SOURCE_LIST=$(                                                \
        grep -E '^\s*CC' ${FILE_IN} |        \
        sed -r                                                         \
                -e 's/^\s*CC\s*/ /'                        \
                -e 's/\.o/\.c/'                        |        \
        tr -d '\n' |                                         \
        tr -d '\r'                                                \
)
echo ${SOURCE_LIST}
get_includes "${SOURCE_LIST}"
FILE_LIST=$(echo "${FILE_LIST}" | sed -r -e 's/\s/\r\n/g' )
echo "${FILE_LIST}" > ${FILE_OUT}
#sed -i 's///\\/g' ${FILE_OUT}
#替换行首为windows路径
sed -i "s#^#${ABS_PATH}#g" ${FILE_OUT}
#替换linux路径符'/'为windows路径符'\'
sed -i "s#/#\\\#g" ${FILE_OUT}

给脚本增加执行权限并解析 build log,输出文件列表到 files_list.txt 中。

复制代码
chmod +x sg.sh
./sg.sh build_log.txt files_list.txt

五、用 files_list 导入文件 Linux 源码到 source insight

打开 source insight 4 并创建工程,之后依次点击 Progect → Add and Remove Project Files... → Add from list... → files_list.txt → 打开,即可将编译过程中涉及到的文件都导入 source insight 了。

再点击 Synchronize Files... 去建立 symbol 映射关系,之后便可以愉快阅读了。

相关推荐
通信小小昕9 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫10 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生11 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1112 小时前
linux基础IO
linux·运维·服务器
BelongPanda14 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯14 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983414 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器
yunwei3714 小时前
eBPF 教程:检查 exec 后真正安装的可执行镜像
linux·开源
笑锝没心没肺15 小时前
yum update 报错:GPG key retrieval failed: [Errno 14] HTTPS Error 404 - Not Found
linux·运维·服务器
AAA@峥15 小时前
CentOS Stream8 基于 Packstack 搭建 OpenStack 云平台全流程实战
linux·centos·openstack