Articles of x86 64

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层)?

Linux AMD64中使用的fs / gs寄存器如何?

在x86-64架构上,两个寄存器有一个特殊用途:FS和GS。 在linux 2.6。*中,FS寄存器似乎被用来存储线程本地信息。 那是对的吗? 什么是存储在FS:0? 有没有描述这个内容的C结构? 什么是GS的使用?

是什么导致页面错误?

根据维基百科 : 页面错误是当程序访问虚拟地址空间中映射的页面但不加载到物理内存中时硬件引发的软件陷阱。 (重点是我的) 好的,这是有道理的。 但是,如果是这样的话,为什么每当Process Hacker中的进程信息被刷新时,我就看到大约15页错误? 或换句话说,为什么有任何记忆被分页? (我不知道它是用户还是内核内存。)我没有页面文件,内存使用量是4 GB中的1.2 GB,这是干净的重新启动之后。 没有任何资源短缺, 为什么会有东西被分页?

什么是x86_64 va_list结构的格式?

任何人都可以参考x86_64 ABI(在Linux上使用的)中的va_list的表示? 我试图debugging一些代码堆栈或参数似乎损坏,这将有助于了解我应该看到什么…

在Windows 64位上将mod_wsgi模块加载到apache的问题

我试图按照这个指令安装mod_wsgi模块。 我已经从这个源下载了mod_wsgi.so。 看起来像apache无法正确地重新启动服务,并且在将以下行添加到httpd.conf后无法加载该页面 LoadModule wsgi_module modules/mod_wsgi.so 我已经从一些来源检查了一些问题,如下所示: 文件名是正确的 – mod_wsgi.so不是mod_wsgi.so.so 该文件的权限设置为与正确加载的其他模块相同 Python为所有用户安装 环境: WindowsServer®Standard FE 64位 WAMP 2.0上的Apache 2.2.8 Python 2.7.1为所有用户安装 不加载这个模块,Apache运行正常。 我的问题是什么? 应用程序error.log: [Mon May 23 10:12:20 2011] [notice] Parent: Received shutdown signal — Shutting down the server. [Mon May 23 10:12:20 2011] [notice] Child 4528: Exit event signaled. Child process is ending. [Mon […]