全部博文(14)
2012年(14)
分类: LINUX
2012-12-06 16:07:14
函数:pidhash_init()4种PID的hash表初始化
原形:
void __init pidhash_init(void)
参数:
无
返回值:
无
函数注释:
void __init pidhash_init(void)
{
int i, j, pidhash_size;
unsigned long megabytes = nr_kernel_pages >> (20 - PAGE_SHIFT);
//计算内核内存容量
pidhash_shift = max(4, fls(megabytes * 4)); //pidhash_shift 全局变量设置为4
pidhash_shift = min(12, pidhash_shift); //pidhash_shift 全局变量不能大于等于12
pidhash_size = 1 << pidhash_shift; //计数pidhash的大小(list_head的单元数)
printk("PID hash table entries: %d (order: %d, %Zd bytes)\n",
pidhash_size, pidhash_shift,
PIDTYPE_MAX * pidhash_size * sizeof(struct hlist_head));
//打印hash表信息
for (i = 0; i < PIDTYPE_MAX; i++) {
pid_hash[i] = alloc_bootmem(pidhash_size * sizeof(*(pid_hash[i])));
//调用 alloc_bootmem申请物理内存
if (!pid_hash[i]) //如果申请内存失败
panic("Could not alloc pidhash!\n"); //调用panic,说明系统没足够内存
for (j = 0; j < pidhash_size; j++)
INIT_HLIST_HEAD(&pid_hash[i][j]); //初始化hash表中的每个链表
}
}
函数:pidmap_init()4种PID的位码表初始化
原形:
void __init pidmap_init(void)
参数:
无
返回值:
无
函数注释:
void __init pidmap_init(void)
{
int i;
pidmap_array->page = (void *)get_zeroed_page(GFP_KERNEL);
//申请1页内存将其全部清0
set_bit(0, pidmap_array->page); //将PID位码表的第0位置1
atomic_dec(&pidmap_array->nr_free); //将系统的空闲PID减1
for (i = 0; i < PIDTYPE_MAX; i++)
attach_pid(current, i, 0); //将当前进程的4种PID号对应的pids[]链接 //到其对应的PID hash表中的pid_hish[i][pid_hishfn(0)]链表中
}
函数:attach_pid()4种PID的位码表初始化
原形:
int fastcall attach_pid(task_t *task, enum pid_type type, int nr)
参数:
task:进程task_t 的结构指针
type:PID类型
nr:PID号
返回值:
无
函数注释:
int fastcall attach_pid(task_t *task, enum pid_type type, int nr)
{
struct pid *pid, *task_pid;
task_pid = &task->pids[type]; //找到task的type类型ID号的结构指针
pid = find_pid(type, nr); //pid号等于nr的pid结构
if (pid == NULL) { //如果没有在PID hash表的链表中找到该PID号对应的结构指针
hlist_add_head(&task_pid->pid_chain,
&pid_hash[type][pid_hashfn(nr)]);
//将task_pids[type]链接到pid_hash[type][pid_hashfn(nr)]中
INIT_LIST_HEAD(&task_pid->pid_list);
//初始化task_pids[type].pid_list 链表
} else {
INIT_HLIST_NODE(&task_pid->pid_chain);
//初始化task_pids[type].pid_chain hash链表
list_add_tail(&task_pid->pid_list, &pid->pid_list);
//将task_pids[type]通过其pid_list链接到拥有相同PID号的循环链表末尾
}
task_pid->nr = nr; //将task_pid的ID号设置为nr
return 0; //返回值为0
}