Открытие файлов
...
movl $5, %eax #номер системного вызова (open) в %eax
movl $file_name, %ebx #путь к файлу (адрес) в %ebx
movl flags, %ecx #флаги в %ecx
movl mode, %edx #права доступа к файлу в %edx
int $0x80
...
fs/open.c:
SYSCALL_DEFINE2(creat, const char __user *, pathname, int, mode)
{
return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
}
• fd — файловый дескриптор:
◦ 0 — STDIN (стандартный ввод);
◦ 1 — STDOUT (стандартный вывод);
◦ 2 — STDERR (стандартный вывод ошибок).
• *buf — указатель на буфер (данные подлежащие выводу);
• count — количество символов подлежащих выводу.
Возвращает новую позицию в файле относительно его начала в %eax, либо номер
ошибки в случае неудачи.
...
movl $0x13, %eax
movl fd, %ebx
movl offset, %ecx
movl whence, %edx
int $0x80
...
Закрытие файлов
...
movl $6, %eax #номер системного вызова (close) в %eax
movl fd, %ebx #файловый дескриптор в %ebx
int $0x80
...
.section .bss
.lcomm buffer, 1024
.section .data
fname:
.asciz "test.txt"
fd:
.int 0
.section .text
.globl _start
_start:
movl $5, %eax #системный вызов open
movl $fname, %ebx #имя файла
movl $0, %ecx #открыть только для чтения (0 - O_RDONLY)
movl $0, %edx #0, т.к. мы не будем создавать файл
int $0x80
movl %eax, fd #сохраняем файловый дескриптор
read:
movl $3, %eax #системный вызов read
movl fd, %ebx #дескриптор открытого файла
movl $buffer, %ecx #куда сохранять данные
movl $1024, %edx #размер буфера
int $0x80
Системный вызов UNLINK принимает всего лишь один аргумент — путь к удаляемому
файлу. В %eax возвращается 0 в случае успеха или номер ошибки в случае неудачи.
...
movl $0xa, %eax
movl $fname, %ebx
int $0x80
...
Урезание файлов
Системный вызов TRUNCATE принимает два аргумента: путь к файлу (*path) и новый
размер файла (length), и возвращает в %eax 0 в случае успеха или номер ошибки в случае
неудачи.
Создадим файл «test.txt» и напишем в нем «Some text before truncate». Его
размер составляет 26 байт. Теперь выполним следующую программу:
Системный вызов UTIME принимает два параметра: имя файла, которому следует
изменить время доступа и модификации и указатель на структуру utimebuf. Структура
utimebuf включает в себя два поля:
include/linux/utime.h:
struct utimebuf {
__kernel_time_t actime; /* время доступа */
__kernel_time_t modtime; /* время модификации */
};
Системный вызов CHMOD принимает два аргумента: путь к файлу (*path) и права
доступа к файлу (mode).
...
movl $0xf, %eax #номер системного вызова (chmod) в %eax
movl $fname, %ebx #путь к файлу в %ebx
movl mode, %ecx #права доступа в %ecx
int $0x80
...
В %eax возвращается 0 в случае успеха или номер ошибки в случае неудачи.
Системный вызов FCHMOD аналогичен CHMOD, за исключением того, что используется
файловый дескриптор. Номер системного вызова FCHMOD $0x5e.
...
movl $0x27, %eax #номер системного вызова (mkdir) в %eax
movl $dir_name, %ebx #путь к директории, которую следует создать
movl mode, %ecx #права доступа на директорию в %eсx
int $0x80
...
...
movl $0x28, %eax #номер системного вызова (rmdir) в %eax
movl $dir_name, %ebx #путь к директории, которую следует удалить в %ebx
int $0x80
...
Замечания