*** 作系统实验 Lab3 xv6添加系统调用

 *** 作系统实验 Lab3 xv6添加系统调用,第1张

*** 作系统实验 Lab3 xv6添加系统调用

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5704526.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存