系统调用

来源:互联网 发布:逆战猎场刷永久必知 编辑:程序博客网 时间:2024/06/04 19:11

一、源代码

//定义系统调用编号//linux-0.11/include/unistd.h#define __NR_iam        72#define __NR_whoami     73//hdc/usr/include/unistd.h#define __NR_iam        72#define __NR_whoami     73//定义系统调用在用户空间里的接口函数//iam.c whoami.c都要包含各自的定义#define __LIBRARY__ /* 有它,_syscall1等才有效。详见unistd.h */#include <unistd.h> /* 有它,编译器才能获知自定义的系统调用的编号 */_syscall1(int, iam, const char*, name); /* iam()在用户空间的接口函数 */_syscall2(int, whoami,char*,name,unsigned int,size);/* whoami()在用户空间的接口函数 *///linux-0.11/kernel/system_call.s//改变系统调用总数,防止新添加的系统调用被误认为编号无效nr_system_calls = 74//linux-0.11/include/linux/sys.h//声明系统调用函数extern int sys_iam();extern int sys_whoami();//系统调用数组添加函数指针成员,指向系统调用fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,sys_setreuid,sys_setregid,sys_iam,sys_whoami };
//linux-0.11/kernel/who.c//实现系统调用#include<string.h>#include<errno.h>#include<asm/segment.h>char msg[24];//在内核空间存放字符串//从用户空间取name写到内核空间msg内//若name长度超过23则返回-EINVALint sys_iam(const char* name){    char temp[24];    int i;    for(i=0;i<24;i++){        temp[i]=get_fs_byte(name+i);//从用户空间取得name存放在缓冲区temp内        if(temp[i]=='\0')            break;    }    int len=strlen(temp);    if(len>23)        return -EINVAL;//字符过长    strcpy(msg,temp);//复制缓冲区到msg    return i;}//从内核空间取msg写到用户空间name里//若msg长度大于等于size则返回-EINVALint sys_whoami(char* name, unsigned int size){    int len=strlen(msg);    if(len>=size)        return -EINVAL;//大小不够    int i;    for(i=0;i<size;i++){        put_fs_byte(msg[i],name+i);//取msg放到用户空间的name中        if(msg[i]=='\0')            break;    }    return i;}
//用户程序示例//iam.c#include<errno.h>#define __LIBRARY__#include<unistd.h>_syscall1(int ,iam,const char*,name)int main(int argc,char* argv[]){    iam(argv[1]);    return 0;   }//whoami.c#include<errno.h>#include<stdio.h>#define __LIBRARY__#include<unistd.h>_syscall2(int,whoami,char*,name,int,size);int main(int argc,char* argv[]){    char name[24];    whoami(name,24);    printf("%s\n",name);        return 0;}

二、运行结果

这里写图片描述

三、参考资料

  • HIT-OSLAB-MANUAL系统调用
  • Linux0.11内核–内核空间、用户空间之间的数据传输
  • 系统调用(int 0x80)详解
0 0
原创粉丝点击