xv6中系统调用所用锁的正确初始化位置咨询
xv6中initlock隐式声明错误的解决及锁初始化正确姿势
问题原因
你在main.c里调用initlock(&count_lock, "counter")触发隐式声明错误,核心是main.c没拿到initlock的函数声明,同时全局锁变量count_lock的作用域也没处理对。
一步步解决
1. 共享声明放在defs.h
打开defs.h,添加全局变量的extern声明:
extern struct spinlock count_lock; extern int count;
xv6里defs.h是跨文件共享函数、变量声明的统一入口,所有需要访问这些资源的文件都会包含它,这样就不会出现未声明的问题。
2. 变量定义放在syscall.c
在syscall.c里定义实际的全局变量(别放头文件,否则会触发重复定义错误):
struct spinlock count_lock; int count = 0;
毕竟你的read计数逻辑就在syscall.c里,锁和计数变量放在这里最合理。
3. 锁初始化的正确位置
回到main.c,在userinit()调用之前执行initlock,同时确保main.c顶部有#include "defs.h"(默认应该有,没有就加上)。示例代码:
int main(void) { // 其他初始化代码(比如consoleinit、kinit这些) initlock(&count_lock, "counter"); userinit(); // 后续启动代码 }
额外要注意的点
- syscall.c里必须包含
spinlock.h,不然用不了锁的结构体和函数:#include "spinlock.h" - 如果你要新增一个返回read计数的系统调用,记得在
syscall.h里加系统调用号(比如#define SYS_getreadcount 23),然后在syscall.c的syscalls数组里加对应的函数指针,最后实现sys_getreadcount返回count就行。
内容的提问来源于stack exchange,提问作者EckoLles
相关产品推荐
相关产品推荐

