#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. Нет, я даже не знал, что смогу это сделать.