Articles of x86 64

内部内核结构不能分配错误?

当我运行我写的程序时,我得到以下两个错误消息(它们的多个实例)。 程序很大,所以不能在这里显示。 无论如何,任何想法什么样的编程错误可以导致这些错误? 请注意,我在我的程序中同时使用了mmap和mprotect 。 Internal kernel structures could not be allocated. mprotect: Cannot allocate memory

如何在不修改程序的情况下通过fork启动一个进程的两个实例

我试图从一开始就从另一个进程中分离出一个进程。 为此,我试图修改glibc中的__libc_start_main函数(我使用了一个修改后的glibc),并试图将fork放在那里,但是无法编译glibc,因为每当我尝试这样做的时候都会报错。 什么是其他选项,为什么在__libc_start_main中插入fork不起作用? 再次注意到我想以一种不需要程序修改的方式来完成,那就是glibc中的修改是可以的,但不是程序。 在__libc_start_main ,我尝试像这样分叉。 if (__builtin_expect (! not_first_call, 1)) { struct pthread *self; fork(); // <– here self = THREAD_SELF; /* Store old info. */ unwind_buf.priv.data.prev = THREAD_GETMEM (self, cleanup_jmp_buf); unwind_buf.priv.data.cleanup = THREAD_GETMEM (self, cleanup); /* Store the new cleanup handler info. */ THREAD_SETMEM (self, cleanup_jmp_buf, &unwind_buf); /* Run the program. */ result […]

强制内存分配在64位Linux上从更高地址(> 4GB)分配

这里是我想要做的:我有一个为64位Linux构build的库。 然后我创build了一个链接该库的应用程序。 我想确保在运行应用程序时,从库中分配的内存始终位于较高的位置(> 4GB)。 在Windows上,用户可以强制分配以便在testing之前从较低地址分配较高地址,在调用VirtualAlloc时指定MEM_TOP_DOWN或将以下registry值设置为0x100000: HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Memory Management \ AllocationPreference 我不知道在Linux上是否有类似的策略。 我了解Linux内存pipe理与Window不同,但是我发现了一些线索,例如使用mmap()或者链接器脚本。 但是我一直无法实现这个目标。 任何人都可以提供更多的信息? #include <sys/mman.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) int main() { void *addr1=0, *addr2=0; long sz = sysconf(_SC_PAGE_SIZE); // get page […]

get_conf在x86_64体系结构上返回32位

在我的系统之一,我观察下面的输出。 root@base0-0-0-1-0-11-1:/root> uname -a Linux base0-0-0-1-0-11-1 2.6.34.12-kairos-ksc-dec02-1800 #2 SMP Mon Dec 2 17:48:50 IST 2013 x86_64 x86_64 x86_64 GNU/Linux root@base0-0-0-1-0-11-1:/root> getconf LONG_BIT 32 root@base0-0-0-1-0-11-1:/root> uname的输出表示系统是64位,而getconf则是32位。 这是不是有什么原因? 我在其他系统中证实没有发现这种不匹配。 请build议。 谢谢。

Syscalls for x86-64 Linux NASM(YASM)的详细说明

我find了x86-64模式(带参数)的系统调用列表: http : //filippo.io/linux-syscall-table/但是我在哪里可以得到这个系统调用的详细描述? 例如下面的例子中,除了0102o(rw,create)之外,哪些标志可以用于'open'系统调用,在其他情况下:只读,只写等。 SECTION .data message: db 'Hello, world!',0x0a length: equ $-message fname db "result" fd dq 0 SECTION .text global _start _start: mov rax, 2 ; 'open' syscall mov rdi, fname ; file name mov rsi, 0102o ; read and write mode, create if not mov rdx, 0666o ; permissions set syscall […]

即使二进制大小很大,64位C ++二进制文件也会消耗巨大的内存

当我们在32位编译我们的C ++应用程序时,一切都还好。 当我们将所有的东西移植到64位时,二进制文件的数量增加了一倍多! 当我们运行二进制文件时,只有一个运行,因为它占用了所有的RAM。 我们已经完成了所有的64位移植操作,以便编译成功。 但是,在运行时,内存消耗会达到极限。 它不会崩溃。 它只是运行,直到停止,并没有生成核心文件。 有没有人有什么build议,我应该开始调查呢? 我们的编译选项是: -D_linux _ -pthread -fexceptions -c -Wall -DSTL_HAS_DEFAULT_ARGS -DUsePthread -D_REENTRANT -Dx86_64 -DLINUX -g -O2 我们的Linux机器上的ulimit信息是: -bash-4.1$ ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 30405 max locked memory […]

pthread_detach()在64位Linux上导致SIGSEGV

这是我的情况的描述:我必须照顾我们的产品中的错误。 线程被创build为joinable ,它必须完成它的工作,终止,没有人会为它调用pthread_join() 。 所以线程是使用JOINABLE属性创build的(默认情况下),在终止之前调用下一个代码: { pthread_detach(pthread_self()); pthread_exit(NULL); } 它在我遇到的所有32位Linux发行版中都像一个魅力,但它导致了64位发行版(Ubuntu 13.04 x86_64和Debian)上的SIGSEGV 。 我没有尝试与Slackware。 这是一个核心: Core was generated by `IsaVM -s=1 -PrjPath="/home/taf/Linux_Fov_540148/Cmds" -stgMode=1 -PR -Failover'. Program terminated with signal 11, Segmentation fault. #0 0x00007f5911a7c009 in pthread_detach () from /lib/x86_64-linux-gnu/libpthread.so.0 (gdb) bt #0 0x00007f5911a7c009 in pthread_detach () from /lib/x86_64-linux-gnu/libpthread.so.0 #1 0x000000000041310d in _kerCltDownloadThr (StartParams=0x6bfce0 <RESFOV>) at […]

Linux x86_64汇编套接字编程

大家好。 所以我在学汇编 而且按照我平常学习的步骤,我select了新的语言,我已经到了与汇编的networking。 其中,遗憾的是没有那么好,因为我已经在第0步失败了,这将是一个可以开始沟通的套接字。 汇编代码应该大致等于下面的C代码: #include <stdio.h> #include <sys/socket.h> int main(){ int sock; sock = socket(AF_INET, SOCK_STREAM, 0); } (让我们忽略它现在不closures套接字的事实。) 所以这就是我迄今所做的: 检查了手册 。 这意味着我需要做一个socketcall()这是很好,很好。 问题开始于它将需要一个int ,它描述了它应该做什么样的socketcall。 调用manpage对此没有什么帮助,因为它只描述: 在某些体系结构上(例如,x86-64和ARM),没有socketcall()系统调用; 而socket(2),accept(2),bind(2)等实际上是作为单独的系统调用来实现的。 然而,在系统调用的原始列表中没有这样的调用 – 据我所知, socket() , accept() , bind() , listen()等是来自libnet而不是来自内核的调用。 这让我非常困惑,所以我决定编译上面的C代码,并用strace检查它。 这产生了以下结果: 套接字(PF_INET,SOCK_STREAM,IPPROTO_IP)= 3 虽然这并没有让我更接近知道什么socket() 是否解释了它的参数。 对于女巫,我似乎没有find适当的文件(再次)。 我以为PF_INET , SOCK_STREAM , IPPROTO_IP将在<sys/socket.h>定义,但我的grep -ing似乎没有find任何使用。 所以我决定通过使用gdb与disass main来find值。 这给了以下输出: […]

如何比较string中的字符与NASM x86_64 Linux程序集中的另一个字符

实际上,我试图理解英特尔x64语法中的NASM汇编的基本概念,但在尝试创build相当于strchr的同时面临一个问题。 我一直在航行networking获取最大的信息,但我不明白如何比较当前string(如str [我])与一个简单的字符。 这里是testing主要: #include <stdio.h> extern char* my_strchr(char*, char); int main(void) { char* str; str = my_strchr("foobar", 'b'); printf("%s\n", str); return 0; } 这里是我的汇编代码: 我假设rdi是我的string,rsi是我的单字节数据。 my_strchr: push rcx ;Save our counter xor rcx, rcx ;Set it to 0 loop: cmp rdi, byte 0 ;Check the end of string jz end cmp rsi, [byte rdi+rcx] […]

将非PIC对象链接到PIC对象的可执行文件是否有效?

我将一个线程局部variables添加到几个总是直接链接到可执行文件的对象文件。 这些对象将永远不会包含在共享库中(可以肯定的是,在可预见的将来,这是可以保证的)。 这意味着这些对象不需要-fPIC标志,对吗? 我们的代码库默认具有所有对象的-fPIC标志。 其中许多都包含在共享库中,因此使用-fPIC是有道理的。 但是,这个标志提出了debugging新线程局部variables的问题,因为GDB在使用-fPIC跨越线程局部variables时崩溃 。 如果我从这些带有新线程局部variables的对象文件中删除-fPIC,我可以正确debugging。 我找不到任何将非PIC对象与可执行文件中的PIC对象混合的权威性声明。 到目前为止,我的testing表明它没问题,但不会感到犹豫,在线讨论通常是“不要混合PIC和非PIC”,这是由于共享库的情况。 在这种情况下,将非PIC对象链接到由PIC对象和库构build的可执行文件中是否安全? 也许有一个海湾合作委员会文件的权威声明,这是安全的,但我找不到它。 编辑:二进制补丁海湾合作委员会,以避免这个错误是不是在短期内的解决scheme。 在Linux上切换编译器不是一个可行的解决scheme。