首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核之旅张凯捷——系统调用分析(2)

(4)将ia32_sysenter_target(sysenter指令的接口函数)设置到MSR_IA32_SYSENTER_EIP。...3.2 sysenter和sysexit的指令操作 在Ring3的代码调用sysenter指令之后,CPU做出如下操作: 将SYSENTER_CS_MSR的值装在到cs寄存器。...3.3 sysenter的系统调用处理 3.3.1 linux2.6.39内核sysenter系统调用 正如刚才对IA32_SYSENTER_EIP寄存器中传入sysenter的系统调用函数入口地址ia32...3.3.2 linux4.20内核sysenter系统调用 在linux4.20内核中,对IA32_SYSENTER_EIP寄存器中传入的是entry_SYSENTER_32函数。...sysexit ... entry_SYSENTER_32()函数主要工作: (1)之前说到sysenter指令会将SYSENTER_ESP_MSR的值装载到esp寄存器,但是里面保存的是sysenter_stack

1.8K20

sysentersysexit 原理

.从ring0到ring3最开始是用的int2E,此模式切换过程设计很多次内存访问,还有两次查表操作机访问权限的检查,这导致模式切换的开销很大从PentiumII 处理器开始,Inter引入了新的指令sysenter...sysenter使用3个MSR寄存器来指定跳转目的地址和栈位置。 可以在内核模式下通过 rdmsr/wrmsr 指令来设置这3个寄存器。(可想而知,在这可以HOOK) ?...HOOk代码: NTSTATUS HookSYSENTER() { _asm mov ecx,0x176; // IA32_SYSENTER_EIP 在MSR的偏移为...内部指令: 1.将IA32_SYSENTER_CS 和IA32_SYSENTER_EIP分别装到cs和eip寄存器中 2.将IA32_SYSENTER_CS+8 和IA32_SYSENTER_ESP...3.将IA32_SYSENTER_CS+24装载到ss寄存器中; 4.将ecx寄存器中的指针装载到esp中,切换到特权3. 5.sysenter / sysexit 只使用固定值,或寄存器的值来完成跳转

1.8K30
您找到你想要的搜索结果了吗?
是的
没有找到

用户层下API的逆向分析及重构

因为是在xp里面进行实验,这里就用od里面的调用进行分析实现 我们希望可以在自己的代码中直接使用 sysenter,但经过编写发现其并没有提供这种指令。...KiFastSystemCall: 7c92e4f0 8bd4 mov edx,esp 7c92e4f2 0f34 sysenter ntdll!...中断门进0环,需要的CS、EIP在IDT表中,需要查内存(SS与ESP由TSS提供) 而CPU如果支持sysenter指令时,操作系统会提前将CS/SS/ESP/EIP的值存储在MSR寄存器中,sysenter...KiSystemService API通过sysenter指令进0环: CS/ESP/EIP由MSR寄存器提供(SS是算出来的),进入0环后执行的内核函数:NT!...KiFastCallEntry 代码实现 因为这里_asm不支持 sysenter 指令,可以用 _emit 代替,在模拟调用CALL [0x7FFE0300]这条指令的时候需要填入调用函数的真实地址,

54010

用户层下API的逆向分析及重构

因为是在xp里面进行实验,这里就用od里面的调用进行分析实现 我们希望可以在自己的代码中直接使用 sysenter,但经过编写发现其并没有提供这种指令。...KiFastSystemCall: 7c92e4f0 8bd4      mov   edx,esp 7c92e4f2 0f34      sysenter ntdll!...当通过eax=1来执行cpuid指令时,处理器的特征信息被放在ecx和edx寄存器中,其中edx包含了一个SEP位(11位),该位指明了当前处理器是否支持sysenter/sysexit指令,进入od使用...中断门进0环,需要的CS、EIP在IDT表中,需要查内存(SS与ESP由TSS提供) 而CPU如果支持sysenter指令时,操作系统会提前将CS/SS/ESP/EIP的值存储在MSR寄存器中,sysenter...KiSystemService API通过sysenter指令进0环: CS/ESP/EIP由MSR寄存器提供(SS是算出来的),进入0环后执行的内核函数:NT!

79381

使用了零拷贝技术的Kafka,当然很快

系统调用为何那么耗时 那么哪些方式可以触发系统调用呢,在Linux系统下有这几种方式: “ 使用软件中断(Software interrupt)触发系统调用; 使用 SYSCALL / SYSENTER...有些汇编指令如SYSENTER 和 SYSCALL 是专门为系统调用设计的汇编指令,它们不需要在中断描述表(Interrupt Descriptor Table、IDT)中查找系统调用对应的执行过程,也不需要保存堆栈和返回地址等信息...使用软件中断触发的系统调用需要保存堆栈和返回地址等信息,还要在中断描述表中查找系统调用的响应函数,虽然多数的操作系统不会使用 INT 0x80 触发系统调用,但是在一些特殊场景下,我们仍然需要利用这一古老的技术; 使用汇编指令 SYSCALL / SYSENTER

45410

为什么 Linux 系统调用会消耗较多资源

为什么系统调用会带来这么大的额外开销,它在内部到底执行了哪些工作呢,本文将介绍 Linux 执行系统调用的三种方法: 使用软件中断(Software interrupt)触发系统调用; 使用 SYSCALL / SYSENTER...Linux 为了解决这个问题,在较新的版本使用了新的汇编指令 SYSENTER / SYSCALL,它们是 Intel 和 AMD 上用于实现快速系统调用的指令,我们会在 32 位的操作系统上使用 SYSENTER...与 INT 0x80 通过触发软件中断实现系统调用不同,SYSENTER 和 SYSCALL 是专门为系统调用设计的汇编指令,它们不需要在中断描述表(Interrupt Descriptor Table...使用软件中断触发的系统调用需要保存堆栈和返回地址等信息,还要在中断描述表中查找系统调用的响应函数,虽然多数的操作系统不会使用 INT 0x80 触发系统调用,但是在一些特殊场景下,我们仍然需要利用这一古老的技术; 使用汇编指令 SYSCALL / SYSENTER

1.8K40
领券