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