Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ЭнциклопСдия Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ядра LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 4

Автор ΠžΡ€ΠΈ ΠŸΠΎΠΌΠ΅Ρ€Π°Π½Ρ†

ВСрсии ядра Linux Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ устойчивыми вСрсиями (n.<Π§Π΅Ρ‚Π½ΠΎΠ΅ число>.m) ΠΈ вСрсии Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (n.<НСчСтноС число>.m). ВСрсии Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ всС Π½ΠΎΠ²Ρ‹Π΅ ΠΈΠ΄Π΅ΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ ошибкой ΠΈΠ»ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ вСрсии. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ интСрфСйсу Π² Ρ‚ΠΎΠΌ ΠΏΠ»Π°Π½Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ останСтся Ρ‚Π΅ΠΌ ΠΆΠ΅ самым Π² вСрсиях Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π’ устойчивых вСрсиях ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ интСрфСйс останСтся Ρ‚Π΅ΠΌ ΠΆΠ΅ самым нСзависимо ΠΎΡ‚ вСрсии исправлСния ошибок (число m).

Π­Ρ‚Π° вСрсия MPG Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ для вСрсии 2.0.x ΠΈ вСрсии ядра Linux. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ различия ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ, трСбуСтся условная трансляция Π² зависимости ΠΎΡ‚ вСрсии. Бпособ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это сводится ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρƒ LINUX_VERSION_CODE. Π’ вСрсии a.b.c ядра Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π±Ρ‹Π»ΠΎ Π±Ρ‹ 216a+28b+c. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ вСрсии, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρƒ KERNEL_VERSION. Π’Π°ΠΊ ΠΊΠ°ΠΊ этот макрос Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² 2.0.35, ΠΌΡ‹ опрСдСляСм Π΅Π³ΠΎ сами Π² случаС нСобходимости.

Ѐайловая систСма /proc

Π’ Linux имССтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для ядра ΠΈ ядСрных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ процСссам: файловая систСма /proc. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ разработанная для свободного доступа ΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ процСссов, ΠΎΠ½Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ кусочком ядра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, /proc/modules, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ список ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ /proc/meminfo, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ статистику использования памяти. 

ΠœΠ΅Ρ‚ΠΎΠ΄ использования Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы /proc ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°ΠΌΠΈ устройства: Π’Ρ‹ создаСтС структуру со всСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ для /proc Ρ„Π°ΠΉΠ»Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π»ΡŽΠ±Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° (Π² нашСм случаС имССтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ³Π΄Π° ΠΊΡ‚ΠΎ-Ρ‚ΠΎ пытаСтся Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· /proc Ρ„Π°ΠΉΠ»Π°). Π—Π°Ρ‚Π΅ΠΌ init_module рСгистрируСт структуру ΠΈ cleanup_module отмСняСт Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ proc_register_dynamic[2] Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ inode Π½ΠΎΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для нашСго Ρ„Π°ΠΉΠ»Π° Π·Π°Ρ€Π°Π½Π΅Π΅, Π½ΠΎ позволяСм ядру ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ столкновСния. Π’ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСмах Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Ρ… Π½Π° дискС, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² памяти (ΠΊΠ°ΠΊ /proc) inode являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Ρ‚ΠΎ мСсто, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π° дискС Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ индСксный ΡƒΠ·Π΅Π» Ρ„Π°ΠΉΠ»Π° (ΠΊΡ€Π°Ρ‚ΠΊΠΎ, inode). Inode содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ„Π°ΠΉΠ»Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»Π°, вмСстС с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Ρ‚ΠΎ мСсто, Π³Π΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Π°.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π½Π°ΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ вызываСтся ΠΊΠΎΠ³Π΄Π° Ρ„Π°ΠΉΠ» открываСтся ΠΈΠ»ΠΈ закрываСтся, Π½Π΅ΠΊΡƒΠ΄Π° ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ MOD_INC_USE_COUNT ΠΈ MOD_DEC_USE_COUNT Π² этом ΠΌΠΎΠ΄ΡƒΠ»Π΅, ΠΈ Ссли Ρ„Π°ΠΉΠ» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΡƒΠ΄Π°Π»Π΅Π½, Π½Π΅ имССтся Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ способа ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрим Π±ΠΎΠ»Π΅Π΅ тяТСлый Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΏΡƒΡ‚ΡŒ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π΄Π΅Π»ΠΎ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈΠ· /proc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

procfs.c

/* procfs.c - create a "file" in /proc

* Copyright (C) 1998-1999 by Ori Pomerantz

*/


/* The necessary header files */

/* Standard in kernel modules */

#include <linux/kernel.h> /* We're doing kernel work */

#include <linux/module.h> /* Specifically, a module */


/* Deal with CONFIG_MODVERSIONS */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include <linux/modversions.h>

#endif


/* Necessary because we use the proc fs */

#include <linux/proc_fs.h>


/* In 2.2.3 /usr/include/linux/version.h includes a

* macro for this, but 2.0.35 doesn't - so I add it

* here if necessary. */

#ifndef KERNEL_VERSION

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))

#endif


/* Put data into the proc fs file.

 Arguments

 =========

 1. The buffer where the data is to be inserted, if you decide to use it.

 2. A pointer to a pointer to characters. This is useful if you don't want to use the buffer allocated by the kernel.

 3. The current position in the file.

 4. The size of the buffer in the first argument.

 5. Zero (for future use?).


Usage and Return Value

 ======================

 If you use your own buffer, like I do, put its location in the second argument and return the number of bytes used in the buffer.

 A return value of zero means you have no further information at this time (end of file). A negative return value is an error condition.


 For More Information

 ====================

 The way I discovered what to do with this function wasn't by reading documentation, but by reading the code which used it. I just looked to see what uses the get_info field of proc_dir_entry struct (I used a combination of find and grep, if you're interested), and I saw that it is used in <kernel source directory>/fs/proc/array.c.

 If something is unknown about the kernel, this is usually the way to go. In Linux we have the great advantage of having the kernel source code for free - use it.

*/


int procfile_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, int zero) {

 int len; /* The number of bytes actually used */

 /* This is static so it will still be in memory when we leave this function */

 static char my_buffer[80];

 static int count = 1;

 /* We give all of our information in one go, so if the

 * user asks us if we have more information the

 * answer should always be no.

 *

 * This is important because the standard read

 * function from the library would continue to issue

 * the read system call until the kernel replies

 * that it has no more information, or until its * buffer is filled. */

 if (offset > 0) return 0;

 /* Fill the buffer and get its length */

 len = sprintf(my_buffer, "For the %d%s time, go away!\n", count,

  (count % 100 > 10 && count % 100 < 14) ? "th" :

  (count % 10 == 1) ? "st" : (count % 10 == 2) ? "nd" :

  (count % 10 == 3) ? "rd" : "th" );

 count++;

 /* Tell the function which called us where the buffer is */

 *buffer_location = my_buffer;

 /* Return the length */

 return len;

}


struct proc_dir_entry Our_Proc_File = {

 0, /* Inode number - ignore, it will be filled by proc_register[_dynamic] */

 4, /* Length of the file name */

 "test", /* The file name */

 S_IFREG | S_IRUGO, /* File mode - this is a regular file which can be read by its owner, its group, and everybody else */

 1, /* Number of links (directories where the file is referenced) */

 0, 0, /* The uid and gid for the file - we give it * to root */

 80, /* The size of the file reported by ls. */

 NULL, /* functions which can be done on the inode (linking, removing, etc.) - we don't support any. */

 procfile_read, /* The read function for this file, the function called when somebody tries to read something from it. */

 NULL /* We could have here a function to fill the file's inode, to enable us to play with permissions, ownership, etc. */

};


/* Initialize the module - register the proc file */

int init_module() {

 /* Success if proc_register[_dynamic] is a success, failure otherwise. */

#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)

 /* In version 2.2, proc_register assign a dynamic

 * inode number automatically if it is zero in the

 * structure, so there's no more need for

 * proc_register_dynamic */

 return proc_register(&proc_root, &Our_Proc_File);

#else

 return proc_register_dynamic(&proc_root, &Our_Proc_File);

#endif

 /* proc_root is the root directory for the proc fs (/proc). This is where we want our file to be located. */

}


/* Cleanup - unregister our file from /proc */

void cleanup_module() {

 proc_unregister(&proc_root, Our_Proc_File.low_ino);

}

ИспользованиС /proc для ввода

Пока ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π²Π° способа Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ· ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ: ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ устройства ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ mknod Ρ„Π°ΠΉΠ» устройства, ΠΈΠ»ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ /proc Ρ„Π°ΠΉΠ». Π­Ρ‚ΠΎ позволяСт ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ Π½Π°ΠΌ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ. ЕдинствСнная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ имССтся Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ для нас, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Ρ€Π°Π·ΠΈΡ‚ΡŒ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡƒΡ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ пошлСм Π²Π²ΠΎΠ΄ модулям, Π±ΡƒΠ΄Π΅Ρ‚ запись ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Ρ„Π°ΠΉΠ» Π² систСмС /proc.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ файловая систСма /proc Π±Ρ‹Π»Π° написана Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ядру ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ процСссам, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… условий для Π²Π²ΠΎΠ΄Π°. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° proc_dir_entry Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Π²ΠΎΠ΄Π°. ВмСсто этого, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² /proc, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы.   

Π’ Linux имССтся стандартный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для рСгистрации Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы. Π’Π°ΠΊ ΠΊΠ°ΠΊ каТдая файловая систСма Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ inode ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ[3], имССтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ структура, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° всС Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, struct inode_operations, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° struct file_operations. Π’ /proc всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рСгистрируСм Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π½Π°ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ struct inode_operations Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для доступа ΠΊ этому Ρ„Π°ΠΉΠ»Ρƒ. Π­Ρ‚ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ, struct inode_operations, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° struct file_operations, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° наши Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ module_input ΠΈ module_output.

Π’Π°ΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ стандартныС Ρ€ΠΎΠ»ΠΈ чтСния ΠΈ записи, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½Ρ‹ Π² ядрС. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ чтСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π²Ρ‹Π²ΠΎΠ΄Π°, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ записи ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π²Π²ΠΎΠ΄Π°. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° для этого Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись относятся ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ зрСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ: Ссли процСсс Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ· ядра, ядро Π΄ΠΎΠ»ΠΆΠ½ΠΎ вывСсти это, Π° Ссли процСсс ΠΏΠΈΡˆΠ΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² ядро, ΠΎΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ это ΠΊΠ°ΠΊ Π²Π²ΠΎΠ΄.

Другая интСрСсная Ρ‚ΠΎΡ‡ΠΊΠ° здСсь это функция module_permission. Π­Ρ‚Π° функция вызываСтся всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° процСсс ΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ систСмы /proc, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ доступ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. БСйчас это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ основано Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ uid Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π½ΠΎ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒΡΡ исходя ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ процСссы Π΄Π΅Π»Π°ΡŽΡ‚ с Ρ‚Π΅ΠΌ ΠΆΠ΅ самым Ρ„Π°ΠΉΠ»ΠΎΠΌ, Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ дня ΠΈΠ»ΠΈ послСднСго Π²Π²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ.