Intereting Posts
C Программа преобразования температуры сохраняет вывод 0 Для Фаренгейта до objectiveсия Вызов процедур сборки из исходного кода C Вызов функции C без кронштейна Компиляция кода C (netcat) на собственный исполняемый файл Android Кодирование getline () имплантации – ошибки Valgrind Хорошие примеры с использованием «union» с «enum»? Разбор петли в бизоне Порядок операций для предварительного инкремента и пост-приращения в аргументе функции? Почему переопределение статической глобальной переменной дает ошибку времени компиляции при переопределении глобальной переменной? Сериализовать double и float с C предупреждение: тип возвращаемого значения по умолчанию – ‘int’ Случайные числа в C Распределение памяти структуры, распределение памяти должно быть в несколько раз Что такое «прототипы» в программе C? Связанные списки, операции с параметром

Как получить размер файла в ядре linux?

Я нашел эту ссылку ( http://www.spinics.net/lists/newbies/msg41016.html ) и занимаюсь этим. Поэтому я написал код в модуле ядра:

#include  #include  #include  struct path p; struct kstat ks; kern_path(filepath, 0, &p); vfs_getattr(&p, &ks); printk(KERN_INFO "size: %lld\n", ks.size); 

Что не будет компилироваться, потому что:

 /root/kernelmodule/hello.c:15: warning: passing argument 1 of 'vfs_getattr' from incompatible pointer type include/linux/fs.h:2563: note: expected 'struct vfsmount *' but argument is of type 'struct path *' /root/kernelmodule/hello.c:15: warning: passing argument 2 of 'vfs_getattr' from incompatible pointer type include/linux/fs.h:2563: note: expected 'struct dentry *' but argument is of type 'struct kstat *' /root/kernelmodule/hello.c:15: error: too few arguments to function 'vfs_getattr' 

Поэтому я действительно смущен, так как я смотрел эту документацию: http://lxr.free-electrons.com/source/fs/stat.c#L40

И теперь я вижу внутри /linux/fs.h, что прототип для vfs_getattr:

 extern int vfs_getattr(struct vfsmount *, struct dentry *, struct kstat *); 

Может ли кто-нибудь помочь мне с моей реализацией? Я читаю в vfsmount и dentry, но все равно теряюсь.

Вызов этой функции изменяется в зависимости от используемой версии ядра. Две версии аргументов были введены где-то между 3.8 и 3.9. Поэтому, если вы используете kernel ​​3.8 или раньше, вам нужны «три аргумента» и 3.9, вам нужны два аргумента.

Если вы действительно хотите сделать это в режиме ядра, в более старом ядре, чем 3,9, вам может быть лучше использовать vfs_fstat или vfs_stat

Однако обращение к файлам внутри ядра неодобрительно, и вы можете подумать, нет ли альтернативы BETTER – например, если вы хотите загрузить некоторые файлы в память платы, которая находится в вашей системе , вы можете загрузить файл в режиме пользовательского режима, а затем передать загруженные части в kernel ​​с помощью некоторой частной функции типа IOCTL. Это гораздо более «дружественный к ядру», и если вы планируете когда-либо пытаться получить ваш драйвер / модуль, включенный в общий исходный код ядра, вам, вероятно, НЕОБХОДИМО это сделать.