每当我尝试使用内核源代码时(无论是在更高的Linux稳定版本的上游,还是在添加功能等方面),编译时它在随机源文件上都会失败。
例如,我尝试将内核版本从v3.18.110升级到3.18.125(当然,一次只能有一个版本)。我成功地解决了所有出现的冲突,但是当我开始构建内核时,编译器会在文件中找到错误,甚至在冲突文件中也没有。解决出现的错误会在同一文件或其他文件中引入更多错误。
我尝试的另一件事是添加一个州长。我成功地在需要的地方添加了代码,添加了原始的调控器源文件,然后在默认配置中启用了它,然后开始编译。此后,编译器在调控器的.c文件中发现了一些错误。为什么?
我不是要解决错误,我想知道为什么首先发生错误。
架构是arm64,工具链是: https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
示例: 我正在尝试通过编辑以下文件来添加调控器:
drivers / cpufreq / Kconfig
drivers / cpufreq / Makefile
include / linux / cpufreq.h
Kconfig:
config CPU_FREQ_DEFAULT_GOV_SMARTMAX
bool "smartmax"
select CPU_FREQ_GOV_SMARTMAX
help
Use the CPUFreq governor 'smartmax' as default
config CPU_FREQ_GOV_SMARTMAX
tristate "'smartmax' cpufreq policy governor"
select CPU_FREQ_TABLE
help
'smartmax' combined ondemand and smartass2
制作文件:
obj-$(CONFIG_CPU_FREQ_GOV_SMARTMAX) += cpufreq_smartmax.o
cpufreq.h:
#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_SMARTMAX)
extern struct cpufreq_governor cpufreq_gov_smartmax;
#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_smartmax)
此后,我添加了调控器的.c文件(未修改且完全原始的调控器代码),然后将其添加到设备的默认配置中:
CONFIG_CPU_FREQ_GOV_SMARTMAX=y
然后我进入工具链文件夹,打开终端并输入以下内容:
export CROSS_COMPILE=$(pwd)/bin/aarch64-linux-android-
export ARCH=arm64 && export SUBARCH=arm64
此后,我进入内核文件夹并使用以下命令:
make clean
make mrproper
make *my_device_config_name*
make -s -j$(nproc --all)
执行所有这些操作会导致在调速器代码中出现以下错误:
drivers / cpufreq / cpufreq_smartmax.c:在功能'cpufreq_smartmax_timer'中: drivers / cpufreq / cpufreq_smartmax.c:522:3:错误:函数'__cpufreq_driver_getavg'的隐式声明[-Werror = implicit-function-declaration] freq_avg = __cpufreq_driver_getavg(policy,j);
drivers / cpufreq / cpufreq_smartmax.c:在功能'store_debug_mask'中: drivers / cpufreq / cpufreq_smartmax.c:607:2:错误:函数'strict_strtoul'的隐式声明[-Werror = implicit-function-declaration] res = strict_strtoul(buf,0,&input);
答案 0 :(得分:0)
smartmax cpufreq调控器是为较旧的Linux内核(可能是3.4之前的版本)设计的。因此,它仍然引用了几个过时的内核API和功能。由于这些API在Linux 3.18中不再存在,因此会发生编译错误。
drivers / cpufreq / cpufreq_smartmax.time:在函数'cpufreq_smartmax_timer'中:drivers / cpufreq / cpufreq_smartmax.c:522:3:错误:函数'__cpufreq_driver_getavg'的隐式声明[-Werror = implicit-function-declaration] freq __cpufreq_driver_getavg(policy,j);
具体来说,此错误是由调控器使用__cpufreq_driver_getavg()函数引起的,该函数在Linux 3.18中不再存在。实际上,该函数已在5年前的Linux 3.12中于2013年删除。要解决编译错误,您可以还原该提交并解决任何Git冲突。但是,在此过程中仍然可能存在其他问题(兼容性,编译等)。
drivers / cpufreq / cpufreq_smartmax.c:在功能'store_debug_mask'中:drivers / cpufreq / cpufreq_smartmax.c:607:2:错误:函数'strict_strtoul'的隐式声明[-Werror =隐式函数声明] res = strict_strtoul(buf,0,&input);
类似地,strict_strtoul()是另一个功能,在Linux 3.18中不再使用,但仍由smartmax调控器使用。值得庆幸的是,这个问题很难解决。您可以简单地将strict_strtoul
的任何使用替换为kstrtoul
,这几乎可以为same purpose提供服务。
我相当确定smartmax调控器还依赖于其他过时或已删除的内核API和功能。您可以尝试更新Linux 3.18的调控器,但这可能不值得花时间和精力。