| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > kernel-mode в Linux для новичка |
| Автор: Sandric 12.10.2010, 17:34 | ||
В университете задали задание выполнить копирование из файла в файл в kernel и user mode. Вообще лабораторная рассчитывалась под win, но я уже начал выполнять под убунтой, и вот что получилось:
Она работает, но теперь мне нужно запустить ее в режиме ядра. Если кто знает как это сделать, пожалуйста отпишитесь. |
| Автор: MAKCim 12.10.2010, 18:05 |
| боюсь, с таким уровнем знаний (судя по коду) ядро вы не осилите значит скорее всего вам в центр помощи нужно обратиться, т. к. за вас тут коди писать не будут |
| Автор: Sandric 12.10.2010, 22:24 | ||
Вообщето я писал kernel-mode код на плюсах около года назад. Это был простой драйвер на курсах по низкоуровневому программированию, но это было под win. В любом случае не думаю, что вы можете что то предполагать относительно того что я смогу осилить, а что не смогу. И если вам кажется что мой код настолько далек от необходимого, думаю уместнее было бы порекоммендовать конкретную литературу или маны. Конечно если вы на 100(!)% уверены что я осилю. |
| Автор: MAKCim 12.10.2010, 23:09 |
| Sandric, http://docs.google.com/viewer?a=v&q=cache:5-XYK8a1q8QJ:linuxkernel.ru/store/knm.pdf+%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5%D0%B9+%D1%8F%D0%B4%D1%80%D0%B0+linux&hl=be&gl=by&pid=bl&srcid=ADGEESirXgdDTYmLjSQULrsR8QhJh96fQkMalTYZrvVFFEITJkLucVbpGn4wuEdbRhGkxScTYSekMJrHF85BpH1Y7IeDCqnCZXvQGKytiTPq0e-VsrNk8KCddMTT2VOB4E3C7VtRLhLg&sig=AHIEtbTL_AB8Mh9AV-xtDKSJOYkjvME4wA |
| Автор: xvr 13.10.2010, 09:40 |
| Работа с файлами в kernel под Linux практически невозможна (поправьте меня, если это уже не так). Под Win - возможна. Так что бегом обратно под Win |
| Автор: MAKCim 13.10.2010, 10:21 |
что значит практически? |
| Автор: Sandric 13.10.2010, 13:13 | ||
Спасибо. Я в свою очередь нашел на английском языке http://www.tldp.org/LDP/lkmpg/2.6/html/index.html. Буду читать. |
| Автор: GrayCardinal 13.10.2010, 13:18 |
| Во-первых в приведенном коде как минимум одна ошибка. Во-вторых. Какое отношение user-space код имеет к kernel-sapce'у ? |
| Автор: svlary 14.10.2010, 05:15 |
|
| Автор: xvr 14.10.2010, 08:53 | ||||
Я давно не смотрел в ядро, но когда я смотрел туда в последний раз, то таблица файлов (т.е. файловых хэндлов) была принадлежностью описания user space процесса. Т.е. без какого то хелпера (в виде обычного пользовательского процесса) нельзя было использовать никакой handle based файловый ввод вывод (kernel просто не мог открыть файл, т.к. было некуда)
|
| Автор: svlary 15.10.2010, 05:43 |
Эти функции подробно описаны в книге : Бовет, Д. "Ядро Linux, 3-е изд. " В частности про функцию sys_open () там пишется (стр 650): Опишем работу функции sys_open (). Она выполняет следующие шаги:
возвращенный функцией dentryopen (). |
| Автор: xvr 15.10.2010, 08:46 |
| Внимательно смотрим на пп 1,2,4 и делаем вывод - эта функция (и весь вышеперечисленный набор) открывает файл в ТЕКУЩЕМ ПОЛЬЗОВАТЕЛЬСКОМ процессе. Т.е. вы откроете файл где то у user level приложения, а не в ядре. Вы сможете общаться с этим файлом и из ядра, но и приложение у пользователя его тоже увидит (и это может ему не понравится). Еще у меня есть подозрение, что буфера для обмена с файлом тоже будут у пользовательского приложения (для sys_open это явно написанно в п1) Вывод - пишите на Win, там функции Nt*File работают одинаково в User Space и в Kernel Space и позволяют работать с файлом с Kernel Level не вываливая его потроха в первый попавшийся User Space процесс PS. В Linux insmod не зря читает образ драйвера (kernel модуля) из User Space, а не непосредственно из ядра |
| Автор: Sandric 2.11.2010, 18:10 | ||
| Добрый день. Спасибо за все советы, но боюсь мне уже будет поздно переделывать все под винду. У меня новый вопрос - запись чтение в файл используя стандартную библиотеку (fprintf). Я сделал копирование файла, используя vfs_write/vfs_read:
Но теперь мне нужно реализовать чтение/запись используя стандартную библиотеку в пользовательском режиме и режиме ядра. Есть ли какой то аналог fprintf, или функция, которую использует fprintf при работе с ядром. Спасибо. |
| Автор: MAKCim 2.11.2010, 19:17 |
| смотрите <linux/kernel.h> |