методология сборки ядра android

Мы разрабатываем драйверы ядра Android в команде. Драйверы разрабатываются как загружаемые модули и компилируются отдельно от исходного кода ядра. Однако нам нужно сначала собрать исходный код ядра Android, чтобы собрать модули драйверов. Каждый разработчик извлекает изменения ядра из git и собирает двоичный файл ядра. Поскольку двоичные файлы ядра различаются в локальной системе каждого разработчика, нам необходимо каждый раз заменять как двоичные файлы ядра, так и модули драйверов. Есть ли лучшее решение для создания драйверов, кроме совместного использования исходного кода ядра в общей системе?


person Anup Warnulkar    schedule 15.05.2014    source источник


Ответы (1)


Один из вас должен сделать это локально. Предположим, что ваш исходный каталог ядра — $kern_dir, и вы создадите приведенные ниже артефакты в новой промежуточной области (вне иерархии исходного кода ядра). Назовите это $stage.

В промежуточной области создайте иерархию подкаталогов: $stage/lib/modules/$kernel_version/build ($kernel_version должен совпадать с KERNEL_VERSION в Makefile вашего ядра; результирующий путь будет тем же именем каталога, в котором вы в данный момент устанавливаете модули. в целевой системе); назовите это $build.

# Configure and build the kernel as you currently do.
cp <my-kernel-config> to $kern_dir
cd $kern_dir
make oldconfig          # or whatever is needed to set your config
make

# Create the staging area and build directory
mkdir -p $build

# Copy updated kernel config to staging area:
cp .config $build

# Create necessary kernel configuration support (in staging area) to support out-of-tree modules
make O=$build modules_prepare

# Add Module.symvers to build directory
cp Module.symvers $build

Теперь у вас должен быть полностью настроенный каталог сборки, который каждый может установить в своей системе. Это каталог, содержащий все заголовочные файлы, необходимые для сборки с этим ядром, а также информацию, описывающую параметры конфигурации, с которыми было собрано ваше ядро, и файл Module.symvers, в котором описаны символы, экспортируемые ядром.

Соберите это ("cd $stage; tar czf kernel-devel.tgz lib/modules/$kernel_version/build") и раздайте всем разработчикам.

Отдельно зафиксируйте «пакет», содержащий собранное ядро ​​и связанные с ним модули (т. е. все те, которые поставляются с ядром и которые вы не модифицируете); для этого используйте любой механизм, который вы используете сейчас. Пусть все установят это ядро ​​и создадут каталог на своей целевой (рабочей) системе. (Это должно дать всем общую иерархию /boot/ и /lib/modules.)

В своей системе сборки каждый должен установить ваш kernel-devel.tgz сверху. Предполагая, что система сборки работает с тем же ядром, что и целевые системы, и вы установили kernel-devel.tgz относительно root (т.е. он фактически находится в /lib/modules/$kernel_version/build в вашей системе сборки), вы можете использовать "стандартная" модель Makefile модуля для сборки ваших модулей. Должно быть что-то вроде этого:

obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

Если ваша система сборки не работает с тем же ядром, просто измените KDIR туда, где вы установили tar-архив kernel-devel.tgz.

Теперь любой член вашей команды сможет создавать модули, которые устанавливаются на одно и то же ядро.

person Gil Hamilton    schedule 14.06.2014