一、实验目的
掌握在 xv6 系统中添加系统调用,并编写用户级应用程序来调用新增的系统调用。
二、实验内容
准备实验环境,创建 int sys_wolfie(void *buf, uint size) 系统调用,它将 ASCII 艺术图像复制到用户提供的缓冲区,前提是缓冲区足够大。如果缓冲区太小,或无效,返回负值。如果调用成功,返回复制的字节数。编写一个名为 wolfietest 的用户级应用程序,从内核获取 Wolfie 映像,并将其打印到控制台。
三、实验过程
1、修改 syscall.h,添加:
#define SYS_wolfie 22
2、修改 syscall.c,添加:
extern int sys_wolfie(void);
[SYS_wolfie] sys_wolfie,
3、修改 usys.S,添加:
SYSCALL(wolfie)
4、修改 user.h,添加:
int wolfie(void*, uint);
5、修改 sysproc.c,添加:
int sys_wolfie(void) { void* buf; uint size; if(argptr(0, (void*)&buf, sizeof(buf)) < 0) return -1; if(argptr(1, (void*)&size, sizeof(size)) < 0) return -1; char img[]= ".__ .__ .__ .__ .___n | |__ ____ | | | | ____ __ _ _____________| | __| _/n | | \_/ __ \| | | | / _ \ \ \/ \/ / _ \_ __ \ | / __ | n | Y \ ___/| |_| |_( <_> ) \ ( <_> ) | \/ |__/ /_/ | n |___| /\___ >____/____/\____/ \/\_/ \____/|__| |____/\____ | n \/ \/ \/ n"; if(sizeof(img)>size) { return -1; } strncpy((char*)buf,img,sizeof(img)); return sizeof(img); }
6、创建用户级程序 wolfietest.c
#include "types.h" #include "stat.h" #include "user.h" int main(void) { char buf[500]; printf(1,"sys call wolfie, return: %dn",wolfie((void*)buf,500)); printf(1,"%s",buf); exit(); }
7、修改MakeFile
UPROGS= _cat _echo _forktest _grep _init _kill _ln _ls _mkdir _rm _sh _stressfs _usertests _wc _zombie _wolfietest
EXTRA= mkfs.c ulib.c user.h cat.c echo.c forktest.c grep.c kill.c ln.c ls.c mkdir.c rm.c stressfs.c usertests.c wc.c zombie.c wolfietest.c
7、输入make qemu运行虚拟机,输入ls,可以看到wolfietest指令
8、输入wolfietest
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)