系统相关
首页 > 系统相关> > Linux内核机制第一集

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