ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

操作系统实验三·xv6系统增添系统调用和用户级应用程序

2021-12-06 21:34:05  阅读:245  来源: 互联网

标签:调用 4.1 int 系统 zhjprint 应用程序 xv6 ans size


xv6系统增添系统调用和用户级应用程序

1.实验目的

准备xv6环境,向xv6添加一个新的系统调用,并编写用户级应用程序来调用新增的系统调用。

2.实验内容

您的任务是向xv6添加系统调用。从读取syscall.c(系统调用表的内核端)、user.h(系统调用的用户级头)和usys.S(用户级系统调用定义)开始,这将有所帮助。您可以向xv6添加其他文件来实现此调用。有关xv6如何实现系统调用的更多信息,您应该阅读xv6手册的第3章。
创建一个系统调用int sys_wolfie(void *buf, uint size), 它将ASCII艺术图像复制到用户提供的缓冲区中,前提是缓冲区足够大,如果缓冲区太小或无效,则返回负值。如调用成功,则返回复制的字节数。
您还将编写一个名为wolfietest.c的用户级应用程序,从内核获取映像,并将其打印到控制台。

3. 实验环境

Linux虚拟机
操作系统:Ubantu 16.04 32位
虚拟机软件:VMware Workstation 15
虚拟处理器:1个2核

4. 程序设计和实现

4.1系统修改

4.1.1 syscall.c
增添 extern int sys_zhjprint(void);
[SYS_zhjprint] sys_zhjprint
4.1.2 syscall.h
增添 #define SYS_zhjprint 22
4.1.3 user.h
增添 int zhjprint(void* buff, unsigned int size);
4.1.4 usys.S
增添 SYSCALL(zhjprint)
4.1.5 sysproc.c
增添

int 
sys_zhjprint(void)
{
  char* buff;
  int size;
  if( argint(1, &size) < 0){
    return -1;
  }
  if( argptr(0, &buff, size) < 0){
    return -1;
  }
  return zhjprint(buff, size);
}

4.1.6 proc.c
增添

int 
zhjprint(char *buff, unsigned int size)
{
  if(size < 200)
  {
    return -1;
  }
  char temp[300] = "****************************\n*      name:zhj12399       *\n*        ASCII Art         *\n*     (zhj@zhj12399.cn)    *\n****************************\n";
  cprintf(temp);
  buff = temp;
  return 200;
}

4.1.7 Makefile
UPROGS=\ 中增添 _zhjprint\
4.1.8 defs.h
proc.c 中增添 int zhjprint(char* buf, unsigned int size);
4.1.9 zhjprint.c 自己写的用户级应用程序

#include "types.h"
#include "stat.h"
#include "user.h"

void show_ans(int ans)
{
  if(ans == -1)
  {
    printf(0, "the buffer is not enough\n");
  }
  else
  {
    printf(0, "the string length is %d\n", ans);
  }
  printf(0, "\n");
  return;
}

int main(int argc, char* argv[])
{
  char buf_one[1000] = {0};
  printf(0, "create a buffer which size is 1000\n");
  int ans_one = zhjprint(buf_one, 1000);
  show_ans(ans_one);

  char buf_two[10] = {0};
  printf(0, "create a buffer which size is 10\n");
  int ans_two = zhjprint(buf_two, 10);
  show_ans(ans_two);

  return 0;
}

4.2 编译运行

make qemu 后执行我们的函数zhjprint
请添加图片描述
先创建了一个1000个字符大小的数组,调用系统函数后返回了长度,又创建了一个10个字符大小的数组,调用系统函数后返回0。

标签:调用,4.1,int,系统,zhjprint,应用程序,xv6,ans,size
来源: https://blog.csdn.net/zhj12399/article/details/121622297

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有