上一个Lab实现了一些shell工具,这个Lab实现一些系统调用,来帮助理解系统调用如何工作、如何暴露。
实现一个trace,能够追踪某个进程(包括子进程)指定系统调用执行情况,打印它的状态,如下图所示。
主要步骤如下:
//代码比较分散,只介绍主要代码
uint64
sys_trace(void)
{
int mask;
if(argint(0, &mask) < 0)
return -1;
myproc()->tracemask=mask;
return 0;
}
static char* syscallnames[] = {
[SYS_fork] "fork",
[SYS_exit] "exit",
[SYS_wait] "wait",
[SYS_pipe] "pipe",
[SYS_read] "read",
[SYS_kill] "kill",
[SYS_exec] "exec",
[SYS_fstat] "fstat",
[SYS_chdir] "chdir",
[SYS_dup] "dup",
[SYS_getpid] "getpid",
[SYS_sbrk] "sbrk",
[SYS_sleep] "sleep",
[SYS_uptime] "uptime",
[SYS_open] "open",
[SYS_write] "write",
[SYS_mknod] "mknod",
[SYS_unlink] "unlink",
[SYS_link] "link",
[SYS_mkdir] "mkdir",
[SYS_close] "close",
[SYS_trace] "trace",
};
void
syscall(void)
{
int num;
struct proc *p = myproc();
num = p->trapframe->a7;
if(num > 0 && num < NELEM(syscalls) && syscalls[num]) {
p->trapframe->a0 = syscalls[num]();
if (p->tracemask&(1<<num)){
printf("%d: %s %s %s %d\n",p->pid,"syscall",syscallnames[num],"->",p->trapframe->a0);
}
} else {
printf("%d %s: unknown sys call %d\n",
p->pid, p->name, num);
p->trapframe->a0 = -1;
}
}
sysinfo系统调用用来统计当前空闲物理内存、存在的进程数量,我们需要对内存分配器、进程管理有一定的了解。
struct run {
struct run *next;
};
struct {
struct spinlock lock;
struct run *freelist;
} kmem;
struct cpu cpus[NCPU];
//进程管理数组
struct proc proc[NPROC];
enum procstate { UNUSED, USED, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
每个run表示一个物理页,它的指针就是物理页起始地址,每一物理页都会存放下一物理页的地址,来减少辅助空间。进程是采用一个数组来管理。
uint64
sys_sysinfo(void)
{
struct sysinfo info;
info.freemem=count_free_memory();
info.nproc=count_proc();
uint64 addr;
if(argaddr(0, &addr) < 0)
return -1;
if(copyout(myproc()->pagetable,addr,(char*)&info,sizeof info)<0){
return -1;
}
return 0;
}
uint64 count_free_memory(void){
int pageNum=0;
struct run *r;
acquire(&kmem.lock);
r=kmem.freelist;
while (r){
pageNum++;
r=r->next;
}
release(&kmem.lock);
return pageNum*PGSIZE;
}
//计算进程数量
uint64 count_proc(void){
int count=0;
for(int i=0;i< NPROC ;i++){
if(proc[i].state!=UNUSED){
count++;
}
}
return count;
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。