- 论坛徽章:
- 0
|
本帖最后由 kartorz 于 2015-08-20 09:44 编辑
1. 分享Linux内核学习和驱动开发的经验。
捷径没有,但是有合理的方法。
1) 首先,需要熟悉操作系统的设计与实现,推荐大家看 MINIX作者的那部书,同时把MINIX的kernel代码研读一下。 不然,你不知道操作系统都有哪些模块, 不知道操作系统要做些什么事情,提供什么功能。
简单地说,操作系统首先要驱动 CPU,然后提供那几大管理(中断,进程,内存),实现一,两百个系统呼叫,提供驱动接口。
2) 去intel的官网,找一下 Intel® 64 and IA-32 Architectures Software Developer’s Manual , 了解一下 CPU的架构,工作模式,底层的编码。否则, 你不知道 gdt, ldt, page table, 实地址,保护模式,timer等中断都是什么东西,为什么操作系统要这样来设置寄存器。
这块基本上全是汇编语言,对CPU的初始化,寄存器设置,手册上面都有严格的时序要求。 哪些操作需要屏蔽中断,哪些需要在一个指令周期完成等等。
有了上面的基础后,大概知道一个操作系统大概要做些什么事情, 如何驱动底层的 CPU,这个时候阅读 linux的kernel代码,事半功倍。
kernel 分为两个模块:一个是 core : 驱动cpu, 中断,进程,内存几大管理, 提供系统呼叫; 另一个是driver, 驱动设备工作。 linux的driver 都是有架构的,不需要从底层做起。 driver的架构大概就是 char, block, net, video, audio, usb, 等等。 别看操作系统的代码量大,其实,把driver 占了估计 90%的代码量, 这些都是不需要去看的。 driver 框架的设计,也就是 微内核 与 宏内核的区别。
阅读过程中,观其大略即可,主要了解整个结构,以及程序的流程。 如: 系统呼叫的调用, 追一个就可以了。—— 看看,操作系统如何捕捉软中断, 根据中断号,dispatch到相应的服务程序,如何 保存现场, 完成后,又回到用户态。 系统呼叫调用,核心 就是 dispatch的流程。 追完一支系统呼叫,其它的大概就知道怎么回事了。 driver 也就一样的, 找个简单的驱动看看, 从驱动层一直到驱动的架构,流程清楚就可以了。 如 char 设备驱动, 追一下 register 以后, 驱动框架如何 把该设备放入 list,当有用户请求的时候,它又如何 查找到 相应的设备,调用 相应的操作函数。 一路下来,流程大概知道就可以了。
不建议阅读, 毛德操的 linux内核源码分析 之类的书, 会让读者一头雾水。 正确的方法应该是, 先了解相应的背景知识后,再来阅读源码。 举个例子,你想了解 ext4的文件系统驱动代码,首先你得去查资料,搞清楚 ext4文件系统是怎么回事,再来阅读代码。 之前,推荐初学者 先 阅读 操作系统设计实现, intel的编程手册,就是这个道理。 只有了解了背景,再阅读源码时,一切都 迎刃而解了。 不推荐 毛德操的书也是个道理,书里面告诉你,代码一会跳到这里,一会又call back到注册的函数,一会又调用了什么,只见树木,而不见森林。
|
评分
-
查看全部评分
|