minix添加系统调用

简介: <p>环境minix3.1.8</p> <p>打印进程的vm信息:</p> <p>添加系统调用分为三个部分:</p> <p>1,库函数向用户提供接口;</p> <p>2,pm接受消息处理信息;</p> <p>3,vm接收消息处理信息。</p> <p> </p> <p>1库函数添加:</p> <p>  1.1 posix/下添加print_vmmap函数,文件名命名为_print

环境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命令。

 

目录
相关文章
|
8月前
|
Linux API 数据安全/隐私保护
Linux下的系统编程——系统调用(五)
Linux下的系统编程——系统调用(五)
81 0
Linux下的系统编程——系统调用(五)
|
5月前
|
安全 Linux 程序员
在Linux中,系统调用是什么?
在Linux中,系统调用是什么?
|
4月前
|
存储 Linux 程序员
Linux中的主要系统调用
【9月更文挑战第11天】在Linux操作系统中,通过系统调用`fork`创建新进程,子进程继承父进程的数据结构与代码,但可通过`execve`执行不同程序。`fork`返回值区分父子进程,`waitpid`让父进程等待子进程结束。
|
5月前
|
存储 Linux 程序员
关于Linux中的主要系统调用
【8月更文挑战第9天】Linux 操作系统中就是创建进程。创建进程的系统调用叫fork。
关于Linux中的主要系统调用
|
8月前
|
Linux 数据安全/隐私保护
进程间通信之共享内存及其shm函数的使用【Linux】
进程间通信之共享内存及其shm函数的使用【Linux】
467 2
|
8月前
|
存储 Linux C++
Linux——进程地址空间与进程控制
Linux——进程地址空间与进程控制
|
8月前
|
存储 Linux 数据格式
xv6(13) 文件系统:文件描述符&系统调用
文件系统:文件描述符&系统调用
80 0
|
消息中间件 缓存 网络协议
Linux 系统调用
本文整理了 Linux 内核中系统调用的相关知识