本文主要是介绍MIT6.828 Lab2-3 Sysinfo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 一、实验内容
- 二、实验过程
- 2.1 已有的代码
- 2.2 需补充内容
- /kernel/kalloc.c修改(剩余内存计算的函数)
- /kernel/proc.c修改(统计进程数量的函数)
- /kernel/defs.h修改
- 添加/kernel/sysinfo.c文件
- /kernel/syscall.h修改
- /kernel/syscall.c修改
- /user/user.h修改
- /user/usys.pl修改
- Makefile修改(编译)
- 三、测试结果
一、实验内容
- 添加一个系统调用sysinfo用以收集系统运行时的信息
- sysinfo只用一个参数(struct sysinfo),详见kernel/sysinfo.h
- 使用内核填充struct sysinfo
- 提供了sysinfotest用以测试效果,通过会输出sysinfotest: OK
二、实验过程
2.1 已有的代码
- sysinfotest.c文件部分内容
// 主函数
144 int
145 main(int argc, char *argv[])
146 {
147 printf("sysinfotest: start\n");
148 testcall();
149 testmem();
150 testproc();
151 printf("sysinfotest: OK\n");
152 exit(0);
153 }//testcall()78 void79 testcall() {80 struct sysinfo info;8182 if (sysinfo(&info) < 0) {83 printf("FAIL: sysinfo failed\n");84 exit(1);85 }8687 if (sysinfo((struct sysinfo *) 0xeaeb0b5b00002f5e) != 0xffffffffffffffff) {88 printf("FAIL: sysinfo succeeded with bad argument\n");89 exit(1);90 }91 }
此文件主要处理struct sysinfo结构体记录的信息,sysinfo的信息由内核进行记录,因此要进行系统调用操作。
在kernel文件中,官方提供了sysinfo.h,未提供sysinfo.c,需要自行编写。
//sysinfo.h
1 struct sysinfo {
2 uint64 freemem; // amount of free memory (bytes)
3 uint64 nproc; // number of process
4 };
sysinfo.c需要完成将运行中的系统信息写入sysinfo结构体中,此结构体为内核态结构体,最后还需传递到用户态。
按照官方提示,在kernel/kalloc.c中添加一个函数用以收集剩余内存;在kernel/proc.c中添加函数用以收集进程数量。
2.2 需补充内容
/kernel/kalloc.c修改(剩余内存计算的函数)
// kernel/kalloc.c86 uint6487 kcollect_free(void)88 {89 acquire(&kmem.lock);9091 uint64 free_bytes = 0;92 struct run *r = kmem.freelist;93 while(r){94 free_bytes += PGSIZE;95 r = r->next;96 }9798 release(&kmem.lock);99 return free_bytes;
100 }
/kernel/proc.c修改(统计进程数量的函数)
在proc.c文件中添加统计进程数量的函数,通过遍历proc[]
数组实现
690 // kernel/proc.c
691 int
692 collect_proc_num(void)
693 {
694 int num = 0;
695 struct proc *p;
696 for(p = proc; p < &proc[NPROC]; p++){
697 if(p->state != UNUSED)
698 num++;
699 }
700 return num;
701 }
/kernel/defs.h修改
要将上述定义的两个函数添加进defs.h
中,在/kernel中,内核函数调用defs.h
查询需要用的内核函数
11 struct sysinfo;67 uint64 kcollect_free(void);111 int collect_proc_num(void);
添加/kernel/sysinfo.c文件
1 // kernel/sysinfo.c2 #include "types.h"3 #include "riscv.h"4 #include "defs.h"5 #include "param.h"6 #include "memlayout.h"7 #include "spinlock.h"8 #include "proc.h"9 #include "sysinfo.h"1011 uint6412 sys_sysinfo(void)13 {14 struct proc *p = myproc();1516 struct sysinfo info;17 uint64 info_addr; // user pointer to struct stat18 argaddr(0, &info_addr);1920 info.freemem = kcollect_free();21 info.nproc = collect_proc_num();2223 // 将struct sysinfo拷贝至用户态24 if(copyout(p->pagetable, info_addr, (char*)&info, sizeof(info)) < 0){25 return -1;26 }27 return 0;28 }
/kernel/syscall.h修改
增加系统调用号
23 #define SYS_sysinfo 22
/kernel/syscall.c修改
在相应位置增加转换定义
105 extern uint64 sys_sysinfo(void);
131 [SYS_sysinfo] sys_sysinfo,
/user/user.h修改
增加函数声明
26 int sysinfo(struct sysinfo *);
/user/usys.pl修改
增加系统调用入口,usys.pl
编译后产生usys.S
文件,该文件记录了内核函数的入口
39 entry("sysinfo");
Makefile修改(编译)
在相应位置添加链接和编译内容
//链接
23 $K/sysinfo.o\
//编译
192 $U/_sysinfotest\
三、测试结果
使用测试工具测试
root@QQQ:~/xv6-labs-2023# make GRADEFLAGS=sysinfo grade
输出结果OK
rnel/syscall.o kernel/sysproc.o kernel/sysinfo.o kernel/bio.o kernel/fs.o kernel/log.o kernel/sleeplock.o kernel/file.o kernel/pipe.o kernel/exec.o kernel/sysfile.o kernel/kernelvec.o kernel/plic.o kernel/virtio_disk.o kernel/start.o kernel/console.o kernel/printf.o kernel/uart.o kernel/spinlock.o
riscv64-unknown-elf-objdump -S kernel/kernel > kernel/kernel.asm
riscv64-unknown-elf-objdump -t kernel/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > kernel/kernel.sym
make[1]: Leaving directory '/root/xv6-labs-2023'
== Test sysinfotest == sysinfotest: OK (5.5s)
root@QQQ:~/xv6-labs-2023#
这篇关于MIT6.828 Lab2-3 Sysinfo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!