news 2026/9/29 11:58:41

init kcore_list kcore_vsyscall

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
init kcore_list kcore_vsyscall

static struct kcore_list kcore_vsyscall;

是 Linux 内核中用于描述/proc/kcore文件里 vsyscall 页面区域的一个静态全局变量。

核心作用:在 kcore 中注册 vsyscall 区域

/proc/kcore是内核暴露给用户空间的“内核内存镜像”,它允许调试工具(如 GDB)以 ELF 格式查看内核和用户空间的虚拟内存内容。struct kcore_list用于描述 kcore 文件中每一个可被读取的内存区域。

kcore_vsyscall这个变量专门用来记录 vsyscall 页面在虚拟地址空间中的位置和大小,以便在 kcore 中正确暴露这块区域。

与 vsyscall 的关系

vsyscall是 x86-64 架构上一个特殊的只读页面,位于固定虚拟地址0xffffffffff600000。它提供了gettimeofday、time、getcpu三个系统调用的快速用户态实现,避免了传统系统调用的开销。

在较新的内核中,vsyscall通常以emulate模式运行,但该页面本身仍然存在于虚拟地址空间中,作为兼容性接口保留。kcore_vsyscall就是为了在/proc/kcore中暴露这个页面而存在的。

在代码中的位置

从内核源码可以看到,这个变量在arch/x86/mm/init_64.c或arch/x86/entry/vsyscall/vsyscall_64.c中被定义,并在kcore初始化时通过kclist_add()注册:

kclist_add(&kcore_vsyscall, (void *)VSYSCALL_ADDR, PAGE_SIZE, KCORE_OTHER);

这行代码将VSYSCALL_ADDR(即0xffffffffff600000)处的一个页面,以KCORE_OTHER类型添加到 kcore 的列表中,使得调试工具能够读取这个页面的内容。

struct kcore_list

是 Linux 内核中用于描述/proc/kcore文件中每一个内存区域的数据结构。它像一张“内存区域登记表”,记录了哪些内存段需要被/proc/kcore暴露给用户空间。

核心定义

它的定义位于include/linux/kcore.h,结构非常简洁:

struct kcore_list { struct list_head list; // 链表节点,用于串联所有区域 unsigned long addr; // 区域的虚拟起始地址 size_t size; // 区域的大小(字节) int type; // 区域类型(如 RAM、VMALLOC 等) };

字段含义

字段含义
list内核用list_head将所有kcore_list串联成一个全局链表,/proc/kcore读取时遍历这个链表来生成 ELF 程序头(Program Headers)。
addr该内存区域在内核虚拟地址空间中的起始地址。
size该区域的长度。/proc/kcore的文件大小和 ELF 段的大小都由此决定。
type区域类型,用于区分不同用途的内存。

区域类型(enum kcore_type)

type字段的取值来自enum kcore_type,常见的有:

类型含义
KCORE_TEXT内核代码段(.text)
KCORE_VMALLOCvmalloc 动态分配区
KCORE_RAM系统物理内存(直接映射区)
KCORE_VMEMMAPvmemmap 区域(struct page数组)
KCORE_OTHER其他特殊区域(如 vsyscall、模块区)

在/proc/kcore中的作用

/proc/kcore是一个伪文件,它以ELF 格式导出内核的运行时内存映像,供 GDB 等调试工具分析。

内核在初始化时,通过kclist_add()函数将各个内存区域注册到全局链表中。例如:

kclist_add(&kcore_mem, __va(0), max_low_pfn * PAGE_SIZE, KCORE_RAM); kclist_add(&kcore_vmem, (void *)VMALLOC_START, VMALLOC_END - VMALLOC_START, KCORE_VMALLOC); kclist_add(&kcore_kernel, _stext, _end - _stext, KCORE_TEXT);

当用户读取/proc/kcore时,内核会遍历这个链表,为每一个区域生成一个PT_LOAD程序头,描述该区域在文件中的偏移和大小。这样调试工具就能知道从哪里读取内核的哪一部分内存。

历史演进

struct kcore_list的定义经历过一些变化。早期版本(如 4.4)只包含addr、size、type和链表节点。在 5.0 到 5.13 之间,曾短暂增加过一个vaddr字段,用于处理某些架构下的虚拟地址映射,但后来被移除,回归了简洁的设计。type字段则是在 2009 年左右引入的,目的是让/proc/kcore能够区分不同类型的区域,以便更精确地导出内存。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 11:43:34

双飞燕FG10鼠标摔落无响应|拆解修复|非广

这只双飞燕A4TECH-FG10无线鼠标日常使用稳定、无任何故障,一次意外摔落桌面后彻底失灵:按键无反应、电脑无法识别(无LED版本,只能拆机看看了)。 原本以为是摔震虚焊、主板损坏,要换一个新鼠标了&#xff0c…

作者头像 李华
网站建设 2026/9/29 11:39:50

开源协作实战:从规范提PR到高效Review的完整指南

说起来有点丢人,我最早提 PR 的时候,干过不少让维护者看了直摇头的事:往 master 分支直接推代码、Commit message 写 "update"、"fix bug" 这种看了等于没看的描述、PR 描述里一个字都不写就点创建。当时我还觉得"代…

作者头像 李华
网站建设 2026/9/29 11:35:42

WinDirStat v2.5.6 磁盘空间分析实战:从扫描到清理C盘

C盘又飘红了,任务栏右下角弹窗提醒空间不足,打开“此电脑”一看,C盘那根进度条已经贴到了最右边。我相信这种场景大家都不陌生,偏偏这时候你还找不到是什么东西把磁盘塞满了,只能靠猜:是下载文件夹&#xf…

作者头像 李华