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

#c #linux #struct #makefile

#c #linux #структура #makefile

Вопрос:

Цель этого модуля — в основном делать то же самое, что и при вводе в командной строке Linux cat / proc / buddyinfo

Код

 #include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mmzone.h>

#define DRIVER_AUTHOR "Matthew James Barnes <mbarnes2k5@Gmail.com>"
#define DRIVER_DESC     "A driver that does the same thing as /proc/buddyinfo"

/***
 *GLOBAL VARIABLES
 ***/
extern struct pglist_data *first_online_pgdat(void);
extern struct pglist_data *next_online_pgdat(struct pglist_data*pgdat);
struct pglist_data *pgdat;
extern struct zone *zone;


int init_module(void)
{
int order;
for(pgdat = first_online_pgdat(); pgdat; pgdat = next_online_pgdat(pgdat))
{
for(zone = pgdat->node_zones; zone; zone = next_zone(zone)){
printk(KERN_INFO "Node %d, zone %8s ",pgdat->node_id, zone->name);
printk(KERN_INFO "Node %d", pgdat->node_id);
printk(KERN_CONT "Zone %s",zone->name);
for( order = 0; order < MAX_ORDER;   order)
        printk(KERN_CONT "%6lu ", zone->free_area[order].nr_free);
printk(KERN_CONT "n");
}
}
return 0;
}

void cleanup_module(void){
        printk(KERN_INFO "Zones have been feenished.n");
}

MODULE_LICENSE("GPL");
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);

~                                                                                                                                                                                                                                                                                                                             
~                                                                                                                                                                                                                                                                                                                             
~                                                                                                                                                                                                                                                                                                                             
~                                                                                                                                                                                                                                                                                                                             
~                                                                                                                                                                                                                                                                                                                             
~                                                                                                                                                                                                                                                                                                                             
~                                        
  

Я решил пойти налегке и создать makefile, а также папку в моем ядре под названием module-edits .

При редактировании модуля при запуске makefile я сталкиваюсь с ошибкой компиляции.

Командная строка возвращает следующее:

 make -C /lib/modules/5.4.0-26-generic/build M=/usr/local/share/source_code/version1/module-edits modules
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-26-generic'
  Building modules, stage 2.
  MODPOST 1 modules
ERROR: "next_online_pgdat" [/usr/local/share/source_code/version1/module-edits/printbuddy.ko] undefined!

ERROR: "next_zone" [/usr/local/share/source_code/version1/module-edits/printbuddy.ko] undefined!

ERROR: "zone" [/usr/local/share/source_code/version1/module-edits/printbuddy.ko] undefined!

ERROR: "first_online_pgdat" [/usr/local/share/source_code/version1/module-edits/printbuddy.ko] undefined!
make[2]:  [scripts/Makefile.modpost:94: __modpost] Error 1
make[1]:  [Makefile:1632: modules] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-26-generic'
make:  [makefile:5: all] Error 2
  

Теперь, что сбивает с толку, так это то, что когда я набрал

#include <linux/mmzone.h>

существует несколько структур.

 pgdat is a struct that allows access to the current page data.

*first_online_pgdat(void); is a function that points to the first page. 

*next_online_pgdat(struct pglist_data*pgdat); points to the next page.

struct pglist_data *pgdat; 

is basically the representation of my page.

and extern struct zone *zone is the representation of the zone type of the pages.
  

Все это включено в mmzone, но это как если бы на функции в mmzone.h даже не ссылались.

Я не совсем понимаю, что происходит, но я был бы признателен за помощь опытных программистов Linux.

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

1. Глупый вопрос, наверное, но вы скомпилировали свое ядро?

2. Я действительно ДЕЛАЛ это до этого, я не устанавливал скомпилированное ядро, хотя, потому что этот файл здесь? Он не был скомпилирован с ядром, поэтому я решил вместо этого пойти по маршруту insmod. Я откатил свое ядро до своей текущей версии, потому что я немного запутался.

3. Итак, я откатил свое ядро и теперь пытаюсь выполнить insmod, проблема в том, что я все еще там, где начал. Я не могу выполнить команду make для этого файла, потому что в нем говорится, что все, что должно быть определено в linux / mmzone.h, является «неопределенным»

4. Эти ошибки больше похожи на ошибки компоновки, чем на ошибки компиляции. Вы пробовали подробный режим ( make V=1 ... ), чтобы увидеть полные команды?

5. Нет, я даже не знал, что смогу это сделать.