Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45918
  • 博文数量: 14
  • 博客积分: 205
  • 博客等级: 入伍新兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-18 10:35
文章分类
文章存档

2012年(14)

我的朋友

分类: LINUX

2012-12-06 16:07:14

函数:pidhash_init()4PIDhash表初始化

原形:

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()4PID的位码表初始化

原形:

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);  //将系统的空闲PID1

for (i = 0; i < PIDTYPE_MAX; i++)

attach_pid(current, i, 0);           //将当前进程的4PID号对应的pids[]链接 //到其对应的PID hash表中的pid_hish[i][pid_hishfn(0)]链表中

}

函数:attach_pid()4PID的位码表初始化

原形:

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]; //找到tasktype类型ID号的结构指针

pid = find_pid(type, nr);     //pid号等于nrpid结构

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_pidID号设置为nr

return 0;               //返回值为0

}

阅读(2555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~