2.6内核中网络模块调用入口
2006-04-26 17:46
148 查看
刚下了一份2.6.16的kernel,比情景分析中的讲解变得太多了,在/init/main.c中,start_kernel创建了init核心进程后,没找到网络模块的调用入口.???那就反向来吧,找af_inet.c中输出了什么东西让kernel可以调用.呵呵,inet_init,这个是不用怀疑吧,可是用source in sight搜索了整个工程,都没看到调用了inet_init.???
在inet_init后紧接着是:module_init(inet_init);声明成模块了,可以静态连入kernel也可做为module动态insmod.
而在include/linux/init.h中将module_init 声明为:#define module_init(x) __initcall(x);而__initcall又声明为#define __initcall(fn) device_initcall(fn);而device_initcall为#define device_initcall(fn) __define_initcall("6",fn);__define_initcall为#define __define_initcall(level,fn) /
static initcall_t __initcall_##fn __attribute_used__ /
__attribute__((__section__(".initcall" level ".init"))) = fn
在arch/i386/kernel/vmlinux.lds.s中定义了initcall.init这样一个section:如下:
__initcall_start = .;
.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
*(.initcall1.init)
*(.initcall2.init)
*(.initcall3.init)
*(.initcall4.init)
*(.initcall5.init)
*(.initcall6.init)
*(.initcall7.init)
}
__initcall_end = .;
也就是说当将一个原本由init()显示调用的function声明为module后,其module_init函数会ld在链接时,会根据其优先级??(1为core_initcall,2为postcore_initcall,在init.h中有相应定义)链接到initcall.init 这个section中相应位置,越靠前就越先执行.(还是对ld不熟). :(
这样具体再来看:start_kernel() --->init() ---->do_basic_setup() --->do_initcalls();
这个就是一部分do_initcalls的代码了,
static void __init do_initcalls(void)
{
initcall_t *call;
for (call = __initcall_start; call < __initcall_end; call++) {
....
(*call)();
}
在这段代码中,从initcall.init 节中取出所有的initcall,其实就是4个byte的function pointer,再执行.很容易看出来,core_initcall比device_initcall要优先级高些. :)
随手记下的一些笔记,如有错误,麻烦指正,共同进步.
在inet_init后紧接着是:module_init(inet_init);声明成模块了,可以静态连入kernel也可做为module动态insmod.
而在include/linux/init.h中将module_init 声明为:#define module_init(x) __initcall(x);而__initcall又声明为#define __initcall(fn) device_initcall(fn);而device_initcall为#define device_initcall(fn) __define_initcall("6",fn);__define_initcall为#define __define_initcall(level,fn) /
static initcall_t __initcall_##fn __attribute_used__ /
__attribute__((__section__(".initcall" level ".init"))) = fn
在arch/i386/kernel/vmlinux.lds.s中定义了initcall.init这样一个section:如下:
__initcall_start = .;
.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
*(.initcall1.init)
*(.initcall2.init)
*(.initcall3.init)
*(.initcall4.init)
*(.initcall5.init)
*(.initcall6.init)
*(.initcall7.init)
}
__initcall_end = .;
也就是说当将一个原本由init()显示调用的function声明为module后,其module_init函数会ld在链接时,会根据其优先级??(1为core_initcall,2为postcore_initcall,在init.h中有相应定义)链接到initcall.init 这个section中相应位置,越靠前就越先执行.(还是对ld不熟). :(
这样具体再来看:start_kernel() --->init() ---->do_basic_setup() --->do_initcalls();
这个就是一部分do_initcalls的代码了,
static void __init do_initcalls(void)
{
initcall_t *call;
for (call = __initcall_start; call < __initcall_end; call++) {
....
(*call)();
}
在这段代码中,从initcall.init 节中取出所有的initcall,其实就是4个byte的function pointer,再执行.很容易看出来,core_initcall比device_initcall要优先级高些. :)
随手记下的一些笔记,如有错误,麻烦指正,共同进步.
相关文章推荐
- linux 2.6内核 编译模块Makefile 详解
- linux-2.6内核模块引用计数的实现
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- 使用内核模块添加系统调用
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- Linux 2.6内核的编译步骤及模块的动态加载
- 增加Linux系统调用——通过增加内核模块
- 增加Linux系统调用——通过Hack增加内核模块
- Linux内存管理:Linux 可加载内核模块剖析:2.6 内核透视图
- driver: linux2.6 内核模块导出函数实例(EXPORT_SYMBOL)
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响—linux2.4单独编译驱动模块
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响 -zt
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- 在Debian 4.0rc3上编译内核2.6.24时加入Layer7模块笔记[防火墙中在TCP/IP第七层Layer7应用层阻挡QQ,MSN等软件的应用]
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- Android 中用内核模块实现系统调用(Implement system call by kernel module in Android)
- Android内核开发 Linux C编程调用内核模块设备驱动
- linux2.6内核模块编译的makefile模板