我正在开设操作系统课程,我们在Linux Red Hat 8.0中工作 作为一项任务的一部分,我不得不改变sys close和sys open。 sys close的更改在没有事件的情况下通过,但是当我将更改引入sys close时,操作系统在启动过程中遇到错误,声称它无法挂载root fs,并调用panic。据报道,EIP在发生这种情况时处于关闭状态。
以下是我所做的更改(查找“HW1添加”评论): 在fs / open.c中:
asmlinkage long sys_open(const char * filename, int flags, int mode)
{
char * tmp;
int fd, error;
event_t* new_event;
#if BITS_PER_LONG != 32
flags |= O_LARGEFILE;
#endif
tmp = getname(filename);
fd = PTR_ERR(tmp);
if (!IS_ERR(tmp)) {
fd = get_unused_fd();
if (fd >= 0) {
struct file *f = filp_open(tmp, flags, mode);
error = PTR_ERR(f);
if (IS_ERR(f))
goto out_error;
fd_install(fd, f);
}
/* HW1 additions */
if (current->record_flag==1){
new_event=(event_t*)kmalloc(sizeof(event_t), GFP_KERNEL);
if (!new_event){
new_event->type=Open;
strcpy(new_event->filename, tmp);
file_queue_add(*new_event, current->queue);
}
}
/* End HW1 additions */
out:
putname(tmp);
}
return fd;
out_error:
put_unused_fd(fd);
fd = error;
goto out;
}
asmlinkage long sys_close(unsigned int fd)
{
struct file * filp;
struct files_struct *files = current->files;
event_t* new_event;
char* tmp = files->fd[fd]->f_dentry->d_name.name;
write_lock(&files->file_lock);
if (fd >= files->max_fds)
goto out_unlock;
filp = files->fd[fd];
if (!filp)
goto out_unlock;
files->fd[fd] = NULL;
FD_CLR(fd, files->close_on_exec);
__put_unused_fd(files, fd);
write_unlock(&files->file_lock);
/* HW1 additions */
if(current->record_flag == 1){
new_event=(event_t*)kmalloc(sizeof(event_t), GFP_KERNEL);
if (!new_event){
new_event->type=Close;
strcpy(new_event->filename, tmp);
file_queue_add(*new_event, current->queue);
}
}
/* End HW1 additions */
return filp_close(filp, files);
out_unlock:
write_unlock(&files->file_lock);
return -EBADF;
}
schedule.h中定义的task_struct最后更改为包括:
unsigned int record_flag; /* when zero: do not record. when one: record. */
file_queue* queue;
文件队列和事件t在单独的文件中定义如下:
typedef enum {Open, Close} EventType;
typedef struct event_t{
EventType type;
char filename[256];
}event_t;
typedef struct file_quque_t{
event_t queue[101];
int head, tail;
}file_queue;
文件队列添加的工作原理如下:
void file_queue_add(event_t event, file_queue* queue){
queue->queue[queue->head]=event;
queue->head = (queue->head+1) % 101;
if (queue->head==queue->tail){
queue->tail=(queue->tail+1) % 101;
}
}
答案 0 :(得分:2)
if (!new_event) {
new_event->type = …
这相当于if (new_event == NULL)
。我认为你的意思是if (new_event != NULL)
,内核人员通常会将其写为if (new_event)
。
答案 1 :(得分:0)
你能否发布错误的stackdump。我没有看到为queue_info结构分配内存的地方。还有一件事是你无法确定如果在内核中未分配,进程record_flag将始终为零,因为内核是一个长时间运行的程序,内存中包含垃圾。
通过查看堆栈跟踪,还可以检查函数中的确切位置。