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

 

时间: 2024-09-29 15:36:43

minix添加系统调用的相关文章

kernel学习之动手添加系统调用(ARM)

我是在linux2.6.38中添加的系统调用,在mini6410开发板上测试的. 添加系统调用: 向内核中添加系统调用,需要执行三个步骤: 1.添加新的内核函数 2.更新unistd.h 3.更新系统调用表 1. 在kernel/sys.c中添加函数 asmlinkageint sys_add(int a,int b) { return a+b; } 2. 在arch/arm/include/asm/unistd.h 添加: #define_NR_add (_NR_SYSCALL+BASE +

wrk中添加系统调用的方式

问题描述 wrk中添加系统调用的方式 Add a new system call to iterate process List: subtask: add a new system service to iterate process list subtask: write a program to call the new system service to get result 要求添加一个系统调用显示遍历的系统进程表,求大神给些帮助啊

arch x86 built ino-ubuntu10.04升级内核至3.9.4后添加系统调用再编译内核报错

问题描述 ubuntu10.04升级内核至3.9.4后添加系统调用再编译内核报错 我已经修改好syscall_32.tbl,然后在syscalls.h也添加了asklinkage long sys_lsmynumber(void); 然后在kernel新建了一个目录lsmynumber,里面编写了makefile文件和lsmynumber.c文件 都没什么问题,然后在kernel目录下写了个Kconfig.lsmynumber,就是config ...的 然后就开始编译了,结果报了:arch/x

Linux系统调用详解(实现机制分析)--linux内核剖析(六)

系统调用概述 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制.也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call).在linux中系统调用是用户空间访问内核的唯一手段,除异常和陷入外,他们是内核唯一的合法入口. 一般情况下应用程序通过应用编程接口API,而不是直接通过系统调用来编程.在Unix世界,最流行的API

实现自己的系统调用针对linux-2.6.34【转】

转自:http://biancheng.dnbcw.net/linux/303362.html  在linux下实现自己的系统调用.主要功能是:遍历系统的进程,并将相关的进程信息存放在自己定义的结构体中,同时编写系统调用,实现内核数据向用户空间的文件中写入. 首先实现相关的系统调用: 1.修改系统调用表: 在目录/usr/src/linux-2.6.33.1/arch/x86/kernel 修改文件:syscall_table_32.S 在文件的末尾处添加自己的系统调用表项. 如下:     

ubuntu-增添一个系统调用,我的内核版本是linux3.13.0-46-generic.

问题描述 增添一个系统调用,我的内核版本是linux3.13.0-46-generic. 想要向ubuntu14.04内核增添一个系统调用,我的内核版本是linux3.13.0-46-generic.该怎么做. 解决方案 一.源码修改 1下载一个与所用系统内核版本接近的内核,放在/usr/src下,解压,作个链接ln -s linux-2.6.18.1 linux 2修改:修改三个地方 1)/usr/src/linux/kerner/sys.c中添加, asmlinkage int sys_my

使用ioctl“实现”自定义的系统调用

最近做的项目跟Linux内核的关系比较大,我们的项目需要在用户态触发一些 内核态的代码运行.众所周知,内核态的代码是不能直接被用户态代码调用的, 用户态代码触发内核态代码的必须要经过系统调用. 为什么选择 ioctl 那么该如何实现我们的需求呢?有几种方法: 改写内核,扩大系统调用表,添加新的系统调用 利用内核模块,覆盖没被使用或这使用频率很低的一个系统调用的处理函数 利用已有的系统调用,比如ioctl,来"实现"自定义的系统调用. 第一种方法需要修改内核,适用面比较窄:第二种方法ha

Android按键添加和处理的三个解决

 实现方案需求:Android机器上有个Wifi物理按键,现在需求通过点击"wifi物理按键"能够快速的开启/关闭wifi. 经过思考之后,拟出下面几种方案: 方案一,在linux kernel的驱动中捕获"wifi物理按键".在kernel的按键驱动中截获"wifi"按键,并对其进行处理:若是"wifi"是开启的,则关闭wifi:否则,打开wifi. 方案二,在Android中添加一个服务,监听wifi按键消息.若监听到&q

mfc-MFC 关于学生成绩管理系统调用变量 listcontrol中查询

问题描述 MFC 关于学生成绩管理系统调用变量 listcontrol中查询 本人是一名大二的小白 因为要完成课设刚刚接触MFC 想做一个学生信息系统管理 我使用的是LISTCONTROL做信息列表显示 已经完成了添加/删除信息 但是不懂怎么做查询功能 我想要在(FIND)的DIALOG里面输入_学号 然后点击按钮 就能够在编辑框_弹出他的其他信息(姓名.性别.成绩等等)是调用回LISTCONTROL中显示出来我在(ADDINFO)DIALOG里输入的信息 整个程序是从网上找教程 扒帖子 看书