Profil de zj羽笑飞烟PhotosBlogListesPlus Outils Aide

Blog


15 octobre

GRUB2源码分析--模块支持2

第二部分,符号解析( Symbol resolve )

数据结构:

struct grub_symbol

{

  struct grub_symbol *next;

  const char *name;

  void *addr;

  grub_dl_t mod;   /* The module to which this symbol belongs.  */

};
全局变量:

#define GRUB_SYMTAB_SIZE     509

                                                 //符号表的大小

 

static struct grub_symbol *grub_symtab[GRUB_SYMTAB_SIZE];

                                                 //符号表,使用了一个 open-hash

 

函数:

grub_symbol_hash( const char *s )

                                                 //哈希函数,将一个给定的字符串映射到相应的索引

 

grub_dl_resolve_symbol( const char *name )

                                                 //解析符号 name 并且返回相应的地址,实现过程大致如下

                                                 //图所示,先将 name 进行哈希处理,得到索引值,再从索

                                                 //引值指向的地址开始搜索 name 域与指定值相同的

                                                 //grub_symbol结构,并返回其地址。

grub_dl_register_symbol( const char *name, void *addr, grub_dl_t mod )

                                                 //注册名字为 name 地址为 addr 的符号,实现过程很简单

                                                 //就是先用grub_symbol_hash( )处理name,找到插入位置的

                                                 //索引值,然后在该位置插入符号结构。

 

grub_dl_unregister_symbols( grub_dl_t mod )

                                                 //反注册模块 mod 中定义的符号

                                                 //实现过程:遍历整个符号表 grub_symtab[ ],搜索 mod

                                                 //与指定 mod 值相同的符号结构,并将其从链表中删除。

 

grub_dl_get_section_addr( grub_dl_t mod, unsigned n )

                                                 //查找mod->segment指向的链表中

                                                 // grub_dl_segment.section == n 的结构,并返回该结构的

                                                 //地址域 grub_dl_segment.addr

12 octobre

GRUB2源码分析--模块支持1

操作系统作业
kern下的dl.c提供了模块的支持,以下就dl.c的第一部分进行简单分析。

第一部分,模块的基本操作,包括模块查找,插入,删除等

数据结构:

struct grub_dl_list                 //模块列表

{

struct grub_dl_list *next;       //指向下一项的指针

grub_dl_t mod;                    //模块指针

};

全局变量

static grub_dl_list_t grub_dl_head; //指向模块列表的头指针

大致结构图如下:

函数:

grub_dl_get( const char *name )     //获取名字为 *name 的模块的指针,实现过程就是一个

                                                      //简单的链表遍历过程。

grub_dl_add( grub_dl_t mod )        //增加模块,实现过程就是一个链表的插入操作,首先判断

                                                      //该模块是否已经加载,若未加载,则在链表头部插入该模

                                                      //块。

grub_dl_remove( grub_dl_t mod )

                                                      //删除模块,实现过程即简单的链表删除节点的操作。

grub_dl_iterate( int( *hook ) ( grub_dl_t mod ) )

                                                      //对列表的所有节点执行同一函数操作,*hook是待执行函

                                                      //数的指针。

函数:

grub_dl_get( const char *name )     //获取名字为 *name 的模块的指针,实现过程就是一个

                                                      //简单的链表遍历过程。

grub_dl_add( grub_dl_t mod )        //增加模块,实现过程就是一个链表的插入操作,首先判断

                                                      //该模块是否已经加载,若未加载,则在链表头部插入该模

                                                      //块。

grub_dl_remove( grub_dl_t mod )

                                                     //删除模块,实现过程即简单的链表删除节点的操作。

grub_dl_iterate( int( *hook ) ( grub_dl_t mod ) )

                                                     //对列表的所有节点执行同一函数操作,*hook是待执行函

                                                     //数的指针。