syscall指令_使用 syscall/sysret 指令

博客展示了sysret函数的代码实现。该函数会根据不同条件进行异常处理,如系统调用扩展禁用、保护模式禁用等。在64位模式下,根据操作数大小决定返回64位代码或兼容模式;在兼容或传统模式下,按特定规则设置代码段选择器等参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void sysret()

{

if (EFER.SCE == 0)          /* System Call Extension is disable */

do_exception_UD();

if (CR0.PE == 0 || CS.attribute.DPL != 0)  /* protected mode is disable or CPL != 0 */

do_exception_GP();

if (CS.attribute.L == 1)       /* 64-bit mode */

{

if (REX.W == 1)            /* 64-bit operand size */

{

/*

* return to 64-bit code !

*/

CS.selector = STAR.SYSRET_CS + 16;     /* 64-bit code segment selector */

CS.selector.RPL = 3;                   /* CPL = 3 */

CS.attribute.L = 1;

CS.attribute.D = 0;

CS.attribute.P = 1;

CS.attribute.DPL = 3;

CS.base = 0;

CS.limit = 0xFFFFFFFF;

rip = rcx;                           /* restore rip for return */

} else {

/*

* return to compatibility !

*/

CS.selector = STAR.SYSRET_CS;        /* 32-bit code segment selector */

CS.selector.RPL = 3;

CS.attribute.L = 0;                  /* compatibility mode */

CS.attribute.D = 1;                  /* 32-bit code */

CS.attribute.P = 1;

CS.attribute.C = 0;

CS.attribute.R = 1;

CS.attribute.DPL = 3;

CS.base = 0;

CS.limit = 0xFFFFFFFF;

rip = (unsigned long long)ecx;

}

SS.selector = START.SYSRET_CS + 8;       /* SS selector for return */

rflags = r11;                            /* restore rflags */

/* goto rip */

} else {                       /* compatibility or legacy mode */

CS.selector = STAR.SYSRET_CS;        /* 32-bit code segment selector */

CS.selector.RPL = 3

CS.attribute.L = 0;                  /* compatibility mode */

CS.attribute.D = 1;                  /* 32-bit code */

CS.attribute.P = 1;

CS.attribute.C = 0;

CS.attribute.R = 1;

CS.attribute.DPL = 3;

CS.base = 0;

CS.limit = 0xFFFFFFFF;

SS.selector = STAR.SYSRET_CS + 8;

rflags.IF = 1;

rip = (unsigned long long)ecx;

}

}

cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 25 model : 33 model name : AMD Ryzen 5 5600 6-Core Processor stepping : 2 microcode : 0xa20120e cpu MHz : 3493.436 cache size : 512 KB physical id : 0 siblings : 1 core id : 0 cpu cores : 1 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 16 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero wbnoinvd arat umip pku ospke vaes vpclmulqdq rdpid overflow_recov succor fsrm bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass srso bogomips : 6986.87 TLB size : 2560 4K pages clflush size : 64 cache_alignment : 64 address sizes : 45 bits physical, 48 bits virtual power management: processor : 1 vendor_id : AuthenticAMD cpu family : 25 model : 33 model name : AMD Ryzen 5 5600 6-Core Processor stepping : 2 microcode : 0xa20120e cpu MHz : 3493.436 cache size : 512 KB physical id : 2 siblings : 1 core id : 0 cpu cores : 1 apicid : 2 initial apicid : 2 fpu : yes fpu_exception : yes cpuid level : 16 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ibpb vmmcall fsgsbase bmi1 avx2 smep
最新发布
03-12
### 不同指令集架构 ISA 对应的访管指令 #### ARM 架构下的访管指令 在 ARM 架构中,用于进入管理模式的关键指令是 `SVC`(Supervisor Call)。该指令允许应用程序请求内核服务,在执行此指令时会触发异常并切换到特权模式[^2]。 ```assembly svc #0x1234 ; 执行 SVC 调用来发起系统调用 ``` #### MIPS 构架下的访管指令 MIPS 使用 `syscall` 指令来进行类似的管理状态转换操作。当程序执行这条指令的时候也会引发一个特定类型的异常事件从而让控制权转移到操作系统那里去处理相应的请求[^3]。 ```assembly syscall ; 发起系统调用 ``` #### x86/AMD64 架构下的访管指令 对于基于 Intel 或 AMD 的 CPU 来说,则主要依赖于 `int n` 和 `syscall/sysret` 这样的机制来实现类似的功能。其中最常用的是中断门描述符触发软中断的方式以及更高效的快速系统调用路径[^1]。 ```nasm ; 传统方式使用 int $0x80 实现 Linux 下的系统调用 mov eax, 1 ; syscall number for sys_write mov ebx, 1 ; file descriptor (stdout) mov ecx, msg ; message to write mov edx, len ; length of message int 0x80 ; make the system call via interrupt ; 现代方法采用更快捷的 syscall 指令 syscall ; modern fast path for making a system call on Unix-like systems ``` #### RISC-V 架构下的访管指令 RISC-V 提供了专门的 `ecall` 指令用于环境调用(Environment Call),它能够使用户态的应用向更高权限级别的软件发出请求,比如操作系统的服务函数调用等[^4]。 ```riscv ecall ; invoke an environment call or supervisor request in RISC-V ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值