
一、实验目的
掌握在 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条)