日本人真人做真爱免费的网站/微信搜一搜排名优化
终于把操作系统实验一:完成添加一个新的系统调用做完啦!一个什么也不懂的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
测试程序
#include
所使用的内核源码解释
源码版本4.16.3
参考服务例程代码
SYSCALL_DEFINE2
正常时,返回0

include/linux/stat.h —— kstat结构体定义
struct
include/linux/fs.h
vfs_stat
static
AT_FDCWD:相对于当前进程工作空间
AT_NO_AUTOMOUNT: 和挂载点有关,允许收集挂载点的属性。
STATX_BASIC_STATS:查询基本信息
fs/stat.c
vfs_statx
/**
查找文件所在的path,填入path结构体
struct
vfsmount结构描述的是一个独立文件系统的挂载信息,每个不同挂载点对应一个独立的vfsmount结构,属于同一文件系统的所有目录和文件隶属于同一个vfsmount,该vfsmount结构对应于该文件系统顶层目录,即挂载目录;
dentry:目录的相关信息
详见 https://blog.csdn.net/dongcheng123456789/article/details/100125707
user_path_at
static
user_path_at_empty
int
filename_lookup
static
fs/stat.c
vfs_getattr()
/*
security_inode_getattr
int
vfs_getattr_nosec
d_backing_inode 函数 会获得 inode
/**
generic_fillattr
/**