搞了好久linux基本上还是停留在内核配置编译、启动脚本修改、应用程序等表面的东西。也只能能怪方案提供商或linux把驱动等底层的都做好了,没有给我们个人实践的机会了。
搞linux应该看些什么呢?下面仅仅是我的一些观点供大家参考。
大多数人玩linux 应该还是买一块自己中意的开发板,然后在上面跑linux、图形系统、自己的应用程序。由于是开发板,所以肯定提供了所有相关的文档,看看文档很容易就能跑一个linux了。主要就是bootloader的使用,内核的编译配置。接着你可以看看开发板涉及的驱动,还有就是针对开发板进行的移植部分的代码。
我最近搞过让系统(2.4.x)支持移动硬盘并让它可以自动装载和卸载,所以就想看看usb storage的东西。并且想了解一下2.6,那就看了2.6的usb storage。
我从这里开始看linux-2.6.x\drivers\usb\storage\usb.c。在模块以usb_stor_init函数开始的。最初相关的数据是
static struct usb_driver usb_storage_driver = {
.owner = THIS_MODULE,
.name = "usb-storage",
.probe = storage_probe,
.disconnect = storage_disconnect,
.id_table = storage_usb_ids,
};
先了解模块加载后的运行流程吧,看看函数storage_probe是什么时候被运行的。以下的所有内容就是这个目的。
(图片另存后可看清晰大图)
关键点解释
内核的设备模型具体我也不是很了解,只能大概的猜一下。最初的usb_storage_driver经过层层注册以后会在内核的设备链表中产生一个struct device结构,这个结构应该包含了设备可以运行起来的所有信息。大概在bus.c的bus_add_driver(drv)中加入的吧。其实真正注册进系统的应该是usb_storage_driver的成员struct device_driver driver。所以系统从底层回调上来时传出来的是struct device_driver。那系统如何最后调用到usb_storage_driver中的storage_probe 函数指针呢?见图中usb_probe_interface(dev) 函数中的调用片断。struct usb_driver * driver = to_usb_driver(dev->driver),to_usb_driver 宏调用了container_of宏,该宏的功能就是在知道一个结构中的成员的地址和对应的成员名字以及这个结构的类型的情况下获取这个结构的指针。
到目前也就看了这么点东西,没有实质性的了解代码,仅仅一个函数的运行流程。给自己开始一个修炼linux内功的开始和方向。希望有志同道合的朋友相互切磋一下。
参考:
http://www-128.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 深入分析 Linux 内核链表
http://www.blogcn.com/user21/bluehacker/blog/28828622.html Linux 2.6内核的设备模型