Я пишу модуль ядра Linux, который должен открывать и читать файлы. Каков наилучший способ добиться этого?Файловый ввод-вывод в модуле ядра Linux
ответ
Могу ли я спросить, почему вы пытаетесь открыть файл?
Мне нравится следить за развитием Linux (из любопытства, я не разработчик ядра, я занимаюсь Java), и я уже обсуждал этот вопрос. Я смог найти об этом LKML message, в основном говоря, что это обычно плохая идея. Я почти уверен, что LWN покрыл его в прошлом году, но мне трудно найти статью.
Если это частный модуль (например, для некоторых пользовательских аппаратных средств и модуль не будет распространен), вы можете сделать это, но у меня создается впечатление, что если вы собираетесь отправить свой код на магистраль то это не может быть принято.
Эван Теран упоминал о sysfs, что мне кажется хорошей идеей. Если вам действительно нужно делать более сложные пользовательские материалы, вы всегда можете создавать новые ioctrls.
EDIT:
ОК, я нашел статью, которую я искал, это от Linux Journal. Это объясняет, почему делать такие вещи, как правило, плохая идея, а затем продолжает рассказывать вам, как это сделать в любом случае.
Это настраиваемый модуль, он не будет распространен.Мне нужно открыть файл, содержащий отображение inodes => контрольных сумм. – mipadi 2008-11-09 01:02:44
@mipadi: Я нашел статью, о которой я думал, она объясняет, как открыть и прочитать файл из ядра (после части «не делать этого»). Я отредактировал свой пост, чтобы отразить это и содержать ссылку. Удачи. – MBCook 2008-11-09 01:14:10
если вы можете получить указатели на 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_*
» указатели на функции I показали хотя. Я уверен, что есть лучший способ, но я считаю, что это сработает.
Вы также можете найти информацию о sys_call_open в этом Linux Kernel Module Programing Guide.
Да, я взглянул на это. Кстати, я исправляю открытый (2) системный вызов, и мне действительно нужно прочитать файл _inside_ моя исправленная версия. – mipadi 2008-11-09 00:15:26
Вообще говоря, если вам нужно читать/записывать файлы из модуля ядра, вы делаете что-то неправильно архитектурно.
Существуют механизмы (например, netlink или просто зарегистрировать устройство символов), чтобы позволить модулю ядра разговаривать с вспомогательным процессом в пользовательском пространстве. Этот вспомогательный процесс пользовательского пространства может делать все, что он хочет.
Вы также можете реализовать системный вызов (или такой), чтобы взять файловый дескриптор, открытый в пользовательском пространстве, и прочитать/записать его из ядра.
Это, вероятно, будет более аккуратным, чем попытка открыть файлы в пространстве ядра.
Есть еще некоторые вещи, которые уже открывают файлы из пространства ядра, вы можете посмотреть на них (на что обращает внимание драйвер цикла?).
/proc файловая система также хороша для частного использования, и это легко.
http://www.linuxtopia.org/online_books/Linux_Kernel_Module_Programming_Guide/x773.html
Возможный дубликат [Как для чтения/записи файлов в модуле ядра Linux?] (Http://stackoverflow.com/questions/1184274/how-to-read-write-files-within-a- linux-kernel-module) – 2017-05-03 08:04:15