c++ 调用程序接口_添加系统调用(返回文件信息)

终于把操作系统实验一:完成添加一个新的系统调用做完啦!一个什么也不懂的linux小白,从一开始觉得做完实验遥遥无期,甚至在想会不会挂科,到现在终于编译成功,心情也是一波三折。故以此篇记录第一次实验完成的情况。

要求:添加一个新的系统调用,返回指定文件的相关信息,如索引节点编号、硬连接数、文件所有者标识符、文件的字节数和访问方式等。

什么是系统调用

系统调用也叫程序接口,是应用程序请求OS内核完成某功能时的一种过程调用,是用户程序对OS内核功能进行调用的一种手段。

Linux中系统调用的处理过程如下:

1)首先有封装例程设置系统调用功能号和参数,并存到相应寄存器中;

2)执行封装例程中的int 0x80指令,系统产生软中断(或陷入),由中断硬件完成部分现场信息保护:PSW的值和PC寄存器的值;并通过中断向量转向一个中断处理程序system_call()完成其他CPU现场信息的保存:如陷入类型、参数表指针、其他CPU寄存器的值等;

3)使用系统调用功能号查找系统调用入口表,找到相应系统调用的服务例程的入口地址sys_xxx();

4)执行系统调用服务例程sys_xxx(),完毕后返回执行成功与否以及成功时的执行结果给调用者;恢复被中断进程或新调度进程的CPU现场,返回被中断进程或新调度进程执行。

添加系统调用步骤

1、以下载的linux内核文件夹为base dir,首先在./arch/x86/entry/syscalls/syscall_64.tbl文件中添加一个系统调用号,包括系统调用名称、服务例程入口。

2、在./include/linux/syscalls.h文件中添加服务例程的原型声明。

3、在./kernel/sys.c中添加系统调用服务例程。

添加の源码

系统调用服务例程

SYSCALL_DEFINE6(checkfile,char __user*,filename,void __user*,innode,void __user*,lnnum,void __user*,owner,void __user*,size,void __user*,method){
    
	printk("checkfile:n");
	struct kstat* myfilestat;
	myfilestat =(struct kstat *) kmalloc(sizeof(struct kstat),GFP_KERNEL);
	vfs_stat(filename,myfilestat);
	printk("done,then copy to user...n");
	unsigned long ker_ino =myfilestat->ino;
	unsigned long ker_nlink=myfilestat->nlink;
	unsigned long ker_uid=(myfilestat->uid).val;
	unsigned long ker_size=myfilestat->size;
	unsigned short ker_mode=myfilestat->mode;
	copy_to_user(innode, &ker_ino, sizeof(ker_ino));
        copy_to_user(lnnum, &ker_nlink, sizeof(ker_nlink));
	copy_to_user(owner,&ker_uid,sizeof(ker_uid));
	copy_to_user(size,&ker_size,sizeof(ker_size));
	copy_to_user(method,&ker_mode,sizeof(ker_mode));
	return 0;
}

测试程序

#include<stdio.h>
#include<unistd.h>
#include<sys/syscall.h>
#include<stdlib.h>

#define _SYSCALL_MYNUM 336
int modecode[16];
void print_short(unsigned short *a){
    
    for(int i=0;i<16;i++){
    
        int k=(*a)&(1<<(15-i))?1:0;
        printf("%d",k);
	if(i==3||i==6||i==9||i==12) printf(" ");
	modecode[i]=k;
	
    }
    printf("n");
}

int main(){
    
	unsigned long innode,lnlink,owner,size;
	unsigned short method;
	char array[16];
	char s[50];
	printf("Want to checkfile for you? Just input the path!");
	scanf("%s",s);
	printf("The infomation of the file:%s",s);

	syscall(_SYSCALL_MYNUM,s,&innode
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值