上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.4.5 内核和模块的符号表
内核的模块是目标代码,在运行时加入到内核中,一旦它被嵌入到内核后,模块就在内核的地址空间了。在模块被嵌入到内核之前,有几个问题需要注意,模块中的函数可能需要调用内核的函数,也可能需要使用内核的数据结构,所以我们首先需要展开这些函数和数据结构的地址。Linux内核中包含了一个符号表ksym,表中包含了所有符号(函数名、变量名)与地址的对应关系。
模块只能访问内核符号表中列出的函数和变量。你可以用命令ksyms –a来列出内核符号表的内容。
c0823100 u mem_map c047e166 u __kmalloc f884186c t cleanup_模块 c046a0a6 u register_shrinker c043d4eb u prepare_to_wait c047d5e2 u kfree c0426460 u __wake_up …
定义在kernel/ksyms.c中的指令EXPORT_SYMBOL(xxx) 向符号表中加入内核的函数或变量,这样模块就可以访问这些符号了。除此之外,模块也可以向符号表输出模块的函数和变量的引用指针。宏EXPORT_SYMBOL允许模块向符号表加入选定的函数或数据指针。