- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在学习 amd64 汇编程序,并尝试实现一个简单的 Unix 过滤器。由于未知原因,即使简化到最低限度版本(下面的代码),它也会随机崩溃。
我试图在 GNU 调试器 (gdb) 中调试这个程序。在 gdb 的默认配置中,程序运行良好,但如果我启用地址随机化 (set disable-randomization off
),程序开始崩溃 (SIGSEGV)。 list 中标记了有问题的指令:
format ELF64 executable
sys_read = 0
sys_write = 1
sys_exit = 60
entry $
foo:
label .inbuf at rbp - 65536
label .outbuf at .inbuf - 65536
label .endvars at .outbuf
mov rbp, rsp
mov rax, sys_read
mov rdi, 0
lea rsi, [.inbuf]
mov rdx, 65536
syscall
xor ebx, ebx
cmp eax, ebx
jl .read_error
jz .exit
mov r8, rax ; r8 - count of valid bytes in input buffer
xor r9, r9 ; r9 - index of byte in input buffer, that is being processed.
xor r10, r10 ; r10 - index of next free position in output buffer.
.next_byte:
cmp r9, r8
jg .exit
mov al, [.inbuf + r9]
mov [.outbuf + r10], al ;; SIGSEGV here in GDB
inc r10
inc r9
jmp .next_byte
.read_error:
mov rax, sys_exit
mov rdi, 1
syscall
.exit:
mov rax, sys_write
mov rdi, 1
lea rsi, [.outbuf]
mov rdx, r10
syscall
mov rax, sys_exit
xor rdi, rdi
syscall
这个程序的目的是从stdin读取最多64kB,存入栈上的缓冲区,将读取的数据逐字节复制到输出缓冲区,并将输出缓冲区的内容写入标准输出流.本质上,它应该作为 cat
的有限版本。
在我的电脑上,它要么按预期工作,要么因 SIGSEGV 而崩溃,大约有 1 次成功运行到 4 次崩溃的比率。
最佳答案
sub rsp, <size>
如果您在 RSP 以下使用超过 128 个字节,请在接触它之前保留堆栈空间。
当它崩溃时,查看你的进程内存映射。您可能正在使用远低于 RSP 的内存,以至于内核不会增加堆栈映射,因此它只是对未映射页面的普通访问 = 无效页面错误 => 内核提供 SIGSEGV。
(ABI 只定义了一个 128 字节的红色区域,但实际上唯一可以破坏内存的是信号处理程序(你没有安装)或运行 print some_func()
的 GDB 使用你的程序堆栈来在你的程序中调用一个函数。)
通常 Linux 非常愿意在不触及中间页面的情况下增加堆栈映射,但显然会检查 RSP 的值。通常你移动 RSP 而不是仅仅使用远低于堆栈指针的内存(因为不能保证它是安全的)。参见 How is Stack memory allocated when using 'push' or 'sub' x86 instructions?
另一个副本:Which exception can be generated when subtracting ESP or RSP register? (stack growing)在哪里使用sub rsp, 5555555
在接触新的堆栈之前,内存就足够了。
Stack ASLR 可能会在相对于页面边界的不同位置启动 RSP,因此有时您可能勉强能摆脱它。 Linux 最初映射 132kiB 的堆栈空间,其中包括环境空间和进入 _start
时堆栈上的参数。 .您的 128kiB 非常接近该值,因此它有时会随机工作是完全合理的。
顺便说一句,在用户空间中实际复制内存的理由为零,尤其是一次不是 1 个字节。只需将相同的地址传递给 write
.
或者至少在可能的情况下就地过滤,这样您的缓存占用空间会更小。
此外,加载一个字节的正常方式是movzx eax, byte [mem]
.仅使用 mov al, [mem]
如果您特别想与 RAX 的旧值合并。在某些 CPU 上,mov
至 al
对旧值有错误的依赖性,您可以通过写入完整的寄存器来打破它。
顺便说一句,如果您的程序总是 使用这个空间,您不妨在 BSS 中静态分配它。如果您选择组装一个位置相关(非 PIE)可执行文件,这将使更有效的索引寻址成为可能。
关于linux - 为什么这段代码会随着地址随机化而崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56718127/
目前,我有以下设置: A记录: mydomain.com - aaa.aaa.aaa.aaa subdomain.mydomain.com - aaa.aaa.aaa.aaa NS记录: mydoma
有人可以帮助我以最佳方式在流畅的 nHibernate 中映射以下情况吗? Address 类用于 Client 和 Company。如何在 SQL 中最有效地存储它?映射应该是什么样的?我已经考虑过
我正在尝试编写一个 Windows 应用程序,它将在来自 PC 的以太网链接上生成流量。 我想使用 webBrowser 控件不断拉取网页以产生流量。 在这种情况下,我希望每个 webBrowser
我正在编写一个 SIP 堆栈,我需要在消息中插入一个 IP 地址。该地址必须是用于发送消息的地址。我知道目标 IP 并且需要确定将用于发送消息的 NIC(其地址).... 最佳答案 为了扩展 Remy
如何使用 IP 地址获取 MAC 地址,但以下代码不起作用 packet = ARP(op=ARP.who_has,psrc="some ip",pdst = ip) response = srp(p
目前我想知道如何实现对本地无线网络(路由器)的获取请求以获取当前连接到当前连接的 LAN 的所有设备.... 所以我做了一些研究,显然“nmap”是一个终端/命令提示符命令,它将连接的设备返回到本地无
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicates: how to find MAC address in MAC OS X programmatically
我们正在为 ipad 开发一个 iOS 应用程序,它使用 bonjour 与其他设备连接,使用 couchbaseListener 与对等数据库进行复制。我们观察到,每当 [nsnetservice
我创建了 3 个实例,其中 3 个弹性 IP 地址指向这些实例。 我做了 dsc 的 yum 安装:dsc12.noarch 1.2.13-1 @datastax 并且/etc/cassandra/d
我正在尝试获取规模集中所有虚拟机的私有(private) IP 地址列表(没有一个虚拟机故意拥有任何公共(public) IP 地址)。我找到了如何从 az cli 获取此内容,如下所示: az vm
我正在尝试获取规模集中所有虚拟机的私有(private) IP 地址列表(没有一个虚拟机故意拥有任何公共(public) IP 地址)。我找到了如何从 az cli 获取此内容,如下所示: az vm
我正在尝试与该端口上的任何 IP 建立连接。最初,我将其设置为 10.0.0.7,这是我网络上另一台计算机的 IP,因此我可以测试客户端/服务器。但是,我希望它可以与任何计算机一起使用而不必将 IP
作为序言,我开发了自己的 CRM(类似于 SalesForce 或 SAP),其“规模”要小得多,因为它面向服务,而不是销售。我在 Ubuntu 16.04 服务器上使用 MySql 或 MariaD
在我的项目中,我想做如下事情: static void test0(void) { printf("%s [%d]\n", __func__, __LINE__); } static void
我的机器上有两个网卡,配置了两个独立的 IP 地址。两个 IP 地址都属于同一个网络。我是否正确地说,当我创建一个特定于这些 IP 地址之一的套接字时? 更新: 这是我的情况: 我有一个位于 192.
当然,我意识到没有一种“正确的方法”来设计 SQL 数据库,但我想就我的特定场景中的优劣获得一些意见。 目前,我正在设计一个订单输入模块(带有 SQL Server 2008 的 Windows .N
我们将保存大量地址数据(在我公司的眼中,每个客户大约有150.000至500.000行)。 地址数据包含约5列: 名称1 名称2 街(+否) 邮政编码 市 也许以后再添加一些东西(例如电话,邮件等)
好的,我们在生产中实现了 Recaptcha。我们收到错误是因为它无法到达使用该服务所需的 IP 地址。我们为 IP 地址打开一个端口以到达 Google。没问题。我们这样做并显式配置该 IP 地址以
此页面使用 Drupals 联系表发送电子邮件:http://www.westlake.school.nz/contact 问题是,学校员工使用 outlook。当他们收到来自 parent 等的电子
是否可以将用户输入的邮政编码转换为文本框并将其转换为CLLocation?我正在尝试比较其当前位置与地址或邮政编码之间的距离,如果可以从NSString中创建CLLocation,这将很容易。 最佳答
我是一名优秀的程序员,十分优秀!