You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu xv6中getreadcount系统调用报错求助:trap 14错误排查

xv6 getreadcount系统调用页错误(trap 14 err 5)排查方案

错误原因分析

trap 14 err 5 是用户态页错误,err=5对应「用户态下尝试读取不存在的物理页面」,出错地址0xffffffff是无效内核地址,核心问题是用户程序越界访问内核空间,或系统调用实现存在地址跳转错误。

逐一排查修复

1. 用户程序错误直接引用内核变量

你的readcount.c中直接写printf(2, "%d", count)是致命错误:内核全局变量count属于内核地址空间,用户态进程无法直接访问,链接器会将未定义的count符号解析为无效地址(如0xffffffff),运行时触发页错误。

正确的用户程序写法:

#include "user.h"

int main(void) {
    int total = getreadcount();
    printf(1, "累计read调用次数:%d\n", total);
    exit();
}

2. 确认sys_getreadcount函数已正确实现

你提到修改了proc.h和sysproc.c,但未明确实现sys_getreadcount。必须在内核中实现该系统调用处理函数,返回全局count值:

// 在sysfile.c中添加(因为count定义在sysfile.c)
int sys_getreadcount(void) {
    return count;
}

如果缺失该函数,系统调用跳转时会访问无效地址,触发trap。

3. 检查系统调用号一致性

确保以下三处的系统调用号完全匹配:

  • 在syscall.h中添加:#define SYS_getreadcount 23(数字需为当前最大系统调用号+1,可查看现有定义确认)
  • 在syscall.c的syscalls数组中添加:[SYS_getreadcount] = sys_getreadcount;
  • usys.S中的SYSCALL(getreadcount)会自动关联正确调用号,无需额外修改,但需确保syscall.h定义正确。

4. 全局变量count初始化

在sysfile.c中定义count时必须初始化,避免随机值:

int count = 0; // 全局变量,统计所有进程的read调用次数

5. 确认Makefile修改正确

在user目录的Makefile中,UPROGS列表需添加_readcount,确保用户程序被编译:

UPROGS=\
    _cat\
    _echo\
    ...
    _readcount\

验证步骤

  1. 重新编译内核:make clean && make
  2. 启动xv6,运行readcount程序
  3. 可先执行一些会调用read的命令(如cat README),再运行readcount验证计数是否正确

内容的提问来源于stack exchange,提问作者김영서

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:14:56