系统调用

一、源代码
//定义系统调用编号
//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则返回-EINVAL
int 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则返回-EINVAL
int 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;
}
二、运行结果

这里写图片描述

三、参考资料
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值