Operating system Pintos中系统调用的实现

Operating system Pintos中系统调用的实现,operating-system,system,system-calls,sys,pintos,Operating System,System,System Calls,Sys,Pintos,我想在PintOS中实现已经定义的系统调用(在PintOS/src/lib/user/syscall.c中定义的halt()、create()…等)。pintos/src/userprog/syscall.c中的当前系统调用处理程序不执行任何操作。如何创建一个进行系统调用的进程。此外,我需要自己添加一些系统调用。我该如何处理这件事呢。但首先我需要实现现有的系统调用。pintos中的默认实现会终止调用过程。 转到这里。这里有关于修改代码以实现系统调用的说明 “src/examples”目录包含一些

我想在PintOS中实现已经定义的系统调用(在PintOS/src/lib/user/syscall.c中定义的halt()、create()…等)。pintos/src/userprog/syscall.c中的当前系统调用处理程序不执行任何操作。如何创建一个进行系统调用的进程。此外,我需要自己添加一些系统调用。我该如何处理这件事呢。但首先我需要实现现有的系统调用。

pintos中的默认实现会终止调用过程。
转到这里。这里有关于修改代码以实现系统调用的说明

“src/examples”目录包含一些示例用户程序。
此目录中的“Makefile”编译提供的示例,您也可以编辑它并编译自己的程序。
此程序/进程在运行时将进行系统调用。
使用gdb跟踪这样一个程序的执行,一个简单的printf语句将最终调用对标准输出文件的write系统调用。
给出的链接也有关于如何在gdb上运行pintos的指针,我猜您正在使用bochs或qemu。在任何情况下,只需在pintos上运行一个简单的hello world程序就可以运行gdb一次。
这将让你了解如何进行系统调用

static void
syscall_handler (struct intr_frame *f)// UNUSED) 
{
  int *p=f->esp;
 switch(*p)
case *p=SYS_CREATE  // NUMBER # DEFINED

      const char *name=*(p+1); //extract the filename 
      if(name==NULL||*name==NULL)
            exit(-1);

      off_t size=(int32_t)*(p+2);//extract file size

      f->eax=filesys_create(name,size,_FILE); //call filesys_create
      //eax will have the return value
}
这是sys_create的伪代码。。所有与文件系统相关的系统调用都非常简单, 文件系统的实时系统调用(如open read write close)需要您将文件转换为相应的fd(文件描述符)。您需要为每个进程添加一个文件表来跟踪这一点,这可以是预处理数据,也可以是全局数据。(UR选择)

case(*p==SYS\u WRITE)
{
//printf(“white syscall\n”);
字符*缓冲区=*(p+2);
无符号大小=*(p+3);
int-fd=*(p+1);
//获取指定文件的fd
结构文件*fil=thread_current()->fdtable[fd];/my-per-thread fdtable
如果(fd==1)转到这里;
if(is_目录(fil->inode)){
出口(-1);
去做;
}
在这里:
如果(缓冲区>=PHYS_BASE)退出(-1);
如果(fd=128){exit(-1);}
如果(fd==0){exit(-1);}//写入STDIN
if(fd==1)//写入标准输出
{
int a=(int)大小;
而(a>=100)
{
putbuf(缓冲器,100);
缓冲区=缓冲区+100;
a-=100;
}
putbuf(缓冲区,a);
f->eax=(int)大小;
}
其他的
if(thread_current()->fdtable[fd]==NULL)
{f->eax=-1;}
其他的
{
f->eax=文件写入(线程当前()->fdtable[fd],缓冲区,(关闭)大小);
}
完成:;
}//printf(“write”);}/*写入文件*/
打开-向fdtable添加新条目,并将您提供的fd编号返回到文件,
关闭-从fd表中删除该项
读-类似于写

创建、等待的过程并不容易实现


干杯:)

pintos中的默认实现会终止调用过程。
转到这里。这里有关于修改代码以实现系统调用的说明

“src/examples”目录包含一些示例用户程序。
此目录中的“Makefile”编译提供的示例,您也可以编辑它并编译自己的程序。
此程序/进程在运行时将进行系统调用。
使用gdb跟踪这样一个程序的执行,一个简单的printf语句将最终调用对标准输出文件的write系统调用。
给出的链接也有关于如何在gdb上运行pintos的指针,我猜您正在使用bochs或qemu。在任何情况下,只需在pintos上运行一个简单的hello world程序就可以运行gdb一次。
这将让你了解如何进行系统调用

static void
syscall_handler (struct intr_frame *f)// UNUSED) 
{
  int *p=f->esp;
 switch(*p)
case *p=SYS_CREATE  // NUMBER # DEFINED

      const char *name=*(p+1); //extract the filename 
      if(name==NULL||*name==NULL)
            exit(-1);

      off_t size=(int32_t)*(p+2);//extract file size

      f->eax=filesys_create(name,size,_FILE); //call filesys_create
      //eax will have the return value
}
这是sys_create的伪代码。。所有与文件系统相关的系统调用都非常简单, 文件系统的实时系统调用(如open read write close)需要您将文件转换为相应的fd(文件描述符)。您需要为每个进程添加一个文件表来跟踪这一点,这可以是预处理数据,也可以是全局数据。(UR选择)

case(*p==SYS\u WRITE)
{
//printf(“white syscall\n”);
字符*缓冲区=*(p+2);
无符号大小=*(p+3);
int-fd=*(p+1);
//获取指定文件的fd
结构文件*fil=thread_current()->fdtable[fd];/my-per-thread fdtable
如果(fd==1)转到这里;
if(is_目录(fil->inode)){
出口(-1);
去做;
}
在这里:
如果(缓冲区>=PHYS_BASE)退出(-1);
如果(fd=128){exit(-1);}
如果(fd==0){exit(-1);}//写入STDIN
if(fd==1)//写入标准输出
{
int a=(int)大小;
而(a>=100)
{
putbuf(缓冲器,100);
缓冲区=缓冲区+100;
a-=100;
}
putbuf(缓冲区,a);
f->eax=(int)大小;
}
其他的
if(thread_current()->fdtable[fd]==NULL)
{f->eax=-1;}
其他的
{
f->eax=文件写入(线程当前()->fdtable[fd],缓冲区,(关闭)大小);
}
完成:;
}//printf(“write”);}/*写入文件*/
打开-向fdtable添加新条目,并将您提供的fd编号返回到文件,
关闭-从fd表中删除该项
读-类似于写

创建、等待的过程并不容易实现


干杯:)

谢谢。但我想知道需要做哪些编辑。我知道必须修改syscall处理程序,但是需要编写哪些语句。编辑需要对其中一个系统调用链接进行哪些更改已损坏,请修复它。但我想知道需要做哪些编辑。我知道必须修改syscall处理程序,但是需要编写哪些语句。编辑需要对其中一个系统调用链接进行哪些更改请修复它