LINUX.ORG.RU

Опять же про сисколлы


0

0

Доброе время суток.
Возможно вопрос тупой и ламерский, но все же....
Анамнез: нужно из ядерного модуля писать и читать из файла в обычной файловой системе (не /proc).
Надо полагать это можно сделать через таблицу системных вызовов. Вот здесь и возникает косяк, делаю, как написано у господина Померанца, то есть промерно следующее:
.............................................
extern void* sys_call_table[];
int (*open_call)(const char*,int);
..............................................
open_call = sys_call_table[__NR_open];
..............................................
При компиляции все проходит на ура, а вот при попытке загрузки модуля ругается, дескать, unresolved symbol sys_call_table. Помогите советом , плз, в чем проблема.

наверное надо этот симбол(sys_call_table) обьявить всетаки а то как он(loader) тебе его отрезолвит то? :)

lg ★★
()
Ответ на: комментарий от lg

оно конечно понятно :) и логично. Но как? Если его объявить здесь же как void* sys_call_table[] - опять же ругается при загрузке , но уже segmentation fault :))) да оно и понятно :)))) Но как от оного избавиться?
Короче, как мне получить реальную таблицу сисколлов?

SnakePAN
() автор топика
Ответ на: комментарий от lg

так-то оно так. Но дальше-то где она будет заполняться? Либо я гоню, либо одно из двух, но объясни толком.

SnakePAN
() автор топика
Ответ на: комментарий от SnakePAN

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

lg ★★
()
Ответ на: комментарий от lg

Я это себе уяснил.... Но почем он этого не делает? Может что-то с ключами компиляции? Они собссно вот такие: -Wall -DMODULE -D__KERNEL__ -DLINUX

SnakePAN
() автор топика

Вместо sys_open имеет смысл использовать filp_open (ибо нафиг пихать в текущий процесс handle открываемого файла?).

А проще всего посмотреть как ввод-вывод делает к примеру /usr/src/linux/kernel/acct.c и не изобретать паровоз.

Murr ★★
()
Ответ на: комментарий от anonymous

Спасибо за ответы. Однако при использовании sys_open опять же получается ругань, только уже unresolved symbol sys_open. На все остальное(sys_write, sys_close) не ругается. Если же использовать filp_open - ошибки не возникает, но возникает вопрос, как тогда писать/читать файл. для работы sys_write/sys_read необходим unsigned int дескриптор файла, а не struct file. Как из нее выдернуть этот самый дескриптор или есть вообще иные средста, работающие с этой структурой? Определения структуры я почему-то не нашел 8-(

SnakePAN
() автор топика
Ответ на: комментарий от SnakePAN

Я же говорю - посмотри как сделано в /usr/src/linux/kernel/acct.c

они пишут/читают напрямую через file_operations.

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.