问题标签 [sysenter]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - CPU 使用 attributesOfItemAtPath:error 引发:
我正在使用[NSFileManager attributesOfItemAtPath:error:]
函数来获取文件的属性。但有时我的应用程序 cpu 会达到 100%。我将此功能用于 100k(大约)个文件。
我的应用程序示例:
谁能帮帮我?
linux - 如何在 Linux 中禁用 SYSENTER 系统调用支持并仅使用 int $0x80
我正在尝试禁用SYSENTER
系统调用支持,并让所有系统调用通过 Linux 中的中断回退int $0x80
,而不使用任何 ptrace。
我找到了两种方法:</p>
/proc/sys/vm/vdso_enabled
通过将文件修改为 0来完全禁用 VDSO- 调整
/usr/src/linux/arch/x86/vdso/vdso32-setup.c
修改 VDSO(虚拟动态共享对象)应该是我方法中的方法,但我不知道要修改哪一行。有人可以给我任何建议吗?
谢谢你。
linux - 32 位 Linux 上的 Syscall 或 sysenter?
从 MS‑DOS 开始,我就知道使用中断进行系统调用。在旧论文中,我看到了int 80h
在 Linux 上调用系统函数的参考。很长一段时间以来,我知道int 80h
不赞成使用该syscall
指令。但我无法让它在我的 32 位机器上运行。
问题
syscall
指令只能在 64 位平台上使用吗?32位Linux不使用syscall
吗?
样品测试
在我的 32 位 Linux(Ubuntu Precise)上,该程序以核心转储终止:
我试过用sysenter
而不是syscall
,但它以同样的方式崩溃。
windows - Windows 7 x86 使用 sysenter 执行直接系统调用
我正在尝试编写一些程序来直接调用系统调用而不通过 ntdll.dll
我的代码(Visual Studio 语法...):
当程序尝试执行 sysenter 指令时,程序会因访问冲突而崩溃:
我试图在所需的系统调用中使用内核调试器放置一个硬件断点,但执行流程没有到达那里......
我猜这个问题与堆栈顺序/深度有关。
非常感谢!
解决了:
我想问题是我试图在不加载 user32 和 gdi32 dll 的情况下执行 win32k 系统调用。
刚刚添加:
问题解决了..
如果有人对为什么在不加载这些 dll 的情况下会发生这种情况有更好的了解,我会很高兴知道 :)
linux - Linux系统调用寄存器保存
我有两个关于 32 位 Linux 系统调用的简单问题。
在 x86 Linux 中,调用系统调用有两种方式。
第一个使用 int 0x80,另一个是 sysenter。
我知道这两者之间的基本概念区别(sysenter 使用 SYSENTER_MSR_EIP、SYSENTER_MSR_ESP 寄存器、int 0x80 使用中断表、sysenter 提供更好的性能等...)
我的问题是...
从程序员的角度来看,int 0x80 和 sysenter 之间有什么功能区别吗?(即调用约定,对内存布局的副作用,或其他...)
从系统调用返回后,除了 EAX 寄存器之外,是否有任何系统调用发生变化?
先感谢您。
linux - 为什么linux内核在使用sysenter/sysexit时不恢复所有寄存器?
在linux kernel 2.6.11中,使用sysenter进行系统调用时,几乎和init 0x80一样,使用save_all将所有寄存器压入内核栈,但是调用完成后,如果没有设置相关标志,我们使用 sysexit 返回,但不恢复所有已保存在堆栈上的寄存器。
某些系统调用可能会更改寄存器值,为什么我们不需要重新设置所有寄存器
我已经阅读了相应的 i386 文档,它说
“Intel386 上的所有寄存器都是全局的,因此对调用函数和被调用函数都是可见的。寄存器 %ebp、%ebx、%edi、%esi 和 %esp“属于”调用函数。换句话说,被调用函数“
所以保存工作是 glibc 包装函数的责任,我已经阅读了一些 glibc 代码来确保它。所以在使用sysenter/sysexit做系统调用的时候,我们先将%ebp,%edx,%ecx压入用户栈是有道理的,因为%edx和%ecx不在保存寄存器中,需要等完成后再恢复系统调用,我们在调用系统服务例程之前也使用 %ebp 来保存用户堆栈指针,所以我们需要恢复它来传递参数
system-calls - Sysenter 结果在 SIGILL 信号中。如何在 A x86_64 上测试 Int0x80 / Sycall / Sysenter?
.
我有一个学校项目,在 x86_64 OpenSUSE 上重新编码类似 strace 的命令。(英特尔 i7)
为此,我们当然使用 ptrace 系统调用,但禁止使用 PTRACE_SYSCALL。由于 PTRACE_PEEKTEXT 和与系统调用指令相对应的操作码(0x80CD 用于 int0x80,0x050F 用于 syscall,0x340F 用于 sysenter),我们必须使用 PTRACE_SINGLESTEP 并检测系统调用。
直到那里,我很好。但是接下来我们必须获取系统调用的参数。对于 syscall 和 intx80 这很简单,我查看 rax 以了解它是哪个系统调用,然后查看 rdi、rsi、rdx 等。
但是对于 sysenter 我找不到它是如何真正工作的。所以我尝试编写一个小汇编程序来测试这 3 条指令。
效果很好!
现在对于 int 0x80 版本,我只是将 rax 中的系统调用编号从 1 更改为 4。(在 32 中,不知道为什么,但系统调用编号不一样)
其工作率为 50%。显示一个字符串,但它是垃圾。
现在,如果我放一个 sysenter,我会收到一个 SIGILL 信号。我在 rax 中尝试了 1 和 4。
我的项目只需要在我的计算机上运行,但我必须能够检测和分析使用 sysenter 的二进制文件
有人可以对这些事情进行一些解释吗?
谢谢 !
Ps:对不起我的英语不好
assembly - SYSENTER 在 64 位模式下如何使用,IA32_SYSENTER_CS 是什么?
阅读 SYSENTER 指令的描述,我发现了以下内容:
IA32_SYSENTER_CS
包含环 0 代码段 (CS)
我以为64位系统现在使用虚拟内存地址方案(分页),基本上不再依赖代码段(CS)寄存器。IA32_SYSENTER_CS
有人可以解释一下注册表中究竟包含什么吗?
windows - 为系统调用挂钩 Windows 内核调度程序
我正在尝试SYSENTER
从内核中挂钩调度功能,在过去的几天里,我正在研究程序执行SYSENTER
并想要进入内核时会发生什么,然后我意识到IA32_SYSENTER_EIP
并IA32_SYSENTER_ESP
负责设置内核RIP
和RSP
之后SYSENTER
。
昨天我阅读了英特尔软件开发人员手册SWAPGS
:
SWAPGS 将当前 GS 基址寄存器值与 MSR 地址 C0000102H (IA32_KERNEL_GS_BASE) 中包含的值交换。SWAPGS 指令是供系统软件使用的特权指令。
当使用 SYSCALL 实现系统调用时,在 OS 入口点没有内核栈。也没有一种直接的方法来获取指向内核结构的指针,从中可以读取内核堆栈指针。因此,内核无法保存通用寄存器或参考内存。
从第二段开始,there is no kernel stack at the OS entry point
似乎操作系统内核执行SWAPGS
设置GS
然后获取内核堆栈指针,但正如我所读到的,SYSENTER
内核中的 RIP(EIP) 和 RSP (ESP) 应该设置从IA32_SYSENTER_EIP
,IA32_SYSENTER_ESP
因此内核的堆栈指针在IA32_SYSENTER_ESP
!
我的问题:
- 如果内核堆栈地址应该来自GS,那么目的是
IA32_SYSENTER_ESP
什么? AMD LSTAR (0xC0000082)
和 和有什么区别IA32_SYSENTER_EIP
?我问它是因为我看到 Windows 在我的英特尔处理器上设置了 0xc0000082。- 挂钩内核SYSENTER调度程序是否有任何特殊问题?这是因为每当我在负责在远程调试机器(不是VM)上调度SYSENTER调用(KiSystemCall64Shadow)的Windows函数中放置断点时,它都会导致带有UNEXPECTED_KERNEL_MODE_TRAP的BSOD。
c++ - 内联汇编中的 C++ SYSENTER x86 调用
我即将学习 x86 上的 sysenter 是如何工作的。我在 x86 平台上创建了一个简单的控制台应用程序,它应该在内联汇编中手动调用 NtWriteVirtualMemory 函数。
我从这里的代码开始,但似乎编译器不理解操作码“sysenter”,所以我决定_emit
使用 sysenter 的字节。(也许我需要在我的项目设置中更改某些内容?)它编译但是当它大约调用函数visual studio给我一个错误,我ret
在执行时是一条非法指令,程序停止。
有人知道如何正确地做到这一点吗?