Profil de zj羽笑飞烟PhotosBlogListesPlus ![]() | Aide |
|
|
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是待执行函 //数的指针。 |
|
|