Linux那些事儿 之 戏说USB(12)从这里开始
来源:互联网 发布:windows 制作mac u盘 编辑:程序博客网 时间:2024/05/01 08:19
43 #define __init __attribute__ ((__section__ (".init.text")))
The `section' attribute specifies that a function lives in a
particular section. For example, the declaration:
puts the function ‘foobar' in the ‘bar' section.
‘section' attribute is not available on all platforms. If you
need to map the entire contents of a module to a particular
section, consider using the facilities of the linker instead.
125 #define subsys_initcall(fn) __define_initcall("4",fn,4)
这里又出现了一个宏__define_initcall,它是用来将指定的函数指针fn放到initcall.init节里,也在include/linux/init.h文件里定义,这里就不多说了,有那点意思就可以了。而对于具体的subsys_initcall宏,则是把fn放到.initcall.init的子节.initcall4.init里。要弄清楚.initcall.init、.init.text和.initcall4.init这样的东东,我们还需要了解一点内核可执行文件相关的概念。
内核可执行文件由许多链接在一起的对象文件组成。对象文件有许多节,如文本、数据、init 数据、bass 等等。这些对象文件都是由一个称为链接器脚本的文件链接并装入的。这个链接器脚本的功能是将输入对象文件的各节映射到输出文件中;换句话说,它将所有输入对象文件都链接到单一的可执行文件中,将该可执行文件的各节装入到指定地址处。 vmlinux.lds是存在于 arch/<target>/ 目录中的内核链接器脚本,它负责链接内核的各个节并将它们装入内存中特定偏移量处。
涉及到的东西越来越多了是吧,先深呼吸,平静一下,坚定而又勇敢的打开arch/i386/kernel/vmlinux.lds文件,你就会见到前所未见的景象。我可以负责任的说,要看懂这个文件是需要一番功夫的,不过大家都是聪明人,聪明人做聪明事,所以你需要做的只是搜索initcall.init,然后便会看到似曾相识的内容
这里的__initcall_start指向.initcall.init节的开始,__initcall_end指向它的结尾。而.initcall.init节又被分为了7个子节,分别是
我们的subsys_initcall宏便是将指定的函数指针放在了.initcall4.init子节。其它的比如core_initcall将函数指针放在.initcall1.init子节,device_initcall将函数指针放在了.initcall6.init子节等等,都可以从include/linux/init.h文件找到它们的定义。各个字节的顺序是确定的,即先调用.initcall1.init中的函数指针再调用.initcall2.init中的函数指针,等等。__init修饰的初始化函数在内核初始化过程中调用的顺序和.initcall.init节里函数指针的顺序有关,不同的初始化函数被放在不同的子节中,因此也就决定了它们的调用顺序。
至于实际执行函数调用的地方,就在/init/main.c文件里,内核的初始化么,不在那里还能在哪里,里面的do_initcalls函数会直接用到这里的__initcall_start、__initcall_end来进行判断,不多说了。我们的思念已经入滔滔江水泛滥成灾了,还是回到久违的usb_init函数吧。
- Linux那些事儿 之 戏说USB(12)从这里开始
- Linux那些事儿 之 戏说USB(12)从这里开始
- Linux那些事儿 之 戏说USB(8)从这里开始
- 【转】Linux那些事儿 之 戏说USB(12)从这里开始
- Linux那些事儿 之 戏说USB(10)好戏开始了
- Linux那些事儿 之 戏说USB(10)好戏开始了
- Linux那些事儿 之 戏说USB(10)好戏开始了
- Linux那些事儿 之 戏说USB(6)好戏开始了
- 【转】Linux那些事儿 之 戏说USB(10)好戏开始了
- Linux那些事儿 之 戏说USB(2)它从哪里来
- 【转】Linux那些事儿 之 戏说USB(2)它从哪里来
- Linux那些事儿 之 戏说USB(1)它从哪里来
- Linux那些事儿 之 戏说USB(1)说在前面
- Linux那些事儿 之 戏说USB(3)PK
- Linux那些事儿 之 戏说USB(4)漫漫辛酸路
- Linux那些事儿 之 戏说USB(6)我是一棵树(一)
- Linux那些事儿 之 戏说USB(7)我是一棵树(二)
- Linux那些事儿 之 戏说USB(8)最终奥义
- MonkeyRunner_My test app source code
- C++ STL资料汇总
- Stage3D 翻译系列之五:何为AGAL(Adobe 图形汇编语言)
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
- tomcat HTTP DIGEST
- Linux那些事儿 之 戏说USB(12)从这里开始
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
- 百鸡百钱问题
- Error filterStart
- 短信发送。
- [OpenWrt] openwrt启动脚本分析
- ubuntu下NFS的配置 以及 pxa2128 单板nfs配置
- Javascript面向对象编程(二):构造函数的继承
- C# winform listbox失去焦点的一种解决方案