Автор: lonesome TSH/Digital Daemons
Дата: .03.2003
Раздел: Низкоуровневое программирование в Linux
Что такое единая ФС Linux? Это словосочетание означает, что все, абсолютно все в Linux представлено в виде файлов. Помимо тех файлов к которым мы все привыкли (т.е. именованных областей на диске) в Linux существует множество других файлов, которые доступны обычными средствами, т.е. для программ они неотличимы от обычных файлов. Например многие файлы в директории /dev являются файлами-устройствами. С их помощью программа, используя обычные средства работы с файлами, может взаимодействовать с внешними устройствами.
Самый известный специальный файл - знаменитая "черная дыра" /dev/null. Отправка чего-нибудь в /dev/null действительно приводит к моментальному исчезновению этих данных из системы.
В директории /proc находятся каталоги всех выполняющихся в системе процессов и название каждого каталога соотвествует PID'у - идентификатору процесса, например /proc/1249/. Что важно - в этой директории существует файл-ссылка self, который всегда ссылается на директорию соотвествующую текущему процессу, в которой находятся некоторые интересные файлы, точнее псевдофайлы. Например в файле cmdline находится командная строка которой запустили процесс. Улавливаете идею?
Следующая программа выведет на экран командную строку, которой она была запущена
global _start section .text _start: ; Извлечение командной строки хитроумным способом из ; /proc/self/cmdline ;) mov eax, 5 ; Системный вызов "open" mov ebx, filename_cmdline xor ecx, ecx ; O_RDONLY == 0 xor edx, edx int 0x80 mov ebx, eax ; Предыдущая функция возвратила ; дескриптор файла mov eax, 3 ; Системный вызов "read" mov ecx, buffer_cmdline mov edx, 0x100 int 0x80 mov eax, 4 ;Системный вызов "write" xor ebx, ebx inc ebx ;Идентификатор stdout - 1 int 0x80 mov eax, 1 ;Системный вызов "exit" xor ebx, ebx int 0x80 section .data filename_cmdline: db "/proc/self/cmdline",0 buffer_cmdline: resb 0x100Компиляция: nasm -felf cmdline.asm -o cmdline.o