LINUX.ORG.RU

[Kernel] чтение из /proc

 


0

2

Добрый день, хотел узнать как получить размер данных выдаваемых файлами из /proc ? К примеру мой модуль ядра хочет считать данные из /proc/kallsyms То как определить какой объём данных содержит этот kallsyms ?

Deleted

/proc это интерфейс ядра для userspace, не? В пределах ядра должен быть способ получить внутренние данные менее черезжопно.

anon_666
()

kernel/kallsyms.c:

/*
 * These will be re-linked against their real values
 * during the second link stage.
 */
extern const unsigned long kallsyms_addresses[] __attribute__((weak));
extern const u8 kallsyms_names[] __attribute__((weak));

/*
 * Tell the compiler that the count isn't in the small data section if the arch
 * has one (eg: FRV).
 */
extern const unsigned long kallsyms_num_syms
__attribute__((weak, section(".rodata")));

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

Былоб не плохо... но врятли вы захотите тратить на это своё время. Да и судя по вашему ответу, вам не следует это делать.

Теперь насчёт заданного мной вопроса, повторяюсь.. Как в ядре, считать данные из любого файла, в /proc на примере kallsyms Как получить размер данных, которые будут считаны из /proc/kallsyms

Deleted
()
Ответ на: комментарий от ttnl

struct file_operations { Просмотрено, и не обнаружено то что нужно (

Deleted
()

А какой объем данных содержит /dev/zero?

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

Как в ядре, считать данные из любого файла, в /proc на примере kallsyms

Расскажи какую именно задачу ты пытаешься решить. Просто сейчас ты хочешь странного: выше же сказали, что /proc - это интерфейс для доступа к ядру из пространства пользователя. Из пространства ядра читать оттуда нет смысла, так как в пространстве ядра те же данные доступны и так.

Как получить размер данных, которые будут считаны из /proc/kallsyms

В общем случае - никак. Большая часть (если не всё) содержимого /proc генерируется на лету, соответственно узнать объём данных до непосредственного их чтения невозможно.

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

«В общем случае - никак. Большая часть (если не всё) содержимого /proc генерируется на лету, соответственно узнать объём данных до непосредственного их чтения невозможно. »

А конец считанных данных как определить? как и простые строки? будет оканчиваться на ноль?

«Расскажи какую именно задачу ты пытаешься решить. Просто сейчас ты хочешь странного: выше же сказали, что /proc - это интерфейс для доступа к ядру из пространства пользователя. Из пространства ядра читать оттуда нет смысла, так как в пространстве ядра те же данные доступны и так. » Задача в следующем, я пытаюсь сделать свой модуль - антивирус ( по крайней мере хочу попытаться его сделать ). В данном случае хочу определять размер оригинальных данных выводимых через proc, например интересует /proc/modules . Чтоб сравнивать размеры выводимых данных полученных в ядре и в пространстве пользователя.

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

А конец считанных данных как определить? как и простые строки? будет оканчиваться на ноль?

Я «под ядро» ничего серьёзного не писал, тем более не знаком с работой с файлами из пространства ядра, но уверен на 100%, что конец файла определяется самым обычным способом - по EOF =).

Задача в следующем, я пытаюсь сделать свой модуль - антивирус ( по крайней мере хочу попытаться его сделать ).

Ох...

В данном случае хочу определять размер оригинальных данных выводимых через proc, например интересует /proc/modules . Чтоб сравнивать размеры выводимых данных полученных в ядре и в пространстве пользователя.

Какой в этом смысл?

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

«Какой в этом смысл? »

Чтоб обнаружить модификацию данных, другими словами чтоб обнаружить скрытие запущенных модулей

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

а ты че такой дерзский? :) тебе все говорят, что ты творишь фигню какую-то. прислушайся :)

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

ну как это что следует из первого? Сравниваем размер данных считанный в ядре, с тем что получили в пользовательском пространстве. Если данные не совпали то сравниваем прочитанные строки в ядре и пользовательском пространстве, тем самым определяя какие данные были вырезаны. Или я вообще не прав?

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

ну как это что следует из первого? Сравниваем размер данных считанный в ядре, с тем что получили в пользовательском пространстве. Если данные не совпали то сравниваем прочитанные строки в ядре и пользовательском пространстве, тем самым определяя какие данные были вырезаны. Или я вообще не прав?

Ты вообще не прав. Чтобы твоя затея (сама по себе странноватая, да) сработала, надо как-то гарантировать либо одновременность считывания данных из ядра и из пространства пользователя, либо неизменность этих данных в пространстве ядра в промежутке между чтением в ядре и чтением в пространстве пользователя. Иначе ты рискуешь прочитать разные данные при вполне нормальной работе системы (то есть без всякой подмены).

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

Как насчёт глобальной блокировки ядра? когда ядро заблокировано, считать сначала данные прямиком из /proc .. а затем прочесть теже данные через системный вызов. Разблочить ядро, и производить сравнение. Разве что-то упущено?

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

Как насчёт глобальной блокировки ядра? когда ядро заблокировано, считать сначала данные прямиком из /proc .. а затем прочесть теже данные через системный вызов. Разблочить ядро, и производить сравнение.

Что ты понимаешь под «заблокировать ядро»? Если это вообще некая полная блокировка всей системы, то в этом случае код в пространстве пользователя работать не будет.

Разве что-то упущено?

Упущен здравый смысл.

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

«Что ты понимаешь под „заблокировать ядро“» kernel_lock

«Если это вообще некая полная блокировка всей системы, то в этом случае код в пространстве пользователя работать не будет. » Ну и в чём проблема? тут и не нужно чтоб в пользовательском пространстве выполнялся код.

«Упущен здравый смысл. » Эм... я всё ещё не вижу в своих действиях что-то глупое)...ткните меня носом)

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

kernel_lock

* Владельцы многоядерных систем уже начали придумывать страшные и изощрённые пытки специально для тебя =). *

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

Ты вроде сам хотел читать содержимое из пространства пользователя и сравнивать с тем, что в ядре, или нет?

Эм... я всё ещё не вижу в своих действиях что-то глупое)...ткните меня носом)

Даже не знаю как объяснить... Ты пытаешь решить несуществующую проблему не тем методом, применяемым неправильно.

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

Ок.

Кстати, вопрос насчёт размера вывода файлов /proc ещё открыт. Чтение до нуля (..мне не подходит ((

Deleted
()
Ответ на: комментарий от x905

Я кажется уже нашёл где посмотреть нужный мне размер, однако) не знаю как узнать то что мне нужно через lseek. Если не сложно, то поясните...

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

Кстати, вопрос насчёт размера вывода файлов /proc ещё открыт.

Этот вопрос давно закрыт: содержимое генерируется на лету, так что заранее размер узнать невозможно.

Чтение до нуля (..мне не подходит ((

Читай пока vfs_read (или что ты там собрался использовать) не вернёт 0.

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

Я кажется уже нашёл где посмотреть нужный мне размер, однако)

Ты не то нашёл.

Deleted
()
Ответ на: комментарий от Eddy_Em

Подозреваю то, что нужно находится в struct proc_dir_entry , тока вот, всё никак не могу найти... как получить через struct file , указатель на данную структуру?!?!?!

Deleted
()
Ответ на: комментарий от Deleted
cat /proc/kallsyms |wc -l
71022

cat /proc/kallsyms |wc -c
2612214

Вы уверены, что вам его целиком в память надо помещать? Может, лучше по строке будете считывать?

Eddy_Em ☆☆☆☆☆
()

> /proc/kallsyms

как определить какой объём данных содержит

этот kallsyms



никак.

те, сделать-то это можно, но не просто. kallsyms_names
не хранится в plain-text. если хотите разобраться, см
scripts/kallsyms.c. ну, и kallsym_iter code, понятное дело.

с модулями еще больше проблем.


вот, не могу удержаться ;) в который раз вы задаете
«странный» вопрос. странный потому, что совершенно
не понятно _зачем_.

зачем это нужно???

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

Мне надо обязательно файл целиком читать (для удобства) да и уже давно хотел узнать ответ на заданный мной вопрос.

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

Ну так выделяйте мегабайта три памяти и считывайте туда. Если не хватит - выделяйте еще... Другой вариант - сделать mmap какого-нибудь файла и считывать данные в него.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Deleted

> Просто нужно, для саморазвития))))

это хороший ответ (без иронии).

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

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

«Ну так выделяйте мегабайта три памяти и считывайте туда. Если не хватит - выделяйте еще..»

Да, это простой способ =) но мы не ищем лёгких путей) а пытаемся найти, где-же в системе реально указывается размерчик этих файлов...

Хоть мне и объяснил mironov_ivan , что они генерятся автоматически, но всёже, поискав в инете, наткнулся на пример создания своего...ну вобщем создание файла в /proc

И вот пример участка кода, который оказался интересен

static struct proc_dir_entry *Our_Proc_File; Our_Proc_File = create_proc_entry(PROCFS_NAME, 0644, NULL); Our_Proc_File->size = 37;

Собственно как видем, создают файл в /proc ....ну там ещё указывают всякую ерунду, как функции чтения и записи в этот proc ..но что более важно для меня, указывается размер данных в struct proc_dir_entry По аналогии полагаю, что и в /proc/ВСЕ_ОСТАЛЬНЫЕ_ФАЙЛЫ в структуре struct proc_dir_entry для каждого файла, можно посмотреть размер данных выдаваемых этим файлом. Вот теперь задача номер один, как для файла, получить указатель на struct proc_dir_entry =)....

Deleted
()
Ответ на: комментарий от idle

«тогда надо сидеть, и читать код. чтобы разобраться самому. какой же смысл спрашивать на лоре ? »

Спрашиваю то, с чем не смог разобраться сам (

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

> где-же в системе реально указывается размерчик этих файлов

да нигде же, многие уже сказали об этом.

Our_Proc_File


не знаю, где вы это нашли. но да, вот, например
proc_root_kcore->size = get_kcore_size().

но в общем случае там может быть что угодно.

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

где-же в системе реально указывается размерчик этих файлов...

Конкретно этот файл может выдать вам в разные моменты времени разный объем данных.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Ладно, будем считать что вопрос снят. Буду дальше сам копать.

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