Реализация на системни повиквания

Ако потребителско приложение направи системно повикване, се задейства софтуерно прекъсване/изключение. Как мога да видя изходния код за генериране на софтуерно прекъсване?


person user1458471    schedule 08.10.2012    source източник
comment
Вероятно трябва да търсите източника на библиотеката (напр. libc, GNU libc или uClibc), а не източника на ядрото.   -  person sawdust    schedule 08.10.2012


Отговори (3)


Обяснено е в Linux Assembly Howto. И трябва да прочетете страницата syscall в Уикипедия (и също за VDSO), а също и intro(2) & syscalls(2) man страници. Вижте също този отговор и това един. Вижте и вътре Gnu Libc & musl-libc изходен код. Научете се също да използвате strace, за да разберете кои системни повиквания са направени от дадена команда или процес.

Вижте също конвенциите за повикване и спецификацията на двоичния интерфейс на приложението, приложима за вашата система. За x86-64 е тук.

person Basile Starynkevitch    schedule 08.10.2012
comment
В момента Linux Assembly Howto все още обяснява остарелия int 0x80 вместо syscall. - person ceving; 24.11.2013
comment
@ceving: Да. Чувствайте се свободни да допринесете за този Assembly HowTo, за да го подобрите. Но вярвам, че малко хора се интересуват от асемблирането в наши дни, защото компилаторите дават по-добър код, отколкото човек може да напише, и поради VDSO... - person Basile Starynkevitch; 24.11.2013
comment
Съвсем същото е. Различават се само номерата и регистрите. exit(n) е eax=60 edi=n syscall вместо eax=1 ebx=n int0x80. - person ceving; 24.11.2013

много отдавна имаше int 0x80 капан за влизане в ядрото, но днес sysenter е за предпочитане.

можете да получите кода, като изхвърлите раздела vsyscall, който се нанася във всеки процес автоматично от ядрото.

$ cat /proc/self/maps 
blah blah blah
...
blah blah blah
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

за повече информация вижте тази статия

person Zang MingJie    schedule 08.10.2012

Софтуерно прекъсване може да бъде задействано с инструкцията за асемблиране на Intel x86 int n, където n е номерът на прекъсването. Системното повикване е специален случай на софтуерно прекъсване; в можете ръчно да направите системно извикване от

mov eax, m
int 0x80

където m трябва да се замени с номера на прекъсването. Ето списъци с 32-битови системни номера и 64-битови номера на syscall, които са свързани към онлайн страници с ръководство за всяка функция. Трябва също така да подадете параметри към syscall чрез други регистри (ebx, ecx и т.н.) и можете да прочетете повече за това тук.

Това е най-общият начин за извършване на системни извиквания, защото е независим от външни библиотеки, като libc, и можете да го приложите в C/C++, ако трябва, като използвате вградено асемблиране.

person emprice    schedule 08.10.2012
comment
Това е специфичен за изпълнението отговор на общ въпрос. - person Chris Stratton; 08.10.2012
comment
Връзките са прекъснати. Може би е по-добре да посочите директно източника на ядрото: 32 бита и 64 бита - person ceving; 24.11.2013