чтение-запись данных ядра через /proc

Вопросы программного кода и архитектуры Linux

Модератор: Olej

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: чтение-запись данных ядра через /proc

Непрочитанное сообщение bose » 13 мар 2012, 17:12

Olej писал(а): Зачем в прототипе описывать char** чтоб его всегда преобразовывать в unsigned long?
Стоп, я кажется понял в чём непонятность у вас. Не забывайте что этот код из функции которая вызывает нашу функцию (которую мы реализовали). Там start объявлен по-другому:

Код: Выделить всё

char	*start;
и далее в этой функции

Код: Выделить всё

n = dp->read_proc(page, &start, *ppos,  count, &eof, dp->data);
Может в этом непонятность была?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: чтение-запись данных ядра через /proc

Непрочитанное сообщение Olej » 13 мар 2012, 17:30

bose писал(а):
Есть определённая логика изменения параметра (т.е. можно предсказать на сколько он увеличиться в следующий раз). Она может менятся в зависимости от....
и потом в коде так и написано:
Вот я и пытаюсь для себя сложить эту логику, для всех возможных случаев данных... Понять их логику.

Плюс написать систему тестов + примеров, чтобы: а). корректность этой модели можно было проверить, б). чтобы нарисовать конкретные примеры для использования, чтоб потом каждый раз всё не разгребать по-новой ... забывается.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: чтение-запись данных ядра через /proc

Непрочитанное сообщение Olej » 13 мар 2012, 17:31

bose писал(а): Стоп, я кажется понял в чём непонятность у вас. Не забывайте что этот код из функции которая вызывает нашу функцию (которую мы реализовали). Там start объявлен по-другому:

Код: Выделить всё

char	*start;
и далее в этой функции

Код: Выделить всё

n = dp->read_proc(page, &start, *ppos,  count, &eof, dp->data);
Может в этом непонятность была?
Да, где-то примерно в этой области...

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: чтение-запись данных ядра через /proc

Непрочитанное сообщение bose » 13 мар 2012, 17:47

Olej писал(а): Вот я и пытаюсь для себя сложить эту логику, для всех возможных случаев данных... Понять их логику.

Плюс написать систему тестов + примеров, чтобы: а). корректность этой модели можно было проверить, б). чтобы нарисовать конкретные примеры для использования, чтоб потом каждый раз всё не разгребать по-новой ... забывается.
Олег, так вы ведь правильно говорили - что механизм этот устаревший (да и вообще сам /proc изживается). Во Фре он уже деприкейтед (http://www.freebsd.org/doc/en/articles/ ... rocfs.html)
Under FreeBSD you should use sysctl(8) to view this and other system settings, as procfs(5) has been deprecated in current versions of FreeBSD.
.....
There are occasions where procfs is required, such as running older software, using truss(1) to trace system calls, and Linux Binary Compatibility
Думаю и в самом линуксе он нужен из-за вопросов совместимости. Не думаю что вам следует так детально его расписывать. Хотя упоминуть три различных варианта использования мех-ма - нужно (что б не путались). Ну и примера 2 (они тривиальны) - просто показать работу с параметрами в обеих случаях (без старт и со старт меньше адреса буфера)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: чтение-запись данных ядра через /proc

Непрочитанное сообщение Olej » 15 мар 2012, 00:39

bose писал(а):Думаю и в самом линуксе он нужен из-за вопросов совместимости. Не думаю что вам следует так детально его расписывать. Хотя упоминуть три различных варианта использования мех-ма - нужно (что б не путались). Ну и примера 2 (они тривиальны) - просто показать работу с параметрами в обеих случаях (без старт и со старт меньше адреса буфера)
3 варианта не успеваю, а вот 1-й вариант но в 4-х разных реализациях + запись данных по write_proc_t + данные хоть символьные хоть бинарные (и тесты контроля бинарных данных записи-чтения на соответствие) - это вот, есть над чем поэкспериментировать ;-)
Вложения
variants.04.tgz
(10.1 КБ) 634 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: чтение-запись данных ядра через /proc

Непрочитанное сообщение Olej » 13 авг 2013, 00:43

Возвращаясь к давней теме... (не хочется из-за этого отдельную тему марать)

Вот такая интересная штука в /proc - самоидентификация параметров процесса: каталог /proc/self/

Но в чём фишка? В том, что /proc/self - это ссылка:

Код: Выделить всё

bash-4.2$ ps | tail -n5
  PID TTY          TIME CMD
14575 pts/2    00:00:00 bash
14577 pts/2    00:00:00 ps
14578 pts/2    00:00:00 bash

Код: Выделить всё

bash-4.2$ ls -l /proc/sel*
lrwxrwxrwx 1 root root 64 авг.  12 08:00 /proc/self -> 14587
Т.е. ссылка на имя вида /proc/14587 - на PID самого процесса, который и открывает этот каталог /proc/self.

Если я запущу ещё одно окно терминала со своим shell, то его /proc/self будет предоставлять совсем другую информацию об этом новом процессе:

Код: Выделить всё

bash-4.2$ ps
  PID TTY          TIME CMD
15129 pts/4    00:00:00 bash
15132 pts/4    00:00:00 ps
bash-4.2$ exec ls -l /proc/sel*
lrwxrwxrwx 1 root root 64 авг.  12 08:00 /proc/self -> 15129
И наоборот, простой ми привычный запуск вот так:

Код: Выделить всё

bash-4.2$ ls -l /proc/sel*
lrwxrwxrwx 1 root root 64 авг.  12 08:00 /proc/self -> 15133
bash-4.2$ 
- будет давать информацию самоиндефикации фиктивного (умершего к моменту вывода) дочернего процесса shell, запущенного только на время выполнения команды ls.

Как сделать такое в модуле ядра - в общих чертах понятно.
Но сделано любопытно! ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: чтение-запись данных ядра через /proc

Непрочитанное сообщение Olej » 13 авг 2013, 00:54

Olej писал(а):Как сделать такое в модуле ядра - в общих чертах понятно.
Но сделано любопытно! ;-)
Откуда процесс (каждый) мог бы узнать множество прелюбопытных данных о себе:

Код: Выделить всё

bash-4.2$ cat /proc/self/status | grep Pid:
Pid:	15231
PPid:	14950
TracerPid:	0
Например, используемую процессом текущую память:

Код: Выделить всё

bash-4.2$ cat /proc/self/status | grep VmSize:
VmSize:	    4232 kB
Такие трюки нужно делать с большой осторожностью на языке оболочки bash, чтобы уследить к какой копии интерпретатора относятся данные, но гораздо интереснее и однозначнее из кода C или Python.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: чтение-запись данных ядра через /proc

Непрочитанное сообщение Olej » 13 авг 2013, 02:01

Olej писал(а):Такие трюки нужно делать с большой осторожностью на языке оболочки bash, чтобы уследить к какой копии интерпретатора относятся данные, но гораздо интереснее и однозначнее из кода C или Python.
Вот так примерно может выглядеть фрагмент на C, который использует такую возможность:

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEN_MSG 80

int main( int argc, char *argv[] ) {
   FILE* f = fopen( "/proc/self/status", "r" );
   if( !f ) 
      printf( "open name error: %m\n" ), exit( EXIT_FAILURE );
   char msg[ LEN_MSG + 1 ], *p;
   while( p = fgets( msg, LEN_MSG, f ) )
      if( strstr( msg, "VmSize:" ) ) break;
   if( p )
      printf( msg );
   else 
      printf( "string not found!\n" );
   close( f );
   return EXIT_SUCCESS;
};
И его выполнение:

Код: Выделить всё

bash-4.2$ ./own.mem 
VmSize:	    2144 kB
И архив на целых 617 байт ;-) для тех, кто хотел бы в этом убедиться...
Вложения
own.mem.tgz
(617 байт) 499 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: чтение-запись данных ядра через /proc

Непрочитанное сообщение Olej » 27 фев 2015, 00:45

Обращаю внимание, что работа с API procfs заметно поменялась начиная с ядра 3.10.
Все предыдущие примеры просто не будут компилироваться в 3.10 и далее.
О том, как это должно выглядеть теперь, можете поинтересоваться здесь.
Там достаточно небольшие изменения нужно внести в ваш код, чтобы он снова заработал.

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей