{{stub}} Mit '''''syscall''''' und '''''sysret''''' stehen im [[Long Mode]] zwei Instruktionen zur Verfügung mit deren Hilfe schnelle Wechsel in Ring 0 bzw. Ring 3 möglich sind. == Anforderungen == Für die Verwendung von syscall und sysret müssen Code- und Stack-Segmente in einer ganz bestimmten Reihenfolge liegen. Es muss das Segment für den Kernel Stack direkt hinter dem Kernel Code Segment liegen: #Kernel Code #Kernel Stack ''(Daten)'' So dass ''KERNEL_SS = KERNEL_CS + 8'' gilt. Für den User Mode muss ein eventuell vorhandenes 32 Bit Code Segment direkt vor dem Stack Segment und das 64 Bit Code Segment direkt dahinter liegen: #User Code 32 Bit #User Stack ''(Daten)'' #User Code 64 Bit So dass gilt ''USER_SS = USER_32_CS + 8'' bzw. ''USER_64_CS = USER_32_CS + 16''. == Initialisierung == '''MSR.STAR''' ''(0xc000 0081)'' {| {{prettytable}} width='500px' ! width='25%' | 63 – 48 ! width='25%' | 47 – 32 ! width='50%' | 31 – 0 |- | SYSRET_CS | SYSCALL_CS | bgcolor='#ccc'| |} '''MSR.LSTAR''' ''(0xc000 0082)'' {| {{prettytable}} width='500px' ! 63–0 |- | Ziel für 64 Bit Code |} '''MSR.CSTAR''' ''(0xc000 0083)'': {| {{prettytable}} width='500px' ! 63–0 |- | Ziel für 32 Bit Code |} == syscall == Die ''syscall'' Instruktion veranlasst einen Wechsel in Ring 0. Dabei wird die Rücksprungadresse in ''RCX'' gesichert. Das ''CS'' Register wird mit ''STAR.SYSCALL_CS'' und ''SS'' mit ''STAR.SYSCALL_CS + 8''. Wird ''syscall'' aus dem 32 Bit-Modus heraus aufgerufen wird ''RIP'' mit ''CSTAR'' geladen, aus dem 64 Bit-Modus heraus mit ''LSTAR''. == sysret == Mit der ''sysret'' Instruktion wechselt die CPU in Ring 3 und lädt ''RIP'' bzw. ''EIP'' mit dem Wert aus ''RCX''. Das ''SS'' Register wird mit ''STAR.SYSRET_CS + 8'' geladen und ''CS'' mit ''STAR.SYSRET_CS'' bzw. ''STAR.SYSRET_CS'' + 16. Um in den 64 Bit User Mode (Ring 3) zu wechseln braucht es die Opcodes 48 0f 07. NASM: o64 sysret GNU/As: sysretq In den 32 Bit User Mode (Ring 3) wechselt man mit den Opcodes 0f 07. NASM und GNU/As: sysret [[Kategorie:x86-64]]