LINUX.ORG.RU

Распознание системного вызова


1

1

Где бы почитать про спецификацию системных вызовов? Ну, как это вообще делается. Инструкция int 0x20, кажется, а как передаются аргументы? Большое спасибо за любую финформацию по этому поводу :)

ну у тебя есть типа массив в котором записаны адреса функций - номер сыскола это офсет от начала массива - доступ к таблице осуществляется через софтверное прерывание - параметр прерывания(номер сыскола) передается обычно через регистр .. параметры самого сыскола передавать можно как угодно - через стек(как в FreeBSD), через регистры(как в Linux) или еще как нить .. обычно это единственный механизм для входа в более низкое кольцо ..

lg ★★
()
Ответ на: комментарий от lg

Нет, я понимаю, но хотелось бы конкретики - через какие именно регистры, в каком виде, что и сколько?....

Debugger
() автор топика
Ответ на: комментарий от Debugger

ну не знаю - через bx cx dx ex fx :) наверное .. там в линуксе насколько я знаю некоторые сысколы у которых много(больше пяти вроде) параметров используют еще стек в добавок .. понятно что при передачи через регистер на 32 битной платформе ты не передашь больше 32 бит .. но там обычно либо поинтер либо int либо чето такое передается .. во фряхи сделано на мой взгляд попизже - там каждый сыскол имеет свою структурку какие типа там параментры и обработчик софтверного прерывания формирует соответсвующие структурки и подает в сысколы - понятно что это немного помедленнее, но зато код выглядит аккуратно без всяких syscall0, syscall1, etc([1]) граблей и расширабельней .. например не проблема вкрутить фишку типа систему сообщений как в Dragonfly .. которая позволяет даже не знать локально ли выполнился сыскол или на ремоутной тачке

Refs:
[1] man 2 intro

lg ★★
()
Ответ на: комментарий от lg

На IA32 в ebx, ecx, edx, esi, edi

макросы описаны в /usr/include/asm/unistd.h ассемблерными вставками.

когда параметров больше 5, то в ядро передается указатель на структуру, содержащую параметры. то, как по умолчанию передаются параметры в свободных BSD (кстати, очень неэффективно). в ядро входят на IA-32 через int 0x80 или sysenter, в режиме эмуляции также есть вариации lcall (на самом деле шлюз вызова 0x7 или 0x27 в LDT) вроде описанного в iBCS2.

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.