xv6添加页表功能时argaddr与argint报错问题求助
解决xv6中sys_pgaccess调用argaddr/argint的编译错误
错误原因
argaddr和argint是**无返回值(void类型)**的函数,你试图将它们的返回值与0做比较,这违反了C语言语法——void类型的值不能参与表达式运算,因此触发编译错误。
xv6参数获取函数的设计逻辑
xv6内核里的arg*系列函数(包括argaddr、argint),如果遇到参数索引无效、类型不匹配等错误,会直接调用panic()终止内核,不会返回错误码给调用者。所以调用这类函数时,不需要手动判断返回值,调用后直接使用传入的指针变量即可。
修改后的代码片段
int sys_pgaccess(void){ uint64 fva; int pnum; uint64 abits; int res = 0; pte_t* pte_addr; pte_t pte; // 直接调用argaddr和argint,无需判断返回值 argaddr(0, &fva); argint(1, &pnum); // 后续功能逻辑... }
补充说明
如果需要避免参数错误导致内核panic,你可以参考xv6现有系统调用的实现,自行封装参数检查逻辑,但默认的arg*系列函数本身不支持返回错误码。
内容的提问来源于stack exchange,提问作者tsosilio
相关产品推荐
相关产品推荐

