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 映射关系,之后便可以愉快阅读了。

相关推荐
k***92162 小时前
Linux救援模式是什么,如何使用
linux·运维·服务器
oMcLin3 小时前
Systemd 深度解析:理解并掌握 Linux 的现代启动系统
linux·运维·服务器
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [fs]open
linux·笔记·学习
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [fs]nsfs
linux·笔记·学习
赵民勇5 小时前
tr命令用法详解与技巧总结
linux·shell
学不完的路路路5 小时前
IMX6ULL开发板固件烧录问题:添加设备树节点不成功
linux·ubuntu·设备树
大柏怎么被偷了5 小时前
【Linux】进程间通信
linux·运维·服务器
Howrun7775 小时前
Linux进程通信---6.1---进程信号屏蔽
linux·服务器
一颗青果5 小时前
五种IO模型
linux·服务器·网络