zl程序教程

您现在的位置是:首页 >  系统

当前栏目

minix添加系统调用

系统 添加 调用
2023-09-14 08:59:44 时间

1库函数添加:

  1.1 posix/下添加print_vmmap函数,文件名命名为_print_vmmap.c:

#include lib.h
#define print_vmmap _print_vmmap
#include unistd.h
PUBLIC int print_vmmap()
{
 message m;
 return(_syscall(PM_PROC_NR, PM_PRINTVMMAP, m));
}

  1.2 修改posix下边的makefile.inc文件,按照格式添加

  1.3在include/unistd.h下添加函数原型:_PROTOTYPE( int  print_vmmap, (void));

  1.4libc/syscall下添加print_vmmap.s文件:

#include machine/asm.h

IMPORT(_print_vmmap)
ENTRY(print_vmmap)
 jmp _C_LABEL(_print_vmmap)

  1.5修改syscall下边的makefile

 

2:pm的处理

    2.1修改callnr.h:

          把NCALLS加1;

          添加#define PM_PRINTVMMAP 113;

   2.2修改pm/proto.h

          添加do_pmprintvmmap的原型:_PROTOTYPE( int do_pmprintvmap, (void)      );

   2.3在pm/getset.c(也可以是其他的c文件)中添加处理函数:

  int do_pmprintvmap()
{
 int result;
 message m;
 printf("pm debug/n");
 result=1;
 m.m1_i1=mp- mp_endpoint;
 result=_taskcall(VM_PROC_NR, VM_PM_PRINTMAP,
 return result;
}

   2.4修改pm/table.c添加消息处理函数:do_pmprintvmap,/*113= print vmmap*/

   2.5修改vfs/table.c:no_sys,   /*113= print vm map*/(此处必须添加。)

 

 

3vm的处理:

 3.1修改include/minix/com.h定义vm的新消息。

        #define VM_PM_PRINTMAP     (VM_RQ_BASE+43)

        /* Total. */
        #define NR_VM_CALLS    44

 3.2在mmap.c(也可以是其他的c文件)中添加函数:

      PUBLIC int do_printvmmap(message *m)
{
 int result=1;
 int proc;
 struct vmproc * vmp;
 struct vir_region * vir_r;
 printf("start-addr end-addr permission /n");
 if(vm_isokendpt(m- m1_i1, proc) != OK) {
     printf("VM: bogus endpoint VM_print vm map %d/n", m- m1_i1);
  
  return EINVAL;
   }
 vmp= vmproc[proc];
 vir_r=vmp- vm_regions;
 
 while(vir_r!=NULL){
  printf("%lu %lu r",vir_r- vaddr,vir_r- length+vir_r- vaddr);
  if(vir_r- flags VR_WRITABLE)
   printf("w");
  else
   printf("-");
  printf("/n");
  vir_r=vir_r- next;
 }
 return result; 
}
 3.3在vm/proto.h中添加声明:

      _PROTOTYPE(int do_printvmmap, (message *m)                            );
  3.4在vm/main.c中添加CALLMAP处理消息:

            CALLMAP(VM_PM_PRINTMAP,do_printvmmap);

  3.5在vm/main.c中做处理,躲避权限检查:

          if (msg.m_type == VM_PAGEFAULT) {
  if (!IPC_STATUS_FLAGS_TEST(rcv_sts, IPC_FLG_MSG_FROM_KERNEL)) {
    }
 } else if(c 0 || !vm_calls[c].vmc_func) {
   } else {
  if (msg.m_type != VM_PM_PRINTMAP
   vm_acl_ok(who_e, c) != OK) {
  } else {
  }
 }

 

4编译和安装新的内核。

  4.1在是src/lib文件夹make install;

  4.2在src/servers下边make install;

  4.3在src/tools文件夹make install

  4.4重启系统

5编写测试文件:

#include stdio.h

#include unistd.h
int main()
{
  print_vmmap();
 }

用cc命令编译该文件,注意不能用gcc命令。

 


什么是系统调用? 当谈到系统调用(system call)时,我们首先映入脑海的差不多就是软中断、内核态、用户态。开宗明义第一章,我想让大家先要重新认识一下『系统调用』这个词。
       仔细揣摩了一段时间.        系统调用过程,用户进程进入内核态,进程栈进入内核态栈, cpu进入内核态,cpu用户态各寄存器的值保存到内核态栈,执行内核态代码. 执行完从内核态返回到用户态,包括进程栈返回到用户态栈,cpu返回到用户态,cpu各寄存器的值用之前保存在内核态栈的值还原.  内核在执行系统调用时处于进程上下文中,current指针指向当前进程,即引发系统调用的进程。
实现自己的系统调用(两种方式) 【转】 转自:http://blog.163.com/zhe_wang_2009/blog/static/1722821212012328104325531/ 学习linux操作系统课,有一章讲“系统调用”,其中有个内容是在linux内核中添加一个自己的系统调用。