Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> kernel-mode в Linux для новичка, выполнить копирование в режиме ядра 
:(
    Опции темы
Sandric
Дата 12.10.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 7.12.2007

Репутация: нет
Всего: нет



В университете задали задание выполнить копирование из файла в файл в kernel и user mode. Вообще лабораторная рассчитывалась под win, но я уже начал выполнять под убунтой, и вот что получилось:
Код

#include "fcntl.h"

#include "sys/types.h"

#include "sys/stat.h"


int main(){

    std::cout << "hello world";

    int fd, fdn;

    fd = open("from2copy.txt", O_RDONLY);

    fdn = open("where2copy.txt", O_WRONLY | O_CREAT);

    chmod("where2copy.txt", S_IRWXU);

    std::cout << "\n" << fd;

    const size_t bufSize = 256;

    char chBuf[256];

    int fileSize = read(fd, chBuf, bufSize);

    std::cout << "\n" << chBuf;

    write(fdn, chBuf, fileSize);

}

Она работает, но теперь мне нужно запустить ее в режиме ядра.
Если кто знает как это сделать, пожалуйста отпишитесь.
PM MAIL   Вверх
MAKCim
Дата 12.10.2010, 18:05 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Sandric
Дата 12.10.2010, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 7.12.2007

Репутация: нет
Всего: нет



Цитата(MAKCim @ 12.10.2010,  18:05)
боюсь, с таким уровнем знаний (судя по коду) ядро вы не осилите
значит скорее всего вам в центр помощи нужно обратиться, т. к. за вас тут коди писать не будут

Вообщето я писал kernel-mode код на плюсах около года назад. Это был простой драйвер на курсах по низкоуровневому программированию, но это было под win. В любом случае не думаю, что вы можете что то предполагать относительно того что я смогу осилить, а что не смогу. И если вам кажется что мой код настолько далек от необходимого, думаю уместнее было бы порекоммендовать конкретную литературу или маны. Конечно если вы на 100(!)% уверены что я осилю.
PM MAIL   Вверх
MAKCim
Дата 12.10.2010, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Sandric, 
kernel module


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
xvr
Дата 13.10.2010, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Работа с файлами в kernel под Linux практически невозможна (поправьте меня, если это уже не так).
Под Win - возможна. Так что бегом обратно под Win  smile 
PM MAIL   Вверх
MAKCim
Дата 13.10.2010, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(xvr @  13.10.2010,  09:40 Найти цитируемый пост)
Работа с файлами в kernel под Linux практически невозможна

что значит практически?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Sandric
Дата 13.10.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 7.12.2007

Репутация: нет
Всего: нет



Цитата(MAKCim @ 12.10.2010,  23:09)
Sandric, 
kernel module

Спасибо. Я в свою очередь нашел на английском языке Kernel module linux programming guide. Буду читать.
PM MAIL   Вверх
GrayCardinal
Дата 13.10.2010, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Во-первых в приведенном коде как минимум одна ошибка. Во-вторых. Какое отношение user-space код имеет к kernel-sapce'у 
?


--------------------
PM MAIL WWW   Вверх
svlary
Дата 14.10.2010, 05:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(xvr @  13.10.2010,  09:40 Найти цитируемый пост)
поправьте меня, если это уже не так
  • asmlinkage off_t sys_lseek(unsigned int fd, off_t offset, unsigned int origin)
  • asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)
  • asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)
В файле /usr/src/kernels/linux-2.6.16/fs/read_write.c
PM MAIL   Вверх
xvr
Дата 14.10.2010, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(MAKCim @ 13.10.2010,  10:21)
Цитата(xvr @  13.10.2010,  09:40 Найти цитируемый пост)
Работа с файлами в kernel под Linux практически невозможна

что значит практически?

Я давно не смотрел в ядро, но когда я смотрел туда в последний раз, то таблица файлов (т.е. файловых хэндлов) была принадлежностью описания user space процесса. Т.е. без какого то хелпера (в виде обычного пользовательского процесса) нельзя было использовать никакой handle based файловый ввод вывод (kernel просто не мог открыть файл, т.к. было некуда)
Цитата

В файле /usr/src/kernels/linux-2.6.16/fs/read_write.c
А sys_open там есть?

PM MAIL   Вверх
svlary
Дата 15.10.2010, 05:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(xvr @  14.10.2010,  08:53 Найти цитируемый пост)
А sys_open там есть?

  Эти функции подробно описаны в книге :  Бовет, Д. "Ядро Linux, 3-е изд. "

В частности про функцию sys_open () там пишется  (стр 650):

Опишем работу функции sys_open (). Она выполняет следующие шаги: 
  • 1. Вызывает getname (), чтобы прочитать из адресного пространства процесса 
    путь к файлу. 
  • 2. Вызывает get_unused_fd(), чтобы наЙТИ незанятый СЛОТ В current-> 
    fiies->fd. Соответствующий индекс (дескриптор нового файла) хранится 
    в локальной переменной f d. 
  • 3. Вызывает функцию filpopeno, передавая ей в качестве параметров путь, 
    флаги режима доступа и битовую маску прав доступа. В свою очередь, эта 
    функция выполняет следующие шаги: 
      • копирует флаги режима доступа в namei_f lags, но кодирует флаги ре- 
      режима доступа ordonly, owronly и ordwr специальным образом: нуле- 
      нулевой (самый младший) бит nameifiags устанавливается, только если 
      доступ к файлу требует прав на чтение, а бит с номером 1 устанавлива- 
      устанавливается, только если доступ к файлу требует прав на запись. Обратите 
      внимание, что в системном вызове open () невозможно указать, что дос- 
      доступ к файлу не требует привилегий на чтение или запись. Однако это 
      имеет смысл при анализе пути, содержащем символьные ссылки; 
      • вызывает функцию open namei (), передавая ей в качестве параметров 
      путь, модифицированные флаги режима доступа и адрес локальной 
      структуры nameidata. Эта функция анализирует путь следующим об- 
      образом: 
      D если флаг ocreat не установлен среди флагов режима доступа, 
      функция запускает операцию анализа пути со сброшенным флагом 
      lookup_parent и установленным флагом lookup_open. Кроме того, 
      флаг lookup_follow устанавливается, только если флаг o_nofollow 
      сброшен, а флаг lookupdirectory устанавливается, только если флаг 
      o_directory установлен; 
      D если среди флагов режима доступа флаг ocreat установлен, функ- 
      функция запускает операцию анализа с установленными флагами 
      LOOKUP_PARENT, LOOKUP_OPEN И LOOKUP_CREATE. ЕСЛИ фуНКЦИЯ 
      pathiookup() завершит свое выполнение успешно, обсуждаемая 
      функция проверит, существует ли запрошенный файл. В противном 
      случае она выделит новый дисковый индексный дескриптор, вызвав 
      метод create родительского индексного дескриптора; 
      ( Примечание : Функция opennamei (), помимо прочего, выполняет несколько проверок на 
      безопасность в отношении файла, который определила операция анализа пути. 
      В частности, проверяется, существует ли индексный дескриптор, связанный с 
      найденным объектом "элемент каталога", является ли он обычным файлом, и 
      разрешен ли текущему процессу доступ к этому файлу в соответствии с флага- 
      флагами режима доступа. Кроме того, если файл открывается для записи, функция 
      убеждается, что он не заблокирован другими процессами. )
      • вызывает функцию dentryopen (), передавая ей адреса объекта "эле- 
      "элемент каталога" и объекта, представляющего смонтированную систему, 
      которые были получены в результате анализа пути. Вызванная функция 
      выполняет следующее: 
      D выделяет новый файловый объект; 
      п инициализирует поля f_f lags и fmode файлового объекта в соответ- 
      соответствии с флагами режима доступа, переданными системному вызову 
      open(); 
      п инициализирует поля fdentry и f_vf smnt файлового объекта в соот- 
      соответствии с адресами объекта "элемент каталога" и объекта, пред- 
      представляющего смонтированную файловую систему, переданными в 
      качестве параметров; 
      п записывает в поле fop содержимое поля iop соответствующего 
      объекта "индексный дескриптор". Это действие устанавливает все 
      методы, необходимые для последующих файловых операций; 
      D заносит файловый объект в список открытых файлов, на который 
      указывает поле s_f iles суперблока файловой системы; 
      а если метод open определен среди файловых операций, функция вы- 
      вызывает его; 
      ° вызывает fiierastateinit о для инициализации структур данных 
      опережающего чтения (см. главу 16); 
      D если флаг odirect установлен, функция проверяет, можно ли вы- 
      выполнить операции прямого ввода/вывода на этом файле (см. гла- 
      главу 16); 
      и возвращает адрес файлового объекта; 
      • возвращает адрес файлового объекта.
  • 4. Записывает в current->fiies->fd[fd] адрес файлового объекта, возвра- 
    возвращенный функцией dentryopen (). 
  • 5. Возвращает fd.

PM MAIL   Вверх
xvr
Дата 15.10.2010, 08:46 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Внимательно смотрим на пп 1,2,4 и делаем вывод - эта функция (и весь вышеперечисленный набор) открывает файл в ТЕКУЩЕМ ПОЛЬЗОВАТЕЛЬСКОМ процессе. Т.е. вы откроете файл где то у user level приложения, а не в ядре. Вы сможете общаться с этим файлом и из ядра, но и приложение у пользователя его тоже увидит (и это может ему не понравится). 
Еще у меня есть подозрение, что буфера для обмена с файлом тоже будут у пользовательского приложения (для sys_open это явно написанно в п1)

Вывод - пишите на Win, там функции Nt*File работают одинаково в User Space и в Kernel Space и позволяют работать с файлом с Kernel Level не вываливая его потроха в первый попавшийся User Space процесс  smile 

PS. В Linux insmod не зря читает образ драйвера (kernel модуля) из User Space, а не непосредственно из ядра

PM MAIL   Вверх
Sandric
Дата 2.11.2010, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 7.12.2007

Репутация: нет
Всего: нет



Добрый день.
Спасибо за все советы, но боюсь мне уже будет поздно переделывать все под винду.

У меня новый вопрос - запись чтение в файл используя стандартную библиотеку (fprintf).

Я сделал копирование файла, используя vfs_write/vfs_read:
Код

#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>

#include <linux/module.h>    /* Needed by all modules */
#include <linux/kernel.h>    /* Needed for KERN_INFO */

struct file* file_open(const char* path, int flags, int rights) {
    struct file* filp = NULL;
    mm_segment_t oldfs;
    int err = 0;

    oldfs = get_fs();
    set_fs(get_ds());
    filp = filp_open(path, flags, rights);
    set_fs(oldfs);
    if(IS_ERR(filp)) {
        err = PTR_ERR(filp);
        return NULL;
    }
    return filp;
}


void file_close(struct file* file) {
    filp_close(file, NULL);
}


int file_read(struct file* file, unsigned long long offset, unsigned char* data, unsigned int size) {
    mm_segment_t oldfs;
    int ret;

    oldfs = get_fs();
    set_fs(get_ds());

    ret = vfs_read(file, data, size, &offset);

    set_fs(oldfs);
    return ret;
}


int file_write(struct file* file, unsigned long long offset, unsigned char* data, unsigned int size) {
    mm_segment_t oldfs;
    int ret;

    oldfs = get_fs();
    set_fs(get_ds());

    ret = vfs_write(file, data, size, &offset);

    set_fs(oldfs);
    return ret;
}


int file_sync(struct file* file) {
    file_fsync(file, file->f_dentry);
    return 0;
}


int init_module(void)
{

    const char *file_path = "/home/sandric/from2copy.txt";
    const char *file_path_dest = "/home/sandric/where2copy.txt";
    
    unsigned char data[1024];

    struct file *fd = file_open(file_path, 0, 0);    
    struct file *fd_dest = file_open(file_path_dest, 1, 1);

    int size = file_read(fd, 0, data, 1024);

    file_write(fd_dest, 0, data, size);

    file_close(fd_dest);
    file_close(fd);    

    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world 1.\n");
}


Но теперь мне нужно реализовать чтение/запись используя стандартную библиотеку в пользовательском режиме и режиме ядра.

Есть ли какой то аналог fprintf, или функция, которую использует fprintf при работе с ядром.
Спасибо.
PM MAIL   Вверх
MAKCim
Дата 2.11.2010, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



смотрите <linux/kernel.h>


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
xvr
Дата 2.11.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(Sandric @  2.11.2010,  18:10 Найти цитируемый пост)
Спасибо за все советы, но боюсь мне уже будет поздно переделывать все под винду.

Это не советы, это диагноз   smile 

Цитата(Sandric @  2.11.2010,  18:10 Найти цитируемый пост)
Есть ли какой то аналог fprintf, или функция, которую использует fprintf при работе с ядром.
Есть kprintf, а то, что вам надо это редкое извращение. Очень сомневаюсь, что такое найдется. Пишите свои функции.

man на filp_open порадовал:

Цитата

Description

This is the helper to open a file from kernelspace if you really have to. But in generally you should not do this, so please move along, nothing to see here.. 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.