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

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

本篇文章将介绍和分析在指令层面上对系统调用响应速度的优化——快速系统调用指令,32位下使用的sysenter/sysexit;64位下使用的syscall/sysret,以及linux内核中为了支持这些快速系统调用指令所做的相关操作...- IA32_SYSENTER_ESP(175H):指定要执行的Ring0代码所使用的栈指针 (4)使用rdmsr/wrmsr读取和写入MSR 下面基于linux-2.6.39内核进行分析: 3.1...系统调用初始化 从linux内核启动流程入手:start_kernel() -> chenk_bugs() -> identify_boot_cpu() -> sysenter_setup() &...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函数。

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.7K30

内核地址空间大冒险:系统调用

1 开启冒险之旅 我是一个线程,出生在这个Linux帝国,今天我的任务是去执行一段人类用C语言编写的代码。...忙完上面的操作,我环顾四周,发现这房间里还有一道门,门上写着sysenter。 我小心翼翼的走了进去,突然,眼前闪过一道白光,紧接着光线消失,四周变得幽暗起来。...“到后来,一些新出现的帝国文明,像咱们的Linux帝国,还有Windows帝国等等,为了安全考虑,一方面把普通应用程序和帝国自身程序分开,普通应用程序执行的地方叫用户态地址空间,而帝国核心程序运行的地方叫内核地址空间...是不是就是那个sysenter指令,通过它进入的?",我恍然大悟。 “对,没错!”。...对了大叔,你也是从那个sysenter虫洞穿越过来的吗?” “我是从虫洞过来的,不过不是sysenter哦,而是···哦我还有事要忙,就此别过吧”,说完匆忙离去。 我大吃一惊!难道还有别的虫洞?

66810

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

系统调用为何那么耗时 那么哪些方式可以触发系统调用呢,在Linux系统下有这几种方式: “ 使用软件中断(Software interrupt)触发系统调用; 使用 SYSCALL / SYSENTER...有些汇编指令如SYSENTER 和 SYSCALL 是专门为系统调用设计的汇编指令,它们不需要在中断描述表(Interrupt Descriptor Table、IDT)中查找系统调用对应的执行过程,也不需要保存堆栈和返回地址等信息...当然,使用虚拟动态共享对象(vSDO)执行系统调用性能更优越,这里涉及到Linux知识,不做细讲。 但是vSDO性能这么优良,无论什么情况下都使用vSDO可以么。当然不行。...使用软件中断触发的系统调用需要保存堆栈和返回地址等信息,还要在中断描述表中查找系统调用的响应函数,虽然多数的操作系统不会使用 INT 0x80 触发系统调用,但是在一些特殊场景下,我们仍然需要利用这一古老的技术; 使用汇编指令 SYSCALL / SYSENTER

44910

内核地址空间大冒险:系统调用

1开启冒险之旅 我是一个线程,出生在这个Linux帝国,今天我的任务是去执行一段人类用C语言编写的代码。...忙完上面的操作,我环顾四周,发现这房间里还有一道门,门上写着sysenter。 我小心翼翼的走了进去,突然,眼前闪过一道白光,紧接着光线消失,四周变得幽暗起来。...“到后来,一些新出现的帝国文明,像咱们的Linux帝国,还有Windows帝国等等,为了安全考虑,一方面把普通应用程序和帝国自身程序分开,普通应用程序执行的地方叫用户态地址空间,而帝国核心程序运行的地方叫内核地址空间...是不是就是那个sysenter指令,通过它进入的?",我恍然大悟。 “对,没错!”。...对了大叔,你也是从那个sysenter虫洞穿越过来的吗?” “我是从虫洞过来的,不过不是sysenter哦,而是···哦我还有事要忙,就此别过吧”,说完匆忙离去。 我大吃一惊!难道还有别的虫洞?

57410

用户层下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]这条指令的时候需要填入调用函数的真实地址,

53510

用户层下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!

77681

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

执行系统调用的三种方法: 使用软件中断(Software interrupt)触发系统调用; 使用 SYSCALL / SYSENTER 等汇编指令触发系统调用; 使用虚拟动态共享对象(virtual...Linux 为了解决这个问题,在较新的版本使用了新的汇编指令 SYSENTER / SYSCALL,它们是 Intel 和 AMD 上用于实现快速系统调用的指令,我们会在 32 位的操作系统上使用 SYSENTER...与 INT 0x80 通过触发软件中断实现系统调用不同,SYSENTER 和 SYSCALL 是专门为系统调用设计的汇编指令,它们不需要在中断描述表(Interrupt Descriptor Table...vDSO 虚拟动态共享对象(virtual dynamic shared object、vDSO)是 Linux 内核对用户空间暴露内核空间部分函数的一种机制[^16],简单来说,我们将 Linux 内核中不涉及安全的系统调用直接映射到用户空间...linux-vdso.so.1 (0x00007fff2709c000)

1.8K40
领券