2008-11-08 8 views
18

Я пишу модуль ядра Linux, который должен открывать и читать файлы. Каков наилучший способ добиться этого?Файловый ввод-вывод в модуле ядра Linux

+0

Возможный дубликат [Как для чтения/записи файлов в модуле ядра Linux?] (Http://stackoverflow.com/questions/1184274/how-to-read-write-files-within-a- linux-kernel-module) – 2017-05-03 08:04:15

ответ

30

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

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

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

Эван Теран упоминал о sysfs, что мне кажется хорошей идеей. Если вам действительно нужно делать более сложные пользовательские материалы, вы всегда можете создавать новые ioctrls.

EDIT:

ОК, я нашел статью, которую я искал, это от Linux Journal. Это объясняет, почему делать такие вещи, как правило, плохая идея, а затем продолжает рассказывать вам, как это сделать в любом случае.

+0

Это настраиваемый модуль, он не будет распространен.Мне нужно открыть файл, содержащий отображение inodes => контрольных сумм. – mipadi 2008-11-09 01:02:44

+1

@mipadi: Я нашел статью, о которой я думал, она объясняет, как открыть и прочитать файл из ядра (после части «не делать этого»). Я отредактировал свой пост, чтобы отразить это и содержать ссылку. Удачи. – MBCook 2008-11-09 01:14:10

8

если вы можете получить указатели на 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 показали хотя. Я уверен, что есть лучший способ, но я считаю, что это сработает.

1

Вы также можете найти информацию о sys_call_open в этом Linux Kernel Module Programing Guide.

+0

Да, я взглянул на это. Кстати, я исправляю открытый (2) системный вызов, и мне действительно нужно прочитать файл _inside_ моя исправленная версия. – mipadi 2008-11-09 00:15:26

2

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

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

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

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

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