Не удается вставить пользовательский модуль ядра

#linux #linux-kernel #embedded-linux

#linux #linux-ядро #встроенный-linux

Вопрос:

Я работаю над целью STM32MP1 с помощью yocto. В общем, я могу скомпилировать файл helloworld .ko и загрузить его в ядро. Но когда я хочу скомпилировать следующее:

 #include <linux/platform_device.h>
#include <linux/module.h>
#include <linux/types.h>

static struct platform_device *pdev;

static int __init fake_eth_add(void)
{
    int inst_id = 0;
    pdev = platform_device_alloc("fake-eth", inst_id);
    platform_device_add(pdev);
    pr_info("fake-eth added");
    return 0;
}

static void __exit fake_eth_put(void)
{
    pr_info("fake-fake removed");
    platform_device_put(pdev);
}

module_init(fake_eth_add);
module_exit(fake_eth_put);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("John Madieu <john.madieu@gmail.com>");
 

Я получаю следующие ошибки:

 ERROR: modpost: "platform_device_put" [/home/rdm/ethtest/eth-ins.ko] undefined!
ERROR: modpost: "platform_device_add" [/home/rdm/ethtest/eth-ins.ko] undefined!
ERROR: modpost: "platform_device_alloc" [/home/rdm/ethtest/eth-ins.ko] undefined!
 

Я проверяю, определен ли символ / функция platform_device_alloc, и он выполняет:

 root@txmp-1570:/lib/modules/5.7.1/source/kernel# grep -w platform_device_alloc /proc/kallsyms
c0547cfc T platform_device_alloc
 

Теперь я узнал, что символы должны быть в файле Module.symvers с тегом EXPORT_SYMBOL_GPL. Символов там не было, поэтому я добавил их в файл Module.symvers:

 0x00000000  platform_device_alloc   vmlinux EXPORT_SYMBOL_GPL   
0x00000000  platform_device_add vmlinux EXPORT_SYMBOL_GPL   
0x00000000  platform_device_put vmlinux EXPORT_SYMBOL_GPL
 

Теперь код компилируется! Но когда я хочу загрузить его с помощью insmod, я получаю следующую ошибку:

 root@txmp-1570:/home/rdm/ethtest# insmod eth-ins.ko
insmod: ERROR: could not insert module eth-ins.ko: Unknown symbol in module
 

И журналы dmseg:

 [ 2954.658383] eth_ins: Unknown symbol platform_device_put (err -2)
[ 2954.664194] eth_ins: Unknown symbol platform_device_add (err -2)
[ 2954.672737] eth_ins: Unknown symbol platform_device_alloc (err -2)
 

Чего мне не хватает? Почему мне пришлось добавлять файл Module.symvers самостоятельно? Я что-то пропустил в отношении настройки среды для разработки драйверов ядра?

Комментарии:

1. «итак, я добавил это» — где вы это добавили?

2. @red0ct Я добавил 3 символа в файл Module.symvers, я просто отредактировал текст, чтобы сделать его более понятным.

3. @Milag Это уже есть в коде, который я опубликовал выше, или ты имеешь в виду что-то другое?

4. Должно быть, пропустил строку, компоновщик должен быть в состоянии разрешить эти символы

5. Вы не забыли «экспортировать неиспользуемые символы», когда создавали ядро?