/dev/core 或 /proc/kcore 是什么类型的文件?

/dev/core 或 /proc/kcore 是什么类型的文件?

在使用 shellscript 扫描文件系统以查找更改时,我忘记排除/dev,因此core也进行了测试。奇怪的是,无论我以哪种方式测试它,它对于类型都不一致:

$ if [ -f ./core ] ; then echo file ; else echo something else ; fi
file
$ ls -al core
lrwxrwxrwx 1 root root 11 Sep 29 15:40 core -> /proc/kcore
$ file core
core: symbolic link to `/proc/kcore' 
$ if test -f core ; then echo file ; else echo something else ; fi
file
$ if /usr/bin/test -f core ; then echo file ; else echo something else ; fi
file
$ if test -h core ; then echo link ; else echo something else ; fi
link
$ if /usr/bin/test -h core ; then echo link ; else echo something else ; fi
link

这里发生了什么?

答案1

首先,/dev/core是到常规文件的符号链接/proc/kcore。所以 和test -h /dev/core都是test -f /dev/core正确的:-h因为它是一个符号链接,-f因为符号链接的目标是一个常规文件。

现在来说说/proc/kcore是什么。这是一个常规文件,但与您习惯的常规文件有点不同。每当程序对文件执行某些操作(打开、读取、写入等)时,都是通过系统调用,即通过在内核中执行一些代码。调用的代码取决于文件系统类型。对于磁盘文件系统(例如 ext4 或 FAT),此代码计算出组成文件的数据片段的排列方式,并调用底层存储层(例如磁盘驱动程序)来读取和写入这些数据片段。对于网络文件系统(例如 NFS 或 Samba),此代码将网络数据包发送到文件服务器。对于/proc,这是安装点procfs 文件系统,此代码显示或修改内核数据结构。

大多数文件/proc报告有关系统的信息,例如/proc/mounts报告挂载点列表,/proc/modules报告加载的模块列表,/proc/123/stat报告有关PID 123的进程的状态信息等。该文件/proc/kcore报告系统物理内存的内容,采用适合调试器的格式,因此从中读取字节/proc/kcore本质上是读取物理内存的内容。

procfs 文件系统上的文件可以被认为是“神奇的”,有点像设备文件是“魔法”。设备文件和文件系统,例如 procfs 和系统文件系统以不同的方式获得它们的魔力:设备文件可以在任何(好吧,大多数)文件系统上创建,它们很神奇,因为它们的目录条目显示“字符设备”的“块设备”而不是“常规文件”;/proc和下的文件/sys很神奇,因为它们所在的整个文件系统都很神奇。

除此之外,正如我们在上面看到的,没有涉及任何实际的魔法。它只是内核代码,无论该代码计算块布局并从磁盘读取它们还是格式化内核数据结构。

您可以在以下位置查看 procfs 文件系统的文档proc手册页内核文档

答案2

/dev/core文件是 的链接/proc/kcore。 kcore 文件是一个虚拟文件,仅作为进程文件系统。它包含内核可以分配的内存。在 64 位系统上,大小/proc/kcore甚至为 128TB,因为这是 64 位系统可以分配的绝对限制。该文件的格式类似于ELF二进制。请参阅(并注意文件大小):

$ file /proc/kcore 
/proc/kcore: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, [...]
$ ls -lh /proc/kcore 
-r-------- 1 root root 128T Sep 29 20:01 /proc/kcore

ctime等于mtime我调用该命令的时间ls,因为该文件仅作为文件存在,而不是之前和之后;就在那一刻。

因此它看起来像一个常规文件,但是,与 proc 文件系统中的所有其他文件一样,它只是虚拟的。当您请求时,内核将可分配内存抽象为文件。这意味着它只是可用的当一个read()或一个stat()系统调用请求它(当您对文件stat()使用实用程序时发生)。test然后内核拦截或捕获系统调用并给出特定值,而不是真实的内容,不存在。如果您/proc/kcore作为文件读取(cat例如),内核会进行内存读取。

proc 文件系统中的每个文件后面都有一个处理函数,它负责应作为文件内容返回的内容。

由于/proc/kcore是 ELF 格式,因此内容旨在由调试器检查,例如gdb.

相关内容