博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
系统调用之sys32_quotactl
阅读量:4216 次
发布时间:2019-05-26

本文共 1702 字,大约阅读时间需要 5 分钟。

这个函数在kernel space中从当前进程的用户空间申请一段内存空间并从kernel中的到quote 信息后,然后copy到用户空间中其中的quote信息如下:struct if_dqblk {	__u64 dqb_bhardlimit;	__u64 dqb_bsoftlimit;	__u64 dqb_curspace;	__u64 dqb_ihardlimit;	__u64 dqb_isoftlimit;	__u64 dqb_curinodes;	__u64 dqb_btime;	__u64 dqb_itime;	__u32 dqb_valid;};其源码分析如下:asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special,						qid_t id, void __user *addr){	unsigned int cmds;	struct if_dqblk __user *dqblk;	struct compat_if_dqblk __user *compat_dqblk;	struct fs_quota_stat __user *fsqstat;	struct compat_fs_quota_stat __user *compat_fsqstat;	compat_uint_t data;	u16 xdata;	long ret;	cmds = cmd >> SUBCMDSHIFT;	#总共有三个命令,分别是Q_GETQUOTA/Q_SETQUOTA/Q_XGETQSTAT 这三个命令的实现类似	switch (cmds) {	case Q_GETQUOTA:		#从用户空间申请一段memory		dqblk = compat_alloc_user_space(sizeof(struct if_dqblk));		compat_dqblk = addr;		#得到quote信息dqblk		ret = sys_quotactl(cmd, special, id, dqblk);		if (ret)			break;			#将dqblk中的信息copy到用户空间memory compat_dqblk 中,这里 compat_dqblk 和 dqblk 都是用户空间的memory		if (copy_in_user(compat_dqblk, dqblk, sizeof(*compat_dqblk)) ||			get_user(data, &dqblk->dqb_valid) ||			put_user(data, &compat_dqblk->dqb_valid))			ret = -EFAULT;		break;}下来我们看看如何在kernel中申请用户空间memoryvoid __user *compat_alloc_user_space(unsigned long len){	void __user *ptr;	/* If len would occupy more than half of the entire compat space... */	#检查参数是否合理	if (unlikely(len > (((compat_uptr_t)~0) >> 1)))		return NULL;	ptr = arch_compat_alloc_user_space(len);	#检查是否有写权限	if (unlikely(!access_ok(VERIFY_WRITE, ptr, len)))		return NULL;	return ptr;}static inline void __user *arch_compat_alloc_user_space(long len){	return (void __user *)compat_user_stack_pointer() - len;}原来就是直接从stack 顶端拿一个memory呀

转载地址:http://icnmi.baihongyu.com/

你可能感兴趣的文章
现在真是简单至极了 - SpringBoot之使用JPA完成简单的rest api
查看>>
(验证过)使用Win10系统远程桌面连接CentOS7系统方法 CentOS7使用GNOME Desktop可视化桌面
查看>>
rancher跟k8s有那些不同
查看>>
CentOS中环境变量和配置文件
查看>>
开源大数据平台如何才能保证身份认证安全?Kerberos
查看>>
kerberos认证原理---讲的非常细致,易懂
查看>>
【大数据安全】基于Kerberos的大数据安全验证方案
查看>>
数据治理 - 数据仓库历史数据存储 - 拉链表
查看>>
数据治理 - 漫谈数据仓库之维度建模
查看>>
mark : JVM性能调优之生成堆的dump文件
查看>>
并发编程中的协程
查看>>
Spring Security
查看>>
Spring Security
查看>>
Mark : Hadoop源码解析之: TextInputFormat如何处理跨split的行
查看>>
Mark : Spark文章 收录
查看>>
Mark : Scala 文章收录
查看>>
Mark : 【Scala】使用Option、Some、None,避免使用null
查看>>
Mark : BlockingQueue在任务调度中的精彩应用
查看>>
Mark :BlockingQueue
查看>>
编程思想 - OpenHashMap 为什么比hashmap 快
查看>>