Linux内核机制第一集
作者:互联网
想对Linux内核机制史无前例的清楚,最主要的就是落到实处,这也是我高中语文老师每天挂在嘴边的话。
我们打算每星期讨论一章的内容,可快可慢。
现在新建一个git仓库,每个人把自己对上一回说的那本书中的每一章笔记都push上去,这样除了对自己有要求外,也可以参照别人的笔记,不清楚的地方可以在群里面一起讨论解决。我已经非常详细的对照源码分析完一章了,也上传了我觉得比较重要的部分。
一个人学习往往动力会不足,学的不够精细,想的不全。
github地址:
https://github.com/x-lugoo/kernel-note.git
贴上部分笔记:
**找段名称字符串表的基地址:**
通过hdr中的e_shstrndx 对应到entry数组的下标直接索引到字符串表的entry,再通过entry中的 sh_offset找到字符串表的基地址,基地址使用secstrings变量保存。
**找符号名称字符串表基地址:**
遍历数组entry中的各个entry,找到entry数组结构中sh_type类型为SHT_SYMTAB的entry,通过这个entry结构中的sh_link对应到entry数组结构下标的entry,从这个entry的sh_offset找到对应的section的基地址,即是符号名称字符串表基地址,使用strtab表示。
获取某一段的名称
假设该段在Section header table中的索引为i,那么secstrings + entry[i].sh.name即是该段的名字。
获取符号名称的基地址:
遍历整个符号名称字符串表,因为这个段是struct Elf_Sym数组构成,遍历数组中买一个struct Elf_Sym结构,匹配到与查找名称相同的Struct Elf_Sym.再从Struct Elf_Sym取出符号名称的基地址。
__visible struct module __this_module
__attribute__((section(".gnu.linkonce.this_module"))) = {
.name = KBUILD_MODNAME,
.init = init_module,
#ifdef CONFIG_MODULE_UNLOAD
.exit = cleanup_module,
#endif
.arch = MODULE_ARCH_INIT,
};
```
用.gnu.linkonce.this_module段表示struct module结构,在内核中
有这样定义:
extern struct module __this_module;
#define THIS_MODULE (&__this_module)
所以THIS_MODULE就指向了.gnu.linkonce.this_module段中的struct module 结构。
标签:__,struct,第一集,module,地址,sh,内核,Linux,entry 来源: https://blog.51cto.com/15069487/2612733