Глядя на полный код, который вы разместили сейчас, я не вижу очевидной причины сбоя. То, что вы делаете, сделано в других драйверах.
Просто некоторые наблюдения.
Очень мало проверок ошибок. Это вас укусит, потому что успешное выполнение следующей вещи, как правило, зависит от успешного выполнения предыдущей вещи в качестве предварительного условия.
Кроме того, когда вы дойдете до того, что функция чтения вызывается без сбоев, вы обнаружите, что она ничего не производит, потому что вы возвращаете 0
и не перемещаете смещение! Большинство программ интерпретируют нулевой возврат как конец файла.
Вы должны соблюдать размер переданного буфера, иначе вы испортите пространство пользователя. Программа cat
может не выполнять read(fd, buf, 5);
(обратите внимание, что 5 меньше 10 байт, которые вы копируете в пространство пользователя), но что-то может.
Кстати, copy_to_user
и copy_from_user
- это функции, которые вы также должны проверять на наличие сбоя и возвращать -EFAULT
в пространство пользователя, сообщая вызывающему приложению, что оно прошло в плохой области.
Для устранения сбоя существует два традиционных подхода. Один из них - добавить больше операторов printk. В блоке кода, где нет ветвей, и печать не буферизируется, если один оператор печати производит вывод до сбоя, а другой - нет, сбой находится где-то между ними.
Другой метод - интерпретировать аварийный дамп: регистры машины, байт, окружающий указатель команд, трассировку вызовов и т. Д. Если у вас есть эта информация из аварии, вы обычно можете точно определить, где происходит авария, и, глядя на машину код и значения регистров, вы можете догадаться, что делают переменные C и структуры данных.
Удачи.