【问题标题】:Writing files to disk more than the size limitation将文件写入磁盘超过大小限制
【发布时间】:2015-07-19 19:26:29
【问题描述】:

测试在64-bit x86 Linux 上进行。

我有一些x86 32-bit 汇编代码,它试图将大量日志数据写入磁盘。是这样的:

logging_flush:
pushl   %ebp
movl    %esp, %ebp
andl    $-16, %esp
subl    $32, %esp
movl    $438, 8(%esp)       <--- 666
movl    $1089, 4(%esp)      <--- O_WRONLY|O_APPEND|O_CREAT
movl    $.LC1, (%esp)
call    open
movl    %eax, 28(%esp)
movl    $buf, %eax
movl    $0x1000000, 8(%esp)
movl    %eax, 4(%esp)
movl    28(%esp), %eax
movl    %eax, (%esp)
call    write
movl    28(%esp), %eax
movl    %eax, (%esp)
call    close
leave
ret

section .rodata
.LC1:
.string "trace.bin"

但是,由于大小限制,转储日志文件的大小不会大于2G

我尝试用这种方式编译我的代码:

gcc final.s -D_FILE_OFFSET_BITS=64 -m32 -lm

但是没有字节可以写入日志文件..

我也尝试使用fopen64,但它无法正常工作。我在这里错过了什么吗?谁能帮我调整一下上面的汇编代码?

【问题讨论】:

  • 你实际上不是编译,而是汇编。您添加 C 标签的原因是什么?
  • 你没有检查open(2)的返回值。用 C 编写这部分。系统调用所花费的 CPU 时间将使您的 asm 和编译器输出之间的差异相形见绌。

标签: assembly x86 x86-64 file-writing


【解决方案1】:

您需要使用O_LARGEFILE。见man open

O_LARGEFILE (LFS) 允许打开大小不能用 off_t 表示(但可以用 off64_t 表示)的文件。

因此,代码可能如下所示:

# O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE
movl    $0x1|0x40|0x400|0x8000, 4(%esp)

【讨论】:

  • 我不得不说,Jester,我对你广泛的装配经验印象深刻! :)
猜你喜欢
  • 2012-11-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
相关资源
最近更新 更多