LINUX.ORG.RU

Использование системных вызовов в режиме ядра

 


0

2

Можно ли находясь в режиме ядра использовать системный вызов? Есть например в файле /usr/src/linux-headers<версия>/include/linux/syscalls.h

asmlinkage long sys_open(const char __user *filename,
                                int flags, int mode);
Только вот это просто объявление функции, самой функции нет. Что делать, как мне использовать какой-нибудь open?

★★★
Ответ на: комментарий от tailgunner

Прочитал, появились другие вопросы. Зачем использовать макроопределение SYSCALL_DEFINE2 ? Во-вторых, как воспользоваться d_path из dcache.c (ну или __d_path как в sys_getcwd). Что такое export мне ни гугл, ни man не рассказали.

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

Зачем использовать макроопределение SYSCALL_DEFINE2

Зачем нужно макроопределение «ОПРЕДЕЛИТЬ_СИСКОЛЛ2»?

как воспользоваться d_path из dcache.c (ну или __d_path как в sys_getcwd). Что такое export мне ни гугл, ни man не рассказали.

Начинает тускло брезжить свет понимания... ты в каком объеме Си знаешь?

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

Слушай, прекращай уже, я тебе весь код уже выложил, ты сам даже не можешь нужные инклюдники найти? Может лучше тебе на LISP переключиться или, там, на Хаскель?

#include <linux/path.h>

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

SYSCALL_DEFINE2: Имеется ввиду, почему просто не написали char * sys_getcwd(), это ж было сделано с какой-то целью?
<linux/path.h> у меня давно подключен. У меня он выглядит вот так, за d_path туда ходить бестолку. Я глянул мельком в d_path, обнаружил там вот такое

 return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
Вроде бы все просто, но на вот такой вот код
        struct path pwd;
	pwd = (struct path)fs->pwd;
	path_get(pwd);
	pwd.dentry->d_op->d_dname(path->dentry, path, 200);
мне компилятор заявил, что pwd ни на структуру, ни на union не похож, и соответственно полей иметь не может. (path.h подключен,dcache.h тоже)

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

SYSCALL_DEFINE2: Имеется ввиду, почему просто не написали char * sys_getcwd(), это ж было сделано с какой-то целью?

Да, конечно. Эта функция вызывается как сисколл с двумя аргументами. Если интересно - посмотри, во что разворачивается макрос.

мне компилятор заявил, что pwd ни на структуру, ни на union не похож

Найди файл, который содержит определение struct path, и включи его. Это Си 101.

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

нет, меня огорчает полная беспомощность вообще и отсутствие навыков гугления в частности и хэлп-вампиризм в том числе

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

Как это с двумя? (path*, char*, int не?)Посмотрел в syscalls.h, в общих чертах ясно как это превратится в sys_getswd. Только вот зачем так сделано - все равно в тумане.

struct path {
        struct vfsmount *mnt;
        struct dentry *dentry;
};
- вот это написано в linux/path.h, который у меня подключен давным давно. Интересное наблюдение:
struct path pwd;
	pwd = (struct path)fs->pwd;
	path_get(&pwd);
	struct dentry *den = pwd.dentry;
	pwd.dentry->d_op->d_dname(path->dentry, path, 200);
На последнюю строчку ругается, а на предпоследнюю - нет.

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

Как это с двумя? (path*, char*, int не?)

Не.

Только вот зачем так сделано - все равно в тумане.

Потому что VFS в Linux устроена гораздо сложнее, чем ты думаешь.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Круто. А почему поля структуры то читаются, то не читаются?

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

Извиняюсь за все глупые вопросы. Но метод, в этом его виде, неработоспособен, ядро падает и не у одного меня.

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

Но метод, в этом его виде, неработоспособен

Какой метод? В каком виде? Уронить ядро, не зная Си - как два байта переслать.

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

Окей, тема решена. Последний вопрос, что такое export? Я даже не понял к чему вообще это относиться.

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