драйвер устройства linux и insmod

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include "test.h"

MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void) {
     printk("DRIVER LOADED\n");
     printk("DRIVER INIT\n");
     printk("result : %d",add(12,234));
     return 0;
}
static void hello_exit(void) {
     printk("DRIVER REMOVED\n");
}

module_init(hello_init);
module_exit(hello_exit);

здесь вывод функции добавления не печатается с помощью printk, когда выдает insmod Я новый ldd lerner, plz может ли кто-нибудь помочь мне понять, почему это происходит?

мой test.c, содержащий следующее тело функции

int add(int a , int b){

    return a+b;
}

и Makefile выглядит следующим образом

obj-m = initial.o
all:
            make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
            make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean

и мой вывод показывает:

Aug 16 11:15:44 beaglebone kernel: [13616.191741] DRIVER LOADED
Aug 16 11:15:44 beaglebone kernel: [13616.191758] DRIVER INIT
Aug 16 11:15:47 beaglebone kernel: [13616.191784] result : 246
Aug 16 11:15:47 beaglebone kernel: [13619.465555] DRIVER REMOVED

person Desarrollador Rucha    schedule 16.08.2018    source источник
comment
Не понимаю тебя. Не могли бы вы перефразировать свои предложения? Что случилось? Что выдаете? Вывод dmesg выглядит нормально, ваша функция добавила 12 к 236 и распечатала это. Есть ли причина, по которой ваш заголовочный файл test.h содержит определение функции, а не только объявление функции?   -  person KamilCuk    schedule 16.08.2018
comment
Функция добавления приводит к 246, это нормально, но она выполняется, когда я выдал команду rmmod, а не когда я вставляю insmod. Поскольку я написал эту функцию в функции module_init, она должна выполняться во время вставки с использованием insmod, не так ли? @КамилКук   -  person Desarrollador Rucha    schedule 16.08.2018
comment
временные метки из файла /var/log/messages?   -  person P.W    schedule 16.08.2018
comment
Возможный дубликат Почему printk не печатает сообщение в журнале ядра (dmesg)   -  person Tsyvarev    schedule 29.08.2018
comment
Как отмечено в указанном вопросе, вы забыли добавить новую строку (\n) в конец печатной строки. Из-за этого напечатанное сообщение появляется в журнале с задержкой.   -  person Tsyvarev    schedule 29.08.2018


Ответы (1)


Вывод printk появляется после очистки строки. Поскольку вам не хватает \n в конце printk, сгенерированная строка будет напечатана при следующем сбросе, который произойдет, когда вы удалите модуль ядра. так что printk("result : %d\n",add(12,234)); должно работать.

person jklmnn    schedule 16.08.2018
comment
спасибо @jklmnn. Я просто забыл положить эту мелочь. теперь работает!! - person Desarrollador Rucha; 16.08.2018
comment
Стоит обратить внимание на ключ к этой буферизации - отметка времени ядра намного раньше, чем отметка времени системного журнала для этой строки. - person Toby Speight; 16.08.2018