Я надеюсь, что кто-нибудь сможет проверить мои предположения на вопрос «Можно ли назвать lstat и/или stat из ядра Linux 3.10.0 в Centos 7. Я искал и читал столько, сколько мог найти, и только Я могу запутаться Я не могу сказать, доступны ли примеры, которые я нахожу, только для пространства ядра или пространства пользователя.
Основной вопрос: могу ли я вызвать lstat или stat из ядра?
В частности, я добавляю это в exec.c в каталоге fs.
Цель состоит в том, чтобы различать файлы, которые являются либо символическими, либо жесткими ссылками и предназначены только для обучения.
Если это правда, буду ли я вызывать lstat/stat или версию "64" - я использую архитектуру X86, если это имеет значение.
Добавлено 18.11.2015 Согласно комментарию ниже
// These two lines are in the original exec.c file
struct file *file;
file = do_filp_open(AT_FDCWD, &tmp, &open_exec_flags, LOOKUP_FOLLOW);
// In the open_exec function I added the following
struct stat buf;
int lstat(struct file, struct stat buf);
mm_segment_t security_old_fs;
security_old_fs = get_fs();
set_fs(KERNEL_DS);
if (lstat(*file, buf) == -)
printk(KERN_INFO "stat error\n");
goto exit;
}
set_fs(security_old_fs);
Затем запустите «сделать» и посмотрите
LINK vmlinux
LD vmlinux.o
MODPOST vmlinux.o
GEN .version
CHK include/generated/compile.h
UPD include/generated/compile.h
CC init/version.o
D init/built-in.o
fs/built-in.o: In function`open_exec':
/home/user/rpmbuild/SOURCES/linux-3.10.0-123.20.1.el7/fs/exec.c:946: undefined reference to `lstat'
make: *** [vmlinux] Error 1
Любые указатели будут полезны.
stat
системный вызов определяется какSYSCALL_DEFINE2(stat,...)
вfs/stat.c
. lstat определен под ним. Как видите, реализация этих системных вызовов используетvfs_stat
/vfs_lstat
. Для использования этих функций внутри пространства ядра вам нужно, чтобы аргумент пути интерпретировался как принадлежащий пространству пользователя. Например, используяset_fs
/get_fs
. - person Tsyvarev   schedule 24.10.2015