经过一系统的初始化之后,可以寻找该文件的加载module了.这是由search_binary_handler()完成的.在深入到这段代码之前.我们有必要讨论一下linux可执文件模块的组织.
在linux内核,用linux_binfmt结构来表示每一个加载模块.它的定义如下:
struct linux_binfmt {
结构中的lh将之组成一个链表,这个链表的表头是formats.
//用来构成链表
struct list_head lh;
//所属的module
struct module *module;
//加载可执行文件
int (*load_binary)(struct linux_binprm *, struct pt_regs * regs);
//加载共享库
int (*load_shlib)(struct file *);
int (*core_dump)(long signr, struct pt_regs *regs, struct file *file, unsigned long limit);
unsigned long min_coredump; /* minimal dump size */
int hasvdso;
}
为了说明,我们来看一下如何注册一个可执行文件的加载模块.
int register_binfmt(struct linux_binfmt * fmt)
所以,在加载可执文件的时候,只要遍历formats这个链表,然后依次按module加载这个可执行文件.这正是search_binary_handler()所做的.代码如下:
{
if (!fmt)
return -EINVAL;
write_lock(&binfmt_lock);
//将其添加之链表
list_add(&fmt->lh, &formats);
write_unlock(&binfmt_lock);
return 0;
}