Файловый ввод-вывод в модуле ядра Linux

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

19
задан skaffman 25 March 2011 в 08:31
поделиться

5 ответов

Я могу спросить, почему Вы пытаетесь открыть файл?

мне нравится следовать за разработкой Linux (из любопытства, я не разработчик ядра, я делаю Java), и я видел обсуждение этого вопроса прежде. Я смог найти сообщение LKML об этом, в основном упомянув, что это обычно - плохая идея. Я почти положителен, что LWN покрыл его в прошлом году, но я испытываю затруднения при нахождении статьи.

, Если это - частный модуль (как для некоторого специального оборудования и модуля не будет распределен) затем можно сделать это, но у меня создается впечатление, что, если Вы собираетесь отправить свой код магистрали затем, это не может быть принято.

Evan Teran упомянул sysfs, который походит на хорошую идею мне. Если действительно необходимо сделать более твердый пользовательский материал, Вы могли бы всегда делать новый ioctrls.

РЕДАКТИРОВАНИЕ:

хорошо, я нашел статью, которую я искал, это от Журнал Linux. Это объясняет, почему выполнение этого вида материала обычно является плохой идеей, затем продолжает говорить Вам точно, как сделать это так или иначе.

31
ответ дан 30 November 2019 в 02:56
поделиться

Можно также найти некоторую информацию о sys_call_open в этом Руководство по Программированию Модуля Ядра Linux .

1
ответ дан 30 November 2019 в 02:56
поделиться

файловая система/proc также хороша для личного пользования, и это легко.
http://www.linuxtopia.org/online_books/Linux_Kernel_Module_Programming_Guide/x773.html

1
ответ дан 30 November 2019 в 02:56
поделиться

принятие Вас может получить указатели на relavent указатели функции к open / read / close системные вызовы, можно сделать что-то вроде этого:

mm_segment_t fs = get_fs();
set_fs(KERNEL_DS);

fd = (*syscall_open)(file, flags, mode);
if(fd != -1) {
    (*syscall_read)(fd, buf, size);
    (*syscall_close)(fd);
}
set_fs(fs);

необходимо будет создать" syscall_*" указатели функции, которые я показал все же. Я уверен, что существует лучший путь, но я полагаю, что это работало бы.

9
ответ дан 30 November 2019 в 02:56
поделиться

Вообще говоря, если Вам нужно в файлы чтения-записи от модуля ядра, Вы делаете что-то не так архитектурно.

Там существуют механизмы (netlink, например - или просто зарегистрируйте устройство посимвольного ввода-вывода) позволить модулю ядра говорить с процессом помощника пространства пользователя. Тот процесс помощника пространства пользователя может сделать то, что он хочет.

Вы могли также реализовать системный вызов (или такой как) для взятия дескриптора файла, открытого в пространстве пользователя и чтении-записи это от ядра.

Это, вероятно, было бы более опрятно, чем попытка открыть файлы в пространстве ядра.

существуют некоторые другие вещи, которые уже открывают файлы от пространства ядра, Вы могли посмотреть на них (драйвер цикла приходит на ум?).

2
ответ дан 30 November 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: