Title: Linux ProcFS
1Linux ProcFS
2Gliederung
- Wie alles begann
- Einführung
- Motivation
- Merkmale des ProcFS
- Struktur des ProcFS
- Operationen
- ProcFS API
- Anwendungsbeispiel
3Wie alles begann
Newsgroups comp.os.linux From
torvalds_at_klaava.Helsinki.FI (Linus Torvalds)
Subject ANNOUNCE linux-0.98 patchlevel 6 Date
Wed, 2 Dec 1992 212446 GMT pl6 contains these
fixes - /proc filesystem extensions. Based
on ideas (and some code) by Darren Senn, but
mostly written by yours truly. More about that
later.
4Einführung
dstutz_at_newworldordergt uptime 356pm up 4 days,
214, 3 users, load average 0.02, 0.05, 0.02
jiffies ist eine Variable im Kernel-Space, die
alle 10 Millisekunden um 1 erhoeht wird. gt
Zeitmessung seit Systemstart
Wie kommen jiffies vom Kernel- in den Userspace?
Woher bekommt uptime die Informationen?
jiffies
5Einführung
dstutz_at_newworldordergt cat /proc/uptime 80886.45
80612.17
Jiffies aus einer Datei gelesen! Aktualität?!
6Einführung
root_at_newworldordergt echo 1
gt/proc/sys/net/ipv4/conf/all/proxy_arp
Wie erfaehrt der Kernel davon?
Aktivieren des ARP Proxies
7Motivation
- Bereitstellen von Prozess-Informationen
-
- Schnittstelle zu Kernel-Informationen
- Lesen von Kernelparametern zur Laufzeit
- Setzen von Kernelparametern zur Laufzeit
-
8Merkmale des ProcFS
- Schnittstelle zum Kernel über das VFS
- Zugriff auf Kernelinformationen
- einfach zu erweitern
- gerätelos, existiert nur im RAM
- Datei-Inhalte werden erst beim Auslesen erzeugt
- Darstellung der Informationen als Textdatei
- von Menschen lesbar (Human Readable Interface)
- praktische Weiterverarbeitung mit Tools wie grep,
sed, awk, ...
9Struktur des ProcFS
/proc
/1/ /2/ /345/ /8777/
- Zwei Sektionen
- Prozessinformationen
- Kernelinformationen
/cmdline /filesystems /sys/ /uptime
10Struktur des ProcFS
- Zugriff auf den virtuellen Adreßraum
- Anzahl der dirty, code
- and stack pages
- Virtuellen Adreßbereich (
- Adresse, Zugriffsrechte,
- Offset in der gemappten Datei,
- Gerätenummer, Inode, Name)
/proc/(\d)/
- Prozessinformationen
- Kommandozeile
- Arbeitsverzeichnis
- Umgebungsvariablen
- Link auf das Executable
- Dateideskriptoren
- Dateisystem-Root des Prozesses
- Prozesseigenschaften
/cmdline /cwd/ /environ /exe /fd/ /maps /mem /root
/stat /statm /status
11Struktur des ProcFS
/proc/
- Kernelinformationen
-
- Max. Anzahl gleichzeitig geöffneter Dateien
- Größe des Directory Caches
- Maximale Anzahl Inodes und Superblöcke
- Größe des Buffer Device Caches, Anzahl
gleichzeitig zu schreibender Blöcke, Kontrolle
des Alters von Blöcken
/cmdline /cpuinfo /filesystems /kcore /self/ /sys
/mem /net /fs /uptime
- Aktivieren des Page Table Caches
- Kontrolle des Swapprozesses
- (Alter, Limits für freien Speicher, ...)
- Parameter von ICMP, IP, TCP, ARP,
- Routing, etc.
12Operationen
Prozess
USER
read()
write()
KERNEL
VFS
/proc
proc_file_read()
proc_file_write()
proc_read()
proc_write()
13ProcFS API
proc_fs.h struct proc_dir_entry const
char name mode_t mode struct module
owner struct proc_dir_entry next, parent,
subdir read_proc_t read_proc write_proc_t
write_proc
14ProcFS API
proc_fs.h struct proc_dir_entry
create_proc_entry( const char name, mode_t
mode, struct proc_dir_entry parent ) void
remove_proc_entry( const char name, struct
proc_dir_entry parent )
15Anwendungsbeispiel
dstutz_at_newworldordergt cat /proc/uptime 80886.45
80612.17
uptime
idletime
16Anwendungsbeispiel
- Ziel
- myuptime ProcFS-Eintrag der Uptime in
Sekunden ausgiebt. - Umsetzung
- Ein Kernel-Modul das folgendes leistet
- Neuen ProcFS-Eintrag erzeugen
- Aktuellen Wert von jiffies ausgeben, wenn
dieser Eintrag gelesen wird.
17Anwendungsbeispiel
myuptime.c const char filename
myuptime static int proc_read( char page,
... ) int len unsigned long uptm jiffies
MOD_INC_USE_COUNT len
sprintf(page,"lu.02lu\n",uptm/100,uptm100)
eof 1 MOD_DEC_USE_COUNT return len
18Anwendungsbeispiel
myuptime.c int init_module() struct
proc_dir_entry infop create_proc_entry(
filename, 0444, (struct
proc_dir_entry ) 0 ) infop-gtowner
THIS_MODULE infop-gtread_proc proc_read
return 0
19Anwendungsbeispiel
myuptime.c void cleanup_module()
remove_proc_entry(filename, (struct
proc_dir_entry ) 0)
20Anwendungsbeispiel
root_at_newworldordergt insmod myuptime.o root_at_newwo
rldordergt cat /proc/myuptime 81472.42
uptime
21Hinter den Kulissen
Prozess
USER
read()
KERNEL
VFS
/proc
proc_file_read()
jiffies
allokiert
Page
proc_read()
81472.42
sprintf(page,)
22Literatur
- http//groups.google.com/
- /usr/src/linux/Documentation/filesystems/proc.txt
- /usr/src/linux/fs/proc/.c
- /usr/src/linux/include/linux/proc_fs.h
- Linux Kernelprogrammierung, M. Beck
23Sourcen
/ myuptime.c Print out the uptime in
/proc/myuptime / include ltlinux/kernel.hgt incl
ude ltlinux/module.hgt include ltlinux/proc_fs.hgt i
nclude ltasm/atomic.hgt / helper function
/ static int proc_calc_metrics(char page, char
start, off_t off, int count, int eof, int
len) if (len lt offcount) eof 1
start page off len - off
if (lengtcount) len count if
(lenlt0) len 0 return len /
Name of the proc dir entry / static const char
filename "myuptime"
24Sourcen
/ myuptime.c / static struct proc_dir_entry
infop static int proc_read( char page, char
start, off_t off, int count, int eof, void
data ) int len unsigned long uptime
uptime jiffies / Increment the use
count so that the module can't be removed while
we are in the middle of this call. /
MOD_INC_USE_COUNT / Get the current
time and format it. / len sprintf(page,
"lu.02lu\n",uptime/100,uptime100)
MOD_DEC_USE_COUNT return proc_calc_metrics(pag
e, start, off, count, eof, len)
25Sourcen
/ myuptime.c Initialize the module and add
the /proc file entry / int init_module()
infop create_proc_entry(filename, 0444, (struct
proc_dir_entry ) 0) if( 0 infop )
return -EINVAL infop-gtowner THIS_MODULE
infop-gtread_proc proc_read infop-gtget_info
NULL return 0 / Unregister the file
when the module is closed / void
cleanup_module() remove_proc_entry(filename,
(struct proc_dir_entry ) 0)
26Makefile
UNAME2.4.13-ac8 CCgcc -Wall -nostdlib
-I/lib/modules/(UNAME)/build/include
-D__KERNEL__ -DMODULE all myuptime.o myuptime.o
myuptime.c (CC) -c myuptime.c