使用Clion 閱讀/修改/注釋 Linux 內(nèi)核源碼

前言

其實(shí),bootlin就是一個(gè)聽不錯(cuò)的閱讀源碼的工具了,可以非常方便的幫我們查閱函數(shù)、宏的定義、引用等等。而且是基于瀏覽器,對我們本機(jī)的配置沒有什么過高的要求。

但是如果想要做一些注釋,修改,那我們就要將源碼下載到本地了,這個(gè)時(shí)候我們可能就需要其他的工具了。

Clion我最熟悉的C/C++ IDE,我非常喜歡Jetbrains家族的IDE,因此使用Clion來閱讀/注釋/修改源碼,就成了我的首選,很可惜的是,Linux kernel是通過Makefile進(jìn)行構(gòu)建的,然后Clion是用的是CMake,因此如果我們想要借助Clion來閱讀源碼,就需要生成Linux kernel的Cmake文件!

目前來看,可以成功的實(shí)現(xiàn)使用Clion來閱讀/注釋/修改源碼,但是不能成功的進(jìn)行編譯,因此編譯還得用make,不過這個(gè)無傷大雅!

配置要求

Clion需要大量的緩存內(nèi)核文件,因此我們必須保證本機(jī)有足夠的內(nèi)存,并調(diào)高Clion的堆內(nèi)存配置,本機(jī)至少要有8G內(nèi)存,Clion堆內(nèi)存至少調(diào)整到4G以上。配置方法:

點(diǎn)擊CLion的狀態(tài)欄上的"Help->Change Memory Settings",然后修改"MAX Heap Size",如下圖所示,我將其調(diào)整到了8G,我本機(jī)有24G。然后重啟配置生效!


源碼準(zhǔn)備

安裝編譯必須的工具

sudo apt update && sudo apt upgrade
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

下載源碼,最好到The Linux Kernel Archives下載源碼的壓縮包,然后再解壓!

tar -zxf linux-5.14.2.tar.xz
cd linux-5.14.2

使用本機(jī)的配置文件來配置內(nèi)核

cp /boot/config-$(uname -r) .config
make menuconfig

上述過程其實(shí)就是編譯內(nèi)核的步驟。

注意:
直接使用ubuntu的.config在編譯時(shí)可能遇到如下的錯(cuò)誤:

make[1]: *** No rule to make target 'debian/certs/benh@debian.org.cert.pem', needed by 'certs/x509_certificate_list'

此時(shí)需要編輯一下.config,將CONFIG_SYSTEM_TRUSTED_KEYS置為空:

CONFIG_SYSTEM_TRUSTED_KEYS = ""

生成CMakeLists.txt

安裝bear工具,bear可以根據(jù)追蹤make編譯的過程,生成compile_commands.json文件,然后我們在通過其他工具通過compile_commands.json最終生成CMakeLists.txt

sudo apt-get install bear

使用bear,make編譯內(nèi)核。最新的bear應(yīng)該需要在bear和make之間加上"--"。make的"-j12"表示啟用12個(gè)線程同時(shí)編譯,這取決你本機(jī)的core數(shù),這個(gè)過程需要很久!

bear make  -j12

2020年 9月21日更新
之前我一直使用 make -j12來編譯內(nèi)核,在我這臺(tái)擁有12個(gè)core的機(jī)器上,編譯時(shí)間也長達(dá)30分鐘,直到前幾天我才發(fā)現(xiàn),這樣其實(shí)是非常蠢的,因?yàn)?code>make -j12其實(shí)默認(rèn)編譯了所有的內(nèi)容,但是如果我們僅僅編譯內(nèi)核,只需要編譯vmlinux即可,后面為了使用qemu來調(diào)試,在加上bzImage就行了,即make -j12 vmlinux bzImage,這樣一來,編譯的時(shí)間只需要不到5分鐘,最終生成Cmakea文件也只有5MB左右,這樣Clion就可以無需那么高的內(nèi)存配置了!

克隆kernel-grok項(xiàng)目

cd ~
git clone https://github.com/habemus-papadum/kernel-grok

回到內(nèi)核目錄,生成CMakeLists.txt

cd linux-5.14.2
~/kernel-grok/generate_cmake  ## creates CMakeLists.txt

修改CMakeLists.txt

這個(gè)時(shí)候需要我們手動(dòng)添加一些參數(shù)配置

在文件的最開頭添加以下內(nèi)容:

cmake_minimum_required(VERSION 2.8.8)
project(kernel)

set(SYSROOT sysroot)
SET(CMAKE_C_COMPILER "gcc")
set(CMAKE_C_STANDARD 90)
set(CMAKE_C_FLAGS  ${CMAKE_C_FLAGS} " --sysroot=${SYSROOT}" )

include_directories("include")
include_directories("include/uapi")
include_directories("arch/x86/include")
include_directories("arch/x86/include/uapi")
include_directories("arch/x86/include/generated")
include_directories("arch/x86/include/generated/uapi")

add_definitions(-D__KERNEL__)

添加內(nèi)容主要包括:

  1. 修改sysroot,這需要首先在CMakeLists.txt的同目錄下創(chuàng)建一個(gè)名為sysroot的空目錄,然后設(shè)置編譯參數(shù)"--sysroot=${SYSROOT}",這是因?yàn)閟ysroot其實(shí)是C標(biāo)準(zhǔn)頭文件的位置,顯然內(nèi)核是不需要這些東西的,他們存在反而會(huì)干擾clion尋找正確頭的文件,產(chǎn)生一下不必要得沖突
  2. 添加頭文件路徑,如果不進(jìn)行這一步,那么clion將會(huì)出現(xiàn)大量的錯(cuò)誤,提示找不到頭文件或者變量、常量、函數(shù)等。具體添加的內(nèi)容是我反復(fù)測試過的,添加這些內(nèi)容后基本上保證頭文件尋找正確,其中后四個(gè)是與架構(gòu)相關(guān)的,x84_64可放心使用
  3. 使用C90的C語言標(biāo)準(zhǔn),一開始我使用的是Clion的默認(rèn)C標(biāo)準(zhǔn),一直沒有出過問題,但是昨天一下子就出現(xiàn)大量報(bào)錯(cuò),不排除是因?yàn)槲疑壛俗钚碌腃lion 2021.2.2 ,最終加上了set(CMAKE_C_STANDARD 90)才恢復(fù)正常

啟動(dòng)CLion

點(diǎn)擊狀態(tài)欄"File->Open",然后選中我們創(chuàng)建的CMakeLists.txt,確定后選擇"Open as Project"

然后Clion會(huì)自動(dòng)加載Cmake,目前最終會(huì)加載失敗,因?yàn)檫@個(gè)方法并不能用來編譯內(nèi)核!

這時(shí)候查看內(nèi)核源碼,正常是沒有任何紅色報(bào)錯(cuò)信息,可以正常的進(jìn)行跳轉(zhuǎn)和自動(dòng)補(bǔ)全。


問題

除去不能編譯外,還有一個(gè)問題,那就是編譯選項(xiàng)的宏定義,顯示不正常:

上面是task_struct中的一段代碼,clion的代碼顯示表明找不到CONFIG_MEMCG,因此也就沒有定義memcg_data,但是按住Ctrl是可以跳轉(zhuǎn)到CONFIG_MEMCG的定義的,就在include/generated/autoconf.h中,這個(gè)很奇怪!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容