linux - Linux 内核为什么以及如何为 coredump 创建稀疏文件?

标签 linux linux-kernel coredump sparse-file

目前我正在使用 Linux 4.0.6。激活核心转储后,我观察到生成的核心文件被创建为稀疏文件。 例如,ls 命令显示我的核心文件大小为 42 MB。但是,du 命令显示它仅分配了 26.3 MB。

我对这一观察结果的疑问:

  1. 为什么 Linux 内核为核心转储创建稀疏文件?
  2. 它是如何运作的?它取决于放置核心转储的文件系统吗?
  3. 我可以配置系统/内核以防止核心转储成为稀疏文件吗?

最佳答案

您应该想一下 coredump 文件是什么:仅仅是进程内存的顺序写入。在现代操作系统上,内存不是简单的连续字节范围,而是可以由映射在不同地址的多个段组成。这就解释了,如果您尝试在映射段之外的地址读取或写入,您会收到段违规信号 (SIGSEGV)。

因此,在转储时,系统按升序写入段,并lseek到每个新段的开头,从而构建一个稀疏文件。

现在回答您的问题:

  1. Why does Linux kernel create a sparse file for the coredump?

解释就在上面。

  1. How does it work? Does it depend on the filesystem where the coredump is placed?

并非如此,除非底层文件系统不允许稀疏文件。

  1. Can I configure the system/ kernel to prevent the coredump as a sparse file?

恕我直言,你不能,而且你也不想。 ls 命令提供程序使用的较高内存地址,而 du 命令提供程序使用的总内存大小,因为未映射未使用的地址并且根本不消耗内存。

关于linux - Linux 内核为什么以及如何为 coredump 创建稀疏文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44499291/

相关文章:

c - Perf 缓冲区的确切大小是多少?

c - Linux USB 设备驱动的误解

c - 段错误 - C 编程

c - 使用 syslog.h 将自定义时间戳写入 syslog

linux - 使用shell脚本创建shell脚本

c - 僵尸进程在其父进程死亡后去了哪里?

linux - Linux : how to get info on opened files? 上的核心转储文件

c++ - mbstowcs() 因特殊字符而失败

linux - 在 Linux 中以编程方式修改 Windows DLL 的字符串表

Linux 核心转储太大!