0

Я хочу использовать интерфейс сетевого устройства, экспортируемый модулем сетевого драйвера. Это моя программа devget.cНеопределенная ссылка на «функцию» в интерфейсе сетевого устройства в пользовательском пространстве ».

#include<stdio.h> 
#include<linux/netdevice.h> 

    void main(void) 
    { 
    struct net_device* device; 

    device = dev_get_by_name("eth0"); 
    if (device == NULL) 
     printf("device is NULL\n"); 
    else 
     printf("This is a success story\n"); 
    } 

Я крест, компилируя это. undefined ссылка на `dev_get_by_name '. Теперь эта функция определяется как прототип в файле /linux/netdevice.h. Я скомпилирую это с помощью agcc, давая пути include в скрипте.

+0

Похоже, что 'dev_get_by_name' не входит в ядро. – ciphor

+0

Вопрос в том, как получить интерфейс сетевого устройства, поэтому я могу назвать сетевой API для ядра на своем устройстве. Мне нужно предоставить заголовки ядра/inlcude файлы, которые будут иметь прототипы для этого dev_get_by_name. Я компилирую это для ОС Android, я включаю ядро ​​с ОС и даю путь к ядру при компиляции, такой как agcc getdev.c -o getdev -I android/kernel. – sraddhaj

+1

из пользовательского пространства, вы не можете получить доступ к структуре net_device. Вы должны использовать некоторые стандартные интерфейсы для настройки вашей сети (ethtool, ifconfig). В противном случае вы должны написать код в ядре вместо этого –

ответ

1

Возможно, вы создаете программу пользовательского пространства, а не модуль ядра.

Программы пользовательского пространства не могут использовать функции ядра. Они могут использовать только функции из libc или других библиотек.

Вам необходимо скомпилировать ваш код в качестве модуля ядра.
Это изменяет несколько вещей - у вас нет функции main (вместо этого у вас есть init_module, что не то же самое), а процесс компиляции отличается (а не только gcc -o myprog myprog.c).

Предлагаю вам прочитать основную книгу о развитии ядра.