Что такое системные вызовы linux

Что такое системные вызовы linux

Эта глава pассматpивает пеpвые механизмы поддеpживаемые 386 пpоцессоpом и то как Linux использует эти механизмы. Здесь нет ссылок на конкpетные системные вызовы — их слишком много, сpеди них постоянно появляются новые, и они документиpованы на стpаницах описания Linux.

5.1 Что поддеpживет 386 пpоцессоp?

386 пpоцессоp pазделяет события на два класса: пpеpывания и исключения. Оба типа событий пpедназначены для ускоpения пpоцесса пеpеключения между задачами. Пpеpывания могу случаться в любое вpемя pаботы пpогpаммы, так как являются pевкцией на сигналы аппаpатного обеспечения. Исключения вызываются опpеделенными пpогpамными инстpукциями.

386 пpоцессоp pаспознает два типа пpеpываний: маскиpуемые и немаскиpуемые. Также опpеделяются два типа исключений: опpеделяемые пpоцессоpом и пpогpамные исключения.

Каждое исключение и пpеpывание имеет свой номеp, котоpый в литеpатуpе называется вектоpом. Hемаскиpуемым пpеpываниям и исключениям опpеделяемым пpоцессоpом пpиписываются вектоpа с 0-го по 32, включительно. Вектоpа маскиpуемых пpеpываний опpеделяются аппаpатным обеспечением. Внешние пpеpывания помещают вектоp в шину во вpемя цикла опpеделения пpеpывания. Любой вектоp входящий в диапазон от 32 до 255 может быть использован маскиpуемым пpеpыванием или пpогpамиpуемым исключением. См pис 4.1 для пpосмотpа всех возможных пpеpываний и исключений:

ВЫСШИЙ

HИЗШИЙ

Hеиспpавности включающие в себя неиспpавность отладчика
Hеиспpавность инстpукций INTO, INT n, INT 3.
Отладка неиспpавностей этих инстpукций.
Отладка последующих инстpукций.
Hемаскиpуемое пpеpывание
Пpеpывание INTR

Рис 4.2: Пpиоpитет пpеpываний и исключений.

5.2 Как Linux использует пpеpывания и исключения.

В Linux, запуск системного запpоса вызывается маскиpуемым пpеpыванием, или-же пеpедачей класса исключения, обусловленной инстpукцией int 0x80. Мы используем вектоp 0x80 для пеpедачи контpоля ядpу. Этот вектоp устанавливается во вpем инициализации, сpеди дpугих важнейших вектоpов таких, как вектоp таймеpа.

В веpсии Linux 0.99.2 пpисутствует 116 системных вызовов. Документацию по ним можно найти непосpедственно в самой документации по Linux. Во вpемя обpащения пользователя к системному вызову, пpоисходит следующее:

— Каждый вызов определяется в libc. Каждый вызов внутри библиотеки libc в общем-то представляет собой макрос syscallX, где X — число параметров текущей подпрограммы. Некоторые системные вызовы являются более общими, нежели другие из-за изменяющегося по длине списка аргументов, но два эти типа ничем концептуально не отличаются друг от друга — разве что количеством параметров. Примерами общих системных вызовов могут служить вызовы open() и ioctl().

— Каждый макрос вызова поддерживается ассемблерной подпрограммой, устанавливаемой границы стека вызовов и запускаемой вызов _system_call() через прерывание, пользуясь инструкциями $0x80. К примеру вызов setuid представлен как:

Определение макросов для syscallX() вы можете найти в /usr/include/linux/unistd.h а библиотека системных вызовов пользовательского пространства находится в /usr/src/libc/syscall

— С этой точки зрения системный код вызова не запущен. Он не запускается до запуска int $0x80 осуществляющего переход на ядровую _system_call(). Эта процедура общая для всех системных вызовов. Она обладает возможностью сохранения регистров, проверки на правильность запускаемого кода и затем передачи контроля текущему системному вызову со смещениями в таблице _sys_call_table. Она также может вызвать _ret_from_sys_call(), когда системный вызов завершается, но еще не осуществлен процесс перехода в прстранство пользователя.

Фактический код компонентов sys_call находится в /usr/src/linux/kernel/sys_call.s. Фактический код множества системных вызовов может быть найден в /usr/src/linux/kernel/sys.c. Остальную часть ищите сами.

— После запуска системного вызова, макрос syscallX() проверяет его на отрицательное возвращаемое значение, и если подобное случается он помещает код ошибки в глобальную переменную _errno, так чтобы он был доступен функции типа perror().

5.3 Как Linux устанавливает вектора системных вызовов.

Код startup_32 находящийся в /usr/src/linux/boot/head.S начинает всю работу запуская setup_idt(). Подпрограмма устанавливает IDT (таблицу описания прерываний) с 256 записями. Никаких отправных точек прерываний этой программой не загружается, и делается это лишь после разрешения пейджинга и перехода ядра по адресу 0xC0000000. В IDT находится 256 записей по 4 байта каждая, всего 1024 байта.

Когда вызывается start_kernel() (/usr/src/linux/init/main.c) она запускает trap_init() (описае в /usr/src/linux/kernel/traps.c). trap_init() устанавливает таблицу дескрипторов прерываний как показано на рис 4.3

На этот момент вектор прерывания системных вызовов не установлен. Он инициализируется sched_init() (находится в /usr/src/linux/kernel/sched.c). Вызов set_system_gate (0x80,&system_call) устанавливает прерывание 0x80 как вектор параметра system_call().

5.4 Как установить свой собственный системный вызов.

  1. Создайте каталог в /usr/src/linux/ для вашего кода.
  2. Поместите нужные вам библиотеки в /usr/include/sys/ и /usr/include/linux/
  3. Поместите ваш отлинкованный модуль в ARCHIVES и подкаталог в строки SUBDIRS высокого уровня создания файла. См fs/Makefile — fs.o.
  4. Поместите #define __NR_xx в unistd.h для присвоения номера вашему системному запросу, где xx — индекс описания вашего вызова. Она будет использована для установки вектора с помощью sys_call_table вызываемого ваш код.
  5. Введите отправную точку для вашего системного запроса в sys_call_table в sys.h. Она будет зависеть от индекса xx в предыдущем пункте. Переменная NR_syscalls будет пересчитана автоматически.
  6. Измените какой-нибудь код ядра в /fs/mm/ для установки инсрументов нужных вашему вызову.
  7. Запустите процесс компановки на высшем уровне для создания вашего кода в ядре

После этого вам останется лишь занести системный вызов в ваши библиотеки, или использовать макрос _syscalln() в программе использующей ваши разработки, для разрешения им доступа к новому системному вызову.

В библиографии содержаться несколько полезных ссылок на книги охватывающие эту тему. В частности полезно будет просмотреть «The 386DX Microprocessor Programmer’s Reference Manual» и «Advanced 80386 Programming Techniques» Джеймса Турли.

Источник

linux notes

суббота, 13 февраля 2016 г.

Системные вызовы Linux небольшой справочник

Знание системных вызовов очень облегчает работу программистов (для написаний программ на языке программирования С) и системным администратором при дебаге какой-либо программы, с помощью таких инструментов, как: strace/gdb и пр. Вот небольшое описание системных вызовов Linux.

1. exit Завершение процесса
2. fork Создание дочернего процесса
3. read чтение из файлового дескриптора
4. write Запись в файловый дескриптора
5. open открытие файла или устройства
6. close закрытие файлового дескриптора
7. waitpid ожидание завершения процесса
8. creat создание файла или устройства (man 2 open)
9. link задание нового имени файла
10. unlink удаление имени и файла
11. execve выполнить программу
12. chdir изменить рабочую директорию
13. time получить время в секундах
14. mknod создание специального блочного или символьного файла
15. chmod изменение прав доступа к файлу
16. lchown изменение владельца файла
17. stat получения статус файла
18. lseek установка смещения для позиционирования операций чтения/записи
19. getpid получение идентификатора процесса
20. mount монтирование файловой системы
21. umount размонтирование файловой системы
22. setuid установить идентификатор пользователя
23. getuid получить идентификатор пользователя
24. stime установить системное время и дату
25. ptrace разрешить родительскому процессу контролировать выполнеине дочернего процесса
26. alarm установка времени доставки тревожного сигнала
27. fstat получить статус файла
28. pause останавливает процесс до получения сигнала
29. utime изменить время доступа и/или модификация inode
30. access проверить права доступа пользователя к файлу
31. nice изменить приоритет процесса
32. sync сброс буферов файловой системы
33. kill отправить сигнал процессу
34. rename изменить имя или расположение файла
35. mkdir создать директорию
36. rmdir удалить директорию
37. dup создать дубликат файлового дескриптора
38. pipe создает межпроцессорный канал
39. times ведет запись времен процесса
40. brk изменение размера сегмента данныхх
41. setdig установить идентификатор группы
42. getgid получить идентификатор группы
43. sys_signal ANSI C обработка сигналов
44. geteuid получить эффективный идентификатор пользователя, установленный setuid битом на исполняемом файле
45. getegid получить эффективный идентификатор группы, установленные setuid битом на исполняемом файле
46. acct включает или выключает учет процессов
47. umount2 размонтировать файловую систему
48. ioctl управление устройствами
49. fcntl манипуляция с файловым дескриптором
50. setpgid установить идентификатор группы дял процесса
51. umask получение или установка маски режима создания файлов
52. chroot изменение корневой директории
53. ustat получить статистику по файловой системе
54. dup2 создать дубликат файлового дескриптора
55. getppid получить ID родительского процесса
56. getpgrp получить ID группы процесса
57. setsid создает сеанс и устанвливает идентификатор группы
58. sigaction POSIX обработка сигналов
59. sgetmask ANSI C обработка сигналов
60. ssetmask ANCI C обработки сигналов
61. setreuid устанавливает действительный и/или действующий идентификатор пользователя
62. setregid устанавливает дейсвтительный и/или действующий идентификатор группы
63. sigsuspend временно изменяет значение маски блокировки сигналов процесса
64. sigpendind позволяет определить наличие ожидающих сигналов
65. sethostname устанавливает хостнейм
66. setrlimit устанавливает ограничения использования ресурсов
67. getrlimit получить ограничение использования ресурсов
68. getrusage получить максимальное ограничение использования ресурсов
69. gettimeofday получить время
70. settimeofday установить время
71. getgroups получить список дополнительных идентификаторов групп
72. setgroups установить список дополнительных идентификаторов групп
73. old_select синхронизировать I/O мультиплексирование
74. symlink создать символическую ссылку на файл
75. lstat считать статус файла
76. readlink вывести значение символической ссылки
77. uselib выбрать разделяемую библиотеку
78. swapon разрешает подкачку данных в файл/устройство
79. reboot перезагружает систему и разрешает/запрещает использование клавш Ctrl-Alt-Del
80. old_readdir считывает данные директории
81. old_mmap отражает файлы или устройства в памяти
82. munmap снимает отражение файлов или устройств в памяти
83. truncate укорачивает файл до заданной длины (файл должен быть доступен для записи)
84. ftruncate укорачивает файл до заданноой длины (файл должен быть открыт для записи)
85. fchmod изменить права доступа к файлу
86. fchown изменить владельца и группу файла
87. getpriority получить приоритет программы
88. setpriority установить приоритет программы
89. profil выполняет профилирование времени
90. statfs получить статистику файловой системы
91. fstatfs получить статистику файловой системы
92. ioperm устанавливает права на работу с портами ввода/вывода
93. socketcall системные вызовы сокетов
94. syslog читает и/или очищает кольцевой буфер сообщений ядра, устанавливает console_loglevel
95. setitimer устанавливает значение таймера интервалов (interval timer)
96. getitimer считывает значение таймера интервалов
97. sys_newstat получить статус файла
98. sys_newlstat получить статус файла
99. sys_newfstat получить статус файла
100. iopl менять уровень привелений ввода-вывода
101. vhangup имитирует прекращение работы на текущем терминале
102. idle делает процесс 0 простаиваемым
103. vm86old включить виртуальный 8086 режим
104. wait4 ожидает завершение работы процесса (стиль BSD)
105. swapoff запрещает подкачку данных в файл/устройство
106. sysinfo возвращает общесистемную статистику
107. ipc системные вызовы System V IPC
108. fsync синхронизирует состояние файла в памяти с состоянием на диске
109. sigreturn возвращается из обработчика сигнала и очищает временный стек
110. clone создать процесс-потомок
110. setdomainname установить имя домена
111. uname сообщает информацию о данном компьютере и операционной системе
112. modify_ldt получает или устанавливает ldt
113. adjtimex тонкая настройка часов в ядре
114. mprotect контролирует доступ к области памяти
115. sigprocmask POSIX-фукнция обработки сигналов
116. create_module создает загружаемый модуль
117. init_module инициализирует загружаемый модуль
118. delete_module удаляет загружаемый модуль
119. get_kernel_syms retrieve exported kernel and module symbols
120. quotactl работает с дисковыми квотами
121. getpgid получает группу процессов
122. fchdir изменить рабочий каталог
123. bdflush запустить, активизировать или настроить демона записи буферов кэша
124. sys_newfstat получает информацию о файловой системе
125. personality устанавливает домен исполнения процесса
126. setfsuid устанавливает идентификатор пользователя файловой системы
127. setfsgid устанавливает идентификатор группы для досутпа к файловой системе
128. sys_llseek move extended read/write file pointer
129. getdents получить записи каталога
130. select многопоточный синхронный ввод-вывод
131. flock установить или снять advisory Блокировку на открытый файл
132. msync синхронизирует содержимое файла с его отражением в памяти
133. readv чтение данных из нескольких буферов
134. writev запись данных в несколько буферов
135. sys_getsid get process group ID of session leader
136. fdatasync снихронизирует содержимое файла в памяти с содержимым на диске
137. sysctl читает/записывает параметры системы
138. mlock запрещает страинчный обмен в некоторых областях памяти
139. munlock разрашает страинчный обмен в некоторых областях памяти
140. mlockall запрещает страничный обмен всему процессу
141. munlockall разрашает страничный обмен всему процессу
142. sched_setparam устанавливает параметры планировщика
143. sched_getparam получает параметры планировщика
144. sched_setscheduler устанавливает алгоритм планировщика (и его параметры)
145. sched_getscheduler получает алгоритм планировщика (и его параметры)
146. sched_yield освободить процессор
147. sched_get_priority_max задать верхнюю планку диапазона статических приоритетов
148. sched_get_priority_min задать нижнию планку диапазона статических приоритетов
149. sched_rr_get_interval определяет временной интервал SCHED_RR для заданного процесса
150. nanosleep останавливает работу процесса на заданное время (нано секунды)
151. mremap изменяет отражение адреса виртуальной памяти
152. setresuid устанавливает идентификатор реальной, эффективной и сохранненной групп пользователей
153. getresuid получает идентификатор реальной, эффективной и сохранненной групп пользователей
154. vm86 войти в виртуальный режим 8086
155. query_module query the kernel for various bits pertain ing to modules
156. poll ожидает некоторое событие в файловом описателе
157. nfsservctl интерфейсная функция системного демона nfs
158. setresgid устанавливает идентификатор реальной, эффективной и сохранненной групп пользователей
159. getresgid получает идентификатор реальной, эффективной и сохранненной групп пользователей
160. prctl оперирует процессами
161. pread чтение информации из опистаеля файла согласно заданному смещению
162. pwrite запись информации из описателя файла согласно заданному смещению
163. chown изменяет владельца и группу файлов
164. getcwd возвращает текущий рабочий каталог
165. capget получить возможности процесса
166. capset установить возможности процесса
167. sigaltstack считывает или устанавливает содержимое дополнительного стека сигнала
168. sendfile производит обмен данными между описателями файлов
169. vfork создает дочерний процесс и блокирует родительский

Источник

Читайте также:  Canon mf4010 драйвер windows 10 x64
Оцените статью