5.6. The /proc filesystem
Unix systems have come a long way with respect to providing uniform interfaces to different parts of the system; as you will learn in the next chapter, hardware is represented in Linux in the form of a special type of file. There is, however, a special filesystem called the /proc filesystem that goes even one step further: it unifies files and processes.
From the user's or the system administrator's point of view, the /proc filesystem looks just like any other filesystem; you can navigate around it with the cd command, list directory contents with the ls command and view file contents with the cat command. However, none of these files and directories occupy any space on your hard disk. The kernel traps accesses to the /proc filesystem and generates directory and file contents on the fly. In other words, whenever you list or directory or view file contents in the /proc filesystem, the kernel dynamically generates the contents you want to see.
To make this less abstract, let's see some examples. The following example displays the list of files in the top-level directory of the /proc filesystem:
tigger # ls /proc 1 184 25472 8 8525 kmsg 130 185 25475 82 8526 ksyms 134 186 25497 8484 8593 loadavg 136 187 25498 8485 963 locks 139 2 25499 8488 965 meminfo 143 24924 25500 8489 9654 modules 144 25441 25515 8492 968 mounts 145 25442 25549 8496 97 net 146 25445 25550 8507 99 pci 147 25446 26019 8508 cmdline scsi 148 25449 26662 8510 cpuinfo self 151 25451 26663 8511 devices stat 163 25462 270 8512 dma sys 168 25463 3 8520 filesystems uptime 172 25464 4484 8522 interrupts version 180 25465 4639 8523 ioports 182 25466 55 8524 kcore
The numbers will be different on your system, but the general organization will be the same. All those numbers are directories that represent one of the processes running on your system each. For example, let's look at the information about the process with the ID 172:
tigger # ls /proc/172 cmdline environ fd mem stat status cwd exe maps root statm
You see a number of files that each contain information about this process. For example, the cmdline file shows the command line with which this process was started. status gives information about the internal state of the process and cwd links to the current working directory of this process.
Probably you'll find the hardware information even more interesting than the process information. All the information that the kernel has gathered about your hardware is collected in the /proc filesystem, even though it can be difficult to find the information you are looking for.
tigger # cat /proc/meminfo total: used: free: shared: buffers: cached: Mem: 130957312 128684032 2273280 37888000 3198976 20615168 Swap: 133885952 64434176 69451776 MemTotal: 127888 kB MemFree: 2220 kB MemShared: 37000 kB Buffers: 3124 kB Cached: 20132 kB SwapTotal: 130748 kB SwapFree: 67824 kB
If you then try the command free, you can see that that is exactly the same information, only the numbers are reformatted a bit. free does nothing more than read /proc/meminfo and rearrange the output a bit.
Most tools on your system that report information about your hardware do it this way. The /proc filesystem is a portable and easy way to get at this information. The information is especially useful if you want to add new hardware to your system. For example, most hardware boards need a few I/O addresses to communicate with the CPU and the operating system. If you configured two boards to use the same I/O addresses, disaster is about to happen. You can avoid this by checking which I/O addresses the kernel has already detected as being in use:
tigger # more /proc/ioports 0000-001f : dma1 0020-003f : pic1 0040-005f : timer 0060-006f : keyboard 0080-009f : dma page reg 00a0-00bf : pic2 00c0-00df : dma2 00f0-00ff : npu 01f0-01f7 : ide0 0220-022f : soundblaster 02e8-02ef : serial(auto) 0388-038b : OPL3/OPL2 03c0-03df : vga+ 03f0-03f5 : floppy 03f6-03f6 : ide0 03f7-03f7 : floppy DIR 03f8-03ff : serial(auto) 0530-0533 : WSS config 0534-0537 : MSS audio codec e000-e0be : aic7xxx e400-e41f : eth0
Now you can look for IO addresses that are free. Of course, the kernel can show IO addresses only for boards that it has detected and recognized, but in a correctly configured system, this should be the case for all boards.
You can use the /proc filesystem for the other information that you might need for configuring new hardware as well: /proc/interrupts lists the occupied interrupt lines (IRQs) and /proc/dma lists the DMA (direct memory access) channels in use.
Copyright © 2001 O'Reilly & Associates. All rights reserved.