Linux内核为什么以及如何为coredump创建稀疏文件?
目前我正在Linux 4.0.6上工作。在coredump激活之后,我观察到生成的corefiles被创建为稀疏文件。 例如,Linux内核为什么以及如何为coredump创建稀疏文件?,linux,linux-kernel,coredump,sparse-file,Linux,Linux Kernel,Coredump,Sparse File,目前我正在Linux 4.0.6上工作。在coredump激活之后,我观察到生成的corefiles被创建为稀疏文件。 例如,ls命令显示我的corefile的大小是42MB。但是,du命令显示它只分配26.3 MB 关于这一观察,我的问题是: 为什么Linux内核为coredump创建一个稀疏文件 它是如何工作的?它是否依赖于放置coredump的文件系统 我可以配置系统/内核以防止coredump成为稀疏文件吗 您应该只考虑coredump文件是什么:进程内存的顺序写入。在现代操作系统上,内
ls
命令显示我的corefile的大小是42MB。但是,du
命令显示它只分配26.3 MB
关于这一观察,我的问题是:
您应该只考虑coredump文件是什么:进程内存的顺序写入。在现代操作系统上,内存不是一个简单的顺序字节范围,而是可以由多段在不同地址映射而成。这说明,如果您尝试在映射段之外的地址读取或写入,则会收到段冲突信号(SIGGEGV) 因此,在转储时,系统按升序写入段,并将lseek写入每个新段的开头,从而构建一个稀疏文件 现在回答您的问题:
我知道你不能,你更不想。
ls
命令提供程序使用的较高内存地址,而du
命令提供程序使用的总内存大小,因为未使用的地址不会被映射,也不会消耗内存。您应该只考虑coredump文件是什么:进程内存的顺序写入。在现代操作系统上,内存不是一个简单的顺序字节范围,而是可以由多段在不同地址映射而成。这说明,如果您尝试在映射段之外的地址读取或写入,则会收到段冲突信号(SIGGEGV)
因此,在转储时,系统按升序写入段,并将lseek写入每个新段的开头,从而构建一个稀疏文件
现在回答您的问题:
我知道你不能,你更不想。
ls
命令为您提供程序使用的较高内存地址,而du
命令为您提供程序使用的总内存大小,因为未使用的地址未映射,并且根本不消耗内存。谢谢@SergeBallesta!但是,如果coredump大小很小,例如只有3MB,那么创建的coredump不是稀疏文件。ls
和du
命令显示相同的分配和文件大小。你有什么解释吗?解释似乎表明文件大小与最高的映射地址有关,这是错误的。coredump有一个所有区域的列表。重要的是它们的数量,而不是它们在地址空间中的位置。特别是使用较小映射的程序也可能完全使用它们,因此“真实”转储大小更接近稀疏大小。真正的问题是对稀疏文件w.r.t coredumps的兴趣是什么。一个有趣的事实是,虽然您本身无法配置稀疏转储,但您可以使用转储到管道,并在管道到程序中随心所欲地写出核心。但不要这样做。请稍加澄清:wrtls
vsdu
:du
给出了磁盘上的大小,对于稀疏文件,该大小将更小。回答得很好。>ls
命令为您提供程序使用的较高内存地址,而du
命令为您提供程序使用的总内存大小,因为未使用的地址不会被映射,也不会消耗内存@bytefire是正确的。du
没有给出程序使用的总内存大小,因为corefile只是一个文件,而不是二进制文件。谢谢@SergeBallesta!但是,如果coredump大小很小,例如只有3MB,那么创建的coredump不是稀疏文件。ls
和du
命令显示相同的分配和文件大小。你有什么解释吗?解释似乎表明文件大小与最高的映射地址有关,这是错误的。coredump有一个所有区域的列表。重要的是它们的数量,而不是它们在地址空间中的位置。特别是使用较小映射的程序也可能完全使用它们,因此“真实”转储大小更接近稀疏大小。真正的问题是对稀疏文件w.r.t coredumps的兴趣是什么。一个有趣的事实是,虽然您本身无法配置稀疏转储,但您可以使用转储到管道,并在管道到程序中随心所欲地写出核心。但不要这样做。请稍加澄清:wrtls
vsdu
:du
给出了磁盘上的大小,对于稀疏文件,该大小将更小。回答得很好。>ls
命令为您提供程序使用的较高内存地址,而du
命令为您提供程序使用的总内存大小,因为未使用的地址不会被映射,也不会消耗内存@bytefire是正确的。du
没有给出