Articles of x86 64

使用MAP_NORESERVE的mmap是否保留物理内存?

mmap文档在关于标志MAP_NORESERVE的说明如下。 不要为这个映射保留交换空间。 当交换空间被保留时,可以保证可以修改映射。 当交换空间未被保留时,如果没有可用的物理内存,则可以在写入时获得SIGSEGV。 我实际上想要的只是保留虚拟内存地址,并没有分配实际的物理内存。 这可以通过使用MAP_NORESERVE的mmap来完成吗? 如果我想要使用任何物理内存,我将使用MAP_NORESERVE通过mmap中的地址范围内的MAP_FIXED重新映射它。 总而言之,我希望内核不会为MAP_NORSERVE标志的mmap分配的内存预留任何物理页面。 它是否真的像这样工作,或者如果内核具有足够的物理内存,内核是否分配物理页面?

过程连接表和全局抵销表

我正在读PLT(过程连接表)和GOT(全局抵消表)这篇文章 。 虽然PLT的目的很清楚,但我仍然对GOT感到困惑。 我从文章中了解到,只有在共享库中声明为externvariables才需要GOT。 对于在共享库代码中声明为static全局variables,这不是必需的。 我的理解是正确的,还是我完全忽略了这一点。

用AT&T语法打印一个整数作为string,用Linux系统调用代替printf

我写了一个汇编程序来显示AT&T语法后的一个数字的阶乘。但它不工作。我的代码 .text .globl _start _start: movq $5,%rcx movq $5,%rax Repeat: #function to calculate factorial decq %rcx cmp $0,%rcx je print imul %rcx,%rax cmp $1,%rcx jne Repeat # Now result of factorial stored in rax print: xorq %rsi, %rsi # function to print integer result digit by digit by pushing in #stack loop: movq $0, %rdx […]

如何将Linux 32位gcc内联汇编转换为64位代码?

我试图在Linux中使用gcc将RR0D Rasta Ring 0 Debugger从32位模式转换为64位模式(长模式)。 我熟悉x86 32位程序集(在MS-DOS环境下),但我是x86 64位程序集和Linux汇编程序devise的初学者。 此项目是为生产使用(我需要一个工作的非源代码debugging器),但我也试图学习如何做32位到64位转换。 如果可能的话,我试图find一种通用的方法来进行32位到64位的转换,这些转换可以在任何使用正则expression式的32位程序上完成(这样可以自动化)。 我知道没有一个通用的解决scheme(64位代码可能比32位代码占用更多的空间,并消耗更多的堆栈等),但即使在这种情况下,自动转换的代码将作为一个起点。 这个想法是保持8位和16位操作数,并用64位操作数replace32位操作数。 这种方法自然会失败,如果pushw %ax; pushw %bx; popl %ecx pushw %ax; pushw %bx; popl %ecx pushw %ax; pushw %bx; popl %ecx被pushw %ax; pushw %bx; popq %rcxreplacepushw %ax; pushw %bx; popq %rcx pushw %ax; pushw %bx; popq %rcx pushw %ax; pushw %bx; popq %rcx ,但行为良好的程序通常不会push两个16位操作数,然后pop一个32位操作数,或者他们? 到目前为止,这些转换是: 编辑:修正: […]

Python GetModuleHandleW OSError:无法find指定的模块

以下代码会生成错误: OSError:[WinError 126]无法find指定的模块 windll.kernel32.GetModuleHandleW.restype = wintypes.HMODULE windll.kernel32.GetModuleHandleW.argtypes = [wintypes.LPCWSTR] KERNEL32 = windll.GetModuleHandleW("C:\\Windows\\System32\\kernel32.dll") 但是,如果我使用 KERNEL32 = windll.LoadLibrary("C:\\Windows\\System32\\kernel32.dll") DLLfind了,但是我遇到了下面的代码不同的错误: LoadLibAddy = windll.kernel32.GetProcAddress(KERNEL32, "LoadLibraryA") 产生的错误是: ctypes.ArgumentError:参数1:不知道如何转换参数1 我希望有人会对如何解决这些错误有一个想法。 完整的脚本: from ctypes import * from ctypes import wintypes def dllinjector(processID, DLL_NAME): KERNEL32 = WinDLL('kernel32.dll', use_last_error=True) KERNEL32.GetProcAddress.restype = c_void_p KERNEL32.GetProcAddress.argtypes = (wintypes.HMODULE, wintypes.LPCSTR) PROCESS_CREATE_THREAD = 0x0002 PROCESS_QUERY_INFORMATION = 0x0400 PROCESS_VM_OPERATION = […]

从.exe在AMD64上安装pyaudio

我想在我的Windows 8 x64机器上安装pyaudio。 我有Python 2.7 x64安装。 从源头上build设对我来说不是一种select,无论如何,我已经看到,对其他人来说,这是失败的。 http://www.lfd.uci.edu/~gohlke/pythonlibs/中的Python 2.7 x64 .exe不起作用。 有另一种方法来安装? 有没有其他地方可以下载? 谢谢!

如果在64位代码中使用32位int 0x80 Linux ABI会发生什么情况?

Linux上的int 0x80总是调用32位ABI,而不pipe它是从哪个模式调用的:args in ebx , ecx ,…和/usr/include/asm/unistd_32.h系统调用号。 (或在没有CONFIG_IA32_EMULATION情况下编译的64位内核崩溃)。 64位代码应该使用syscall ,来自/usr/include/asm/unistd_64.h调用编号以及rdi , rsi等中的参数。请参阅x86-64上的UNIX和Linux系统调用的调用约定是什么 。 如果您的问题被标记为重复的, 请参阅该链接了解如何以32位或64位代码进行系统调用。 如果你想了解究竟发生了什么,请继续阅读。 syscall系统调用比int 0x80系统调用要快,因此除非要编写多边形机器代码,而是在32位或64位执行时运行,否则请使用本机64位syscall 。 ( sysenter始终以32位模式返回,所以从64位用户空间无用,尽pipe它是有效的x86-64指令。) 使用int 0x80可以编写以32位或64位模式组装的东西,所以在microbenchmark之后的exit_group()方便使用。 当前正式的i386和x86-64 System V的PDF文件,psABI文档标准化的函数和系统调用约定从https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI链接。 有关初学者指南,x86手册,官方文档和性能优化指南/资源,请参阅x86标记wiki。 但是,由于人们不断地用64位代码中使用int 0x80代码发布问题,或者意外地从32位源代码 构build了64位二进制代码,我不知道现在的Linux 究竟发生了什么? int 0x80保存/恢复所有的64位寄存器? 它是否截断任何寄存器到32位? 如果你传递了非零上半部分的指针参数,会发生什么? 如果你通过它的32位指针是否工作?

x86-64 System V ABI在哪里logging?

x86-64 System V ABI(用于Windows以外的所有应用程序)曾用于生存在http://x86-64.org/documentation/abi.pdf ,但是该网站现在已经从互联网上掉下来了。 这个文件是否有一个新的权威之家?

x86-64 Linux中不再允许32位绝对地址?

64位Linux默认使用小内存模式,这将使所有的代码和静态数据低于2GB的地址限制。 这确保您可以使用32位绝对地址。 老版本的gcc使用静态数组的32位绝对地址来保存一个额外的相对地址计算指令。 但是,这不再起作用。 如果我试图在程序集中创build一个32位的绝对地址,我得到链接器错误:“在创build共享对象时不能使用对`.data的重定位R_X86_64_32S;使用-fPIC重编译”。 这个错误信息当然是误导性的,因为我没有创build一个共享对象,-fPIC也没有帮助。 到目前为止我发现的是:gcc版本4.8.5使用静态数组的32位绝对地址,gcc版本6.3.0不使用。 版本5可能不会。 binutils 2.24中的链接器允许使用32位绝对地址,而2.28版不支持。 这种改变的后果是,旧的库必须重新编译,旧的汇编代码被破坏。 现在我想问一下:这个改变是什么时候发生的? 有logging吗? 有没有一个链接器选项,使其接受32位绝对地址?

我可以在Windows上加载一个32位DLL到64位进程吗?

我最近升级了ac#windows服务作为64位.net进程运行。 通常情况下,这将是微不足道的,但系统使用C ++编写的32位DLL。 这不是一个select将此DLL转换为64位,所以我将DLL包装在一个单独的32位.net进程,并通过远程处理暴露.net接口。 这是一个相当可靠的解决scheme,但是我宁愿将系统作为单个进程运行。 有什么办法可以加载我的32位DLL到64位进程,并直接访问它(也许通过某种thunking层)?