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
上一篇:
模擬Post請求
下一篇:
.net讀寫配置文件
明明白白WAS&amp;IBM JDK的版本以及它們各安裝了哪些補丁!
Java IO的基礎操作書目錄
江蘇聯合阿裏雲啟動“1+30+300”工程 全麵擁抱雲計算
在2016年挖掘雲端能力的10種方式
國際商業美術設計師阿裏雲開發首頁
Android MediaPlayer播放prepareAsync called in state 8解決辦法
《大數據係統基礎》課程實踐項目中期答辯順利舉行,清華持續探索大數據人才教育創新之路
Apache Kafka - Schema Registry
【Linux sshfs】sshfs將遠程目錄掛載到本地目錄
上海虹口區涼城新村質量永恒自動門安裝50930378