getuid源码分析
https://elixir.bootlin.com/linux/v6.13.5/source/kernel/sys.c#L995
current_uid
current_uid是一个宏:
然后是走current_cred_xxx,相当于是current_cred()->uid:
然后current_cred如下:
总之,current_uid的作用就是从当前task中找到cred,并从中取出uid;
基本数据结构
数据结构:
说到底就是个int32。
uid_map
uid_map结构如下:
分两种情况使用,当数量小于5的时候采用第一种模式,数量大于5的时候采用链表,通过nr_extents来表征,如果是链表,这个nr_extents不会被破坏,改成大于5的数字应该就行了:
整体结构
过程分析
from_kuid_munged主要执行了from_kuid函数:
from_kuid则只执行了map_id_up函数:
map_id_up函数首先根据map的nr_extents成员来判断uid_map的实现方式:
然后通过map_id_up_base或者map_id_up_max来取出对应的extent,下面先只看map_id_up_base,first
为本子 user ns 的起始 uid,lower_first
为父 user ns 的起始 uid(内核会转换成全局uid),count
为映射的个数
对extent,个人的理解是,每一个extent表示一段连续的映射,first表示这段连续映射中子user_ns的起始uid,lower_first表示这段来纳许映射中父(或者全局?)user_ns的起始uid,count则表示这段连续映射中映射的数量:
关于 Capability
分析一下open函数在内核中是怎样进行权限检查的https://elixir.bootlin.com/linux/v6.13.5/source/fs/open.c#L1414:
https://elixir.bootlin.com/linux/v6.13.5/source/fs/namei.c#L380