minix添加系统调用
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,
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命令。
什么是系统调用? 当谈到系统调用(system call)时,我们首先映入脑海的差不多就是软中断、内核态、用户态。开宗明义第一章,我想让大家先要重新认识一下『系统调用』这个词。
仔细揣摩了一段时间. 系统调用过程,用户进程进入内核态,进程栈进入内核态栈, cpu进入内核态,cpu用户态各寄存器的值保存到内核态栈,执行内核态代码. 执行完从内核态返回到用户态,包括进程栈返回到用户态栈,cpu返回到用户态,cpu各寄存器的值用之前保存在内核态栈的值还原. 内核在执行系统调用时处于进程上下文中,current指针指向当前进程,即引发系统调用的进程。
实现自己的系统调用(两种方式) 【转】 转自:http://blog.163.com/zhe_wang_2009/blog/static/1722821212012328104325531/ 学习linux操作系统课,有一章讲“系统调用”,其中有个内容是在linux内核中添加一个自己的系统调用。
相关文章
- pycharm添加搜索路径_pycharm系统找不到指定路径
- 羊了个羊开发功能丨羊了个羊游戏系统开发详细通关教程
- 远程人脸识别系统技术要求 安全分级
- FormFactor 添加了对量子计算机部署至关重要的稀释制冷 (DR) 系统
- 【Android 电量优化】电量优化特性 ( Doze 低电耗模式 | Standby 应用待机模式 | 白名单设置 | 白名单添加系统设置界面 | 指定应用的白名单添加界面 | 测试应用 )
- iStat Menus for Mac(系统状态信息监测工具)
- WordPress 技巧:在 WordPress 后台菜单系统中添加 Home 链接
- Oracle软件卸载指南:快速清理你的系统(oracle卸载软件)
- Linux的发展史:丰富的分支系统(linux的分支)
- 使用 LVM 为你的 Fedora 系统添加存储
- 将 Fedora Linux 系统添加到企业域中
- 硬核观察 | 美国佛罗里达州水处理系统遭黑客攻击,被调整了自来水成分
- QEMU在Linux系统中的应用(qemulinux)
- 如何在Linux系统中添加网卡?(linux添加网卡)
- Linux 系统下添加 host 方案详解(linux添加host)
- s文件Linux系统添加Hosts文件实现网络加速(linux加host)
- Linux系统如何为用户添加组权限(linux给用户加入组)
- 使用Linux命令控制面板,轻松管理你的系统(linux命令控制面板)
- Linux系统如何添加新硬盘(linux 添加硬盘)
- 利用yac与redis缓存系统实现极速存储(yac和redis)
- Oracle 10添加新实例实现快速增强系统性能(oracle10添加实例)
- MAC系统中添加MYSQL开机启动的方法