Ошибки компиляции ядра при каждой модификации - PullRequest
0 голосов
/ 15 ноября 2018

Всякий раз, когда я пытаюсь работать с исходным кодом ядра (будь то апстрим к более стабильной версии Linux, добавлять функции и т. Д.), При сборке происходит сбой случайных исходных файлов.

Например, я пытался перевести версию ядра с версии 3.18.110 до версии 3.18.125 (конечно, по одной версии за раз). Я успешно разрешил все возникшие конфликты, но когда я начинаю собирать ядро, компилятор находит ошибку в файле, которого нет даже в конфликтующих файлах. Устранение появившейся ошибки приведет к появлению большего количества ошибок либо в том же файле, либо в другом файле.

Другая вещь, которую я пробовал, - это добавление губернатора. Я успешно добавил код там, где это необходимо, добавил исходный файл регулятора, затем включил его в конфигурации по умолчанию и затем начал компилировать. После этого компилятор обнаружил некоторую ошибку в .c файле регулятора. Почему?

Я не прошу разрешения ошибок, я хочу знать, почему ошибки происходят в первую очередь.

Архитектура - это arm64, набор инструментов - это: https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9

Пример: Я пытаюсь добавить регулятор, редактируя эти файлы:

драйверы / CPUfreq / Kconfig

драйверы / CPUfreq / Makefile

включить / 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

Makefile:

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

Затем я иду в папку toolchain, открываю терминал и набираю это:

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 = неявное объявление функции] 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 = неявное объявление-функции] res = strict_strtoul (buf, 0, & input);

1 Ответ

0 голосов
/ 16 ноября 2018

Регулятор smartmax cpufreq был разработан для более старых ядер Linux (вероятно, до 3.4). Следовательно, он все еще ссылается на несколько устаревших API и функций ядра. Поскольку этих API больше нет в Linux 3.18, возникают ошибки компиляции.


drivers / cpufreq / cpufreq_smartmax.c: в функции 'cpufreq_smartmax_timer': drivers / cpufreq / cpufreq_smartmax.c: 522: 3: ошибка: неявное объявление функции '__cpufreq_driver_Wever_Ware_Gerg_WREG] __cpufreq_driver_getavg (policy, j);

В частности, эта ошибка вызвана тем, что регулятор использует функцию __cpufreq_driver_getavg (), которой больше нет в Linux 3.18. Фактически эта функция была удалена в Linux 3.12 , 5 лет назад в 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, что в значительной степени служит для того же предназначения .


Я вполне уверен, что существуют другие устаревшие или удаленные API и функции ядра, от которых зависит регулятор smartmax. Вы можете попытаться обновить регулятор для Linux 3.18, но это может не стоить времени и усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...