Модуль ядра Linux: сообщение printk не там, где я ожидаю быть в журнале буфера

Этот вопрос относится к лабораторному / домашнему заданию. Нас просят узнать, как загрузить и удалить модуль ядра, а затем изменить код C в предоставленном модуле ядра. Мы должны определить структуру, которая содержит некоторые элементы для вставки в связанный список. Затем мы должны напечатать некоторые сообщения, используя данные из связанного списка, через printk().

Вот мой код:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/list.h>
#include <linux/types.h>


/*Defines a struct containing the elements that are to be
inserted in the linked list*/
struct birthday{
    int day;
    int month;
    int year;
    struct list_head list;
};

/*Declares a list_head object */
static LIST_HEAD(birthday_list);

/* This function is called when the module is loaded. */
int simple_init(void) { 
    /* Create and initialize instances of struct birthday*/
    struct birthday *person, *ptr;
    int count;

    printk(KERN_INFO "Loading Module\n");

    /* This loop populates the linked list with 5 nodes,
     * each with different birthday data*/
    for (count = 0; count < 5  ; count++){
        person = kmalloc(sizeof(*person), GFP_KERNEL);
        person -> day = count + 2;
        person -> month = 11 - (count + 2);
        person -> year = 1985 + ((count + 1) * 3);
        INIT_LIST_HEAD(&person -> list);
        list_add_tail(&person -> list, &birthday_list);
    }

    /*Traverse the list*/
    list_for_each_entry(ptr, &birthday_list, list) {
        printk(KERN_INFO "Birthday: Month %d Day %d Year %d\n", ptr -> month, ptr -> day, ptr -> year);
    }
    return 0;
}

/* This function is called when the module is removed. */
void simple_exit(void) {
    struct birthday *ptr, *next;

    printk(KERN_INFO "Removing Module\n");  

    list_for_each_entry_safe(ptr, next, &birthday_list, list){
        printk(KERN_INFO "Removing %d %d %d", ptr->month,     ptr->day, ptr->year);
        list_del(&ptr -> list);
        kfree(ptr);
    }
}

/* Macros for registering module entry and exit points. */
module_init( simple_init );
module_exit( simple_exit );


MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple Module");
MODULE_AUTHOR("SGG");

Я могу скомпилировать код без ошибок, и он, кажется, загружается и удаляется просто отлично. Моя проблема с печатными заявлениями. Когда я загружаю модуль и проверяю буфер журнала с помощью dmesg, я вижу все 5 сообщений (по одному для каждого узла в связанном списке). Когда я удаляю модуль и проверяю буфер журнала, я вижу только 4 сообщения. Сообщение, связанное с 5-м узлом в связанном списке, не печатается в это время. Если я затем снова загружаю модуль, а затем проверяю буфер журнала, самое первое сообщение будет тем, которое должно было быть в журнале, когда я удалил модуль.

У меня была эта проблема только когда у меня 5 узлов. Если я изменю свой цикл, чтобы создать 10 узлов, все сообщения будут напечатаны, как я ожидал. То же самое верно для 6 узлов или 4 узлов. Но каждый раз, когда я создаю 5 узлов, я сталкиваюсь с этой проблемой.

Вот мой вывод: Скриншот моего вывода из командной строки

Все редактирование и операции для этого назначения были выполнены в Oracle VM VirtualBox, работающем в Windows 10. Ядро Linux и модуль ядра, который я изменяю, предоставляются как часть материалов курса и учебника.

Любая помощь очень ценится!

1 ответ

Решение

Это потому, что вы пропустили '\n' в конце вашего printk.

Другие вопросы по тегам