параметры системных вызовов

Модератор: Модераторы разделов

Ответить
zl3p
Сообщения: 206
Статус: с диагнозом
ОС: операционная клинической

параметры системных вызовов

Сообщение zl3p »

Где можно глянуть подробное описание параметров системных функций ядра?
Спасибо сказали:
Аватара пользователя
anonymous.ru
Сообщения: 614

Re: параметры системных вызовов

Сообщение anonymous.ru »

man 2 <системный_вызов>
например
man 2 open
:drinks:
Спасибо сказали:
zl3p
Сообщения: 206
Статус: с диагнозом
ОС: операционная клинической

Re: параметры системных вызовов

Сообщение zl3p »

В моей мандриве man 2 не работает, а просто man содержит лишь поверхностное описание вызовов, или, напрамер для read, вообще ничего не написано. Я же хочу вызывать их через вектор 0x80, поэтому надо знать, в какой регистр какие параметры заносить.
Спасибо сказали:
Michael
Сообщения: 92

Re: параметры системных вызовов

Сообщение Michael »

zl3p писал(а):
18.11.2007 14:46
Я же хочу вызывать их через вектор 0x80, поэтому надо знать, в какой регистр какие параметры заносить.

А почему через вектор 0x80? Вроде системные вызовы давно через спец. инструкцию процессора делаются.
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10
Контактная информация:

Re: параметры системных вызовов

Сообщение BlackStar »

Фигасе вопрос начинающего, скорее всего тебе нужно смотреть исходники ядра, чтобы определить номер системного вызова и его аргументы. Интерфейс к сис.вызовам следующий: номер пишится в регистр EAX, параметры вызова кладутся в регистры: EBX, ECX, EDX, ..., результат вызова будет лежать в EAX.

UPD:
Michael это в том случае если эта инструкция существует на данном процессоре
LightLang Team
Спасибо сказали:
Serg79
Сообщения: 153
Контактная информация:

Re: параметры системных вызовов

Сообщение Serg79 »

Q: У юникса есть API ?
A: Да. Называется это системные вызовы (syscalls). Осуществляются они путем вызова прерывания номер 0x80. Кроме того, практически везде действует "lcall $7,$0" ("call 7:0" в синтаксисе интел) как его полный аналог. Так же в системе обязательно присутствует библиотека libc.

Q: Как передаются параметры системных вызовов?
A: Во FreeBSD параметры передаются через стек, сначала последний, затем предпоследний и первый параметр помещается в стек последним. Так же при использовании прерывания необходимо поместить в стек любое 32-битное значение. В Linux через регистры по порядку первый в EBX, и тд - ECX, EDX, ESI, EDI, EBP. Если количество параметров больше 6, то в памяти формируется структура с параметрами и в EBP помещается адрес этой стурктуры. В EAX в обоих случаях номер системного вызова. Если хотите использовать функции из libc, то передача параметров при этом осуществляется так как принято в Си (в мире Windows такой способ известен как CDECL). Результат всегда возвращается в EAX.

Q: Где узнать номера системных вызовов?
A: Самый простой способ для FreeBSD(должны быть установлены исходники системы!) - смотреть файл /usr/srs/sys/kern/syscalls.master. Там и номера и параметры. Способ для Linux - /usr/src/linux/arc/i386/kernel/syscall_table.S или файл entry.S из того же каталога для версий 2.4 и 2.6.

Q: Где найти описания системный вызовов или функций libc?
A: Как обычно в юникс - справочник man (например man 2 write) или info.

Оригинал находиться по адресу: FAQ по ассемблеру в юниксах.
Спасибо сказали:
Ответить