写一写涉及到的Linux函数源码,拙见如有错误之处,还烦请各位指正。本博文的目录均是相对于/usr/src/linux-4.16.3
(Linux-4.16.3是手动下载的)而言
要查看源码,首先要明白Linux的内核源码的存放的大概位置。先看一下目录:
目录分析:
arch/
存放一些有关硬件的文件代码,本博文没有用到include/
大多数的头文件,一些结构体,服务例程的声明(添加系统调用在include/linux/syscalls.h
中声明)init/
核心启动代码mm
内存管理的代码drivers
驱动器的代码ipc
进程间的通讯代码modules
可以加载的模块代码fs
文件系统代码kernel
核心代码,一些内核函数在这边net
有关网络的代码lib
核心的库scripts
配置代码documentation
说明文档struct pid 是进程描述符,在include/linux/pid.h
中,其定义如下:
struct pid
{
atomic_t count;
unsigned int level;
/* lists of tasks that use this pid */
struct hlist_head tasks[PIDTYPE_MAX];
struct rcu_head rcu;
struct upid numbers[1];
};
find_get_pid(pid_t nr) 是通过进程号pid_t nr得到进程描述符,并将结构体中的count加1,在linux/kernel/pid.c
中,源码如下:
struct pid *find_get_pid(pid_t nr)
{
struct pid *pid;
rcu_read_lock();
pid = get_pid(find_vpid(nr));
rcu_read_unlock();
return pid;
}
其中,find_vpid(pid_t nr) 返回的是进程描述符,get_pid(struct pid * kpid)则是让count加1.
get_pid(pid* pid)
在/include/linux/pid.h
中
static inline struct pid *get_pid(struct pid *pid)
{
if (pid)
atomic_inc(&pid->count);
return pid;
}
find_vpid(pid_t nr)
在/kernel/pid.c
中
struct pid *find_vpid(int nr)
{
return find_pid_ns(nr, task_active_pid_ns(current));
}
其中涉及到了find_pid_ns(nr,task_active_pid_ns(current)),哦,天!
find_pid_ns(nr,task_active_pid_ns(current))
struct pid *find_pid_ns(int nr, struct pid_namespace *ns)
{
return idr_find(&ns->idr, nr);
}
task_active_pid_ns(current)
是返回pid_namespace struct
struct pid_namespace *task_active_pid_ns(struct task_struct *tsk)
{
return ns_of_pid(task_pid(tsk));
}
pid_task(pid* pid,PIDTYPE_PID) 可以通过进程描述符找到task_struct* task
pid_task(pid* pid,PIDTYPE_PID)
struct task_struct *pid_task(struct pid *pid, enum pid_type type)
{
struct task_struct *result = NULL;
if (pid) {
struct hlist_node *first;
first = rcu_dereference_check(hlist_first_rcu(&pid->tasks[type]),
lockdep_tasklist_lock_is_held());
if (first)
result = hlist_entry(first, struct task_struct, pids[(type)].node);
}
return result;
}
enum pid_type
在/include/linux/pid.h
中,定义如下:
enum pid_type
{
PIDTYPE_PID,
PIDTYPE_PGID,
PIDTYPE_SID,
PIDTYPE_MAX,
/* only valid to __task_pid_nr_ns() */
__PIDTYPE_TGID
};
task_struct
在/include/linux/sched.h
很多内容,可以查看一番,主要是:
进程标识符:
pid_t pid; //进程标识符
pid_t tgid; //线程组标识符
进程标记符:unsigned int flags;