несколько важных вещей отметить:
сначала различия между API только относятся к коду стороны хоста. Ядра являются точно тем же. на стороне хоста сложность API драйвера довольно тривиальна, принципиальные различия:
в API драйвера у Вас есть доступ к функциональности, которая не доступна в API во время выполнения как контексты.
эмулятор только работает с кодом, написанным для API во время выполнения.
, о, и в настоящее время cudpp то, которое является очень удобной библиотекой только, работает с API во время выполнения.
Системные вызовы не являются экспортируемыми символами. Вам нужно немного взломать, если вы этого хотите.
вы хотите прикоснуться к sys_call_table
. Он содержит указатель на каждый системный вызов.
Посмотрите на arch / x86 / kernel / syscall_table_32.S
или arch / i386 / kernel / entry.S
в старых ядрах.
Вы можете grep sys_call_table / usr / src / linux / System.map
(или / proc / kallsyms
, если символы экспортируются), чтобы найти базовый адрес этой таблицы.
Вы можете использовать этот адрес в качестве параметра для вашего модуля (потребуется преобразование шестнадцатеричной строки в указатель).
Вы сможете вызвать правильный системный вызов со смещением, определенным в arch / x86 / include /asm/unistd_32.h
(или include / asm-i386 / unistd.h
в старых ядрах).
Вы получите что-то вроде: #define __NR_chmod 15
Полезны макросы:
#define DO_SYSCALL_2(sc, t1, a1, t2, a2) \
(((asmlinkage long (*)(t1, t2)) sys_call_table[__NR_##sc]) (a1, a2));
#define USER_SYSCALL_2(sc, t1, a1, t2, a2) \
static inline asmlinkage long syscall_##sc(t1 a1, t2 a2) \
{ return DO_SYSCALL_2(sc, t1, a1, t2, a2) }
USER_SYSCALL_2(chmod, const char __user *, filename, mode_t, mode);
int my_code(void) { return syscall_chmod(arg1, arg2); }
Кроме того, если вы передаете буфер ядра (например, для имени файла), который должен быть пользовательским буфером, не забудьте изменить сегмент данных:
mm_segment_t oldfs = get_fs(); set_fs(KERNEL_DS);
ret = syscall_XXX(...);
set_fs(oldfd);
Добро пожаловать в stackoverflow! Вы хотите IIRC sys_chmod ()
Из списка рассылки ядра Linux
в четверг, 20 февраля 2003 г., 11:10: 27PM +0100, Андреа Арканджели написал: В четверг, 20 февраля 2003 г., в 12:40:43 -0500 Джефф Гарзик написал:
В четверг, 20 февраля 2003 г., в 23:04:37 +0530, Прасад написал:
Есть ли способ использовать который я мог бы вызвать системный вызов в ядре пространство? Системный вызов должен выполняться замаскированным под другой процесс. Фактический
вызов sys_whatever (). Взгляните на код ядра для примеров.
Ядро уже делает это в разные места. sys_read, sys_write, open_filp, sys_close и другие функции безопасно вызывать из ядра код - хотя это не рекомендуется. init / do_mounts.c - особенно раздражающий случай, и это большая причина, почему klibc необходимо объединить. системные вызовы должно быть сделано из пользовательского пространства, а не из kernel.
Люди начинают беспокоиться, так как это не то, что вы можете делать в ядре (если вы не используете, вы знаете, что делаете). Если вы просто хотите изменить права доступа для определенного события, сделайте это из пользовательского пространства с помощью inotify или аналогичного.
Отказ от ответственности:
Вот код, который я нашел в другом модуле ядра, который использует sys_ * calls:
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/delay.h>
#include <linux/string.h>
#include <linux/syscalls.h>
/* Snip */
int openflags = O_WRONLY|O_CREAT;
if (ml != 1)
openflags |= O_TRUNC;
wfd = sys_open(collected, openflags, mode);
if (wfd >= 0) {
sys_fchown(wfd, uid, gid);
sys_fchmod(wfd, mode);
state = CopyFile;
}
Также найдено:
asmlinkage long sys_rename(const char __user *oldname, const char __user *newname);
asmlinkage long sys_chmod(const char __user *filename, mode_t mode);
asmlinkage long sys_fchmod(unsigned int fd, mode_t mode);
в include / linux / syscalls.h
Имейте в виду, что я давно не занимался какими-либо вещами для ядра. Проверьте , что это подходящий интерфейс для chmod, и что вы не сокращаете никакие другие вызовы, которые могут, например, реализовывать перехватчики безопасности.
Также, Эта ссылка содержит информацию о системных вызовах и их символы. Также Здесь - это краткий справочник системных вызовов API пользовательского пространства и их реализации в ядре.