Загрузка модуля ядра вызывает ошибку
Я новичок в разработке модулей ядра и решил написать свой первый модуль ядра сегодня.
мой модуль должен получить 2 числа в качестве входных данных, разделенных пробелами, и эти числа сложены вместе.
модуль ядра обменивается данными через запись proc с именем calc (/proc/calc), поэтому чтение из файла будет возвращать выходные данные, а запись в этот файл будет давать новый ввод (2 числа разделены пробелом)
при загрузке модуля (insmod) моя оболочка застревает, при ее прерывании и просмотре dmesg я вижу строку BUG ядра, вот трассировка.
я не уверен, является ли это ошибкой в моем коде, или это настоящая ошибка в ядре linux, и хотел бы понять, что я сделал неправильно, и как я могу начать отладку моего модуля с данным журналом dmesg.
Вот исходный код моего модуля.
мой make-файл очень стандартный,
obj-m += calc.o
KDIR := /lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
Большое спасибо заранее!
РЕДАКТИРОВАТЬ: я использую Ubuntu 16.04.02, выпуск 4.10.0-28, вполне стандартная.
2 ответа
Проблема в утверждении last_message = ""; неправильно.. Вы назначаете неверный адрес памяти указателю last_message. Вот почему ООП идет. last_message должно быть изменено следующим образом
static void reset_calc(void) {
last_message_size = 0;
last_message = "";
last_message_type = WAS_LAST_READ; // we expect the first action to be write
}
следует изменить на
memset(last_message,0,MAX_MESSAGE_SIZE);
Вы создали файл устройства?
root@xyz-PC:~/s_flow/dd# ls -l /dev/my_device
если нет, то сначала создайте файл устройства с помощью команды ниже
root@achal:~/dd/char1# mknod /dev/my_device c 300 0
в моей системе (Ubuntu 14.04) все хорошо, как показано ниже.
root@xyz:~/s_flow/dd# dmesg
[ 519.751941] calc: module verification failed: signature and/or required key missing - tainting kernel
[ 519.752368] Calculator initializing
[ 519.752372] Initializing proc entry at /proc/calc
[ 519.752380] initialized calc proc entry
[ 519.752384] mallocing last_message for 128 bytes
[ 519.752386] malloc finished, resetting calc
[ 519.752389] calc reset, all good :
Можете ли вы дать подробную информацию о программе, которая использует этот модуль?