閱讀127 返回首頁    go 微軟 go Office


minix添加係統調用

環境minix3.1.8

打印進程的vm信息:

添加係統調用分為三個部分:

1,庫函數向用戶提供接口;

2,pm接受消息處理信息;

3,vm接收消息處理信息。

 

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,&m);
 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命令。

 

最後更新:2017-04-02 06:51:40

  上一篇:go 模擬Post請求
  下一篇:go .net讀寫配置文件