kernel新手培训计划

来源:互联网 发布:头像识别软件 编辑:程序博客网 时间:2024/05/15 01:05

 

【新人培训之终极目标】 kernel新手培训计划来源: ChinaUnix博客 原本是我用Notes mail 写的培训kernel新人的计划,copy过来 有些格式可能有点乱, 附件里面是 我举的例子。 新手可以对照。
老手就不要看了,见笑了。

如果你从事kernel还没有入门, 或者在公司里面根本论不到你作kernel , 也许你可以对照我的计划自学。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

下面是我列出的新人kernel 学习计划, kernel很复杂, 想要入门不容易 。整个计划也基本上反应了我个人对于kernel的学习过程, 感觉上路子还是对的, 对别人应该也比较合适。 有些东西我也没有完全掌握, 比如并发和竟态,需要在长期的开发中积累经验才能彻底掌握, 我们只是从理论上先掌握它。

推荐书籍:
l            ldd3(linux device driver 第三版,有中文版)
l            ulk2 (understanding linux kernel 第二版,中文版),针对2.4 kernel,看起来,不太适合我们。
l            ulk3 (understanding linux kernel 第三版,只有英文版) , 针对 2.6,不错, 我也正在看。
推荐学习网站:
      
www.kerneltravel.net
bbs网站:
      
www.linuxforum.net
里面的内核论坛和嵌入式论坛和driver论坛, 可以问问题。


一 , 入门阶段
target:
知道什么是kernel ,大致了解kernel,解除对kernel的恐惧心理
1> Makefile
- target:
      Makefile 要熟悉,至少对应用程序的Makefile裁减要比较了解, 总之 对
Makefile 比较熟悉, 这是了解kernel的架构组织的基础 。
- 建议练习:
      交叉编译应用程序,裁减Makefile 。
- Status: 已经都练习过了。
- Enhance: 建议平时学习,多多学习Makefile , 可以重点关注kernel代码里面的
Makefile的写法, 以及如何修改Kconfig 文件 ,如何在kernel源代码
           中, 加入新功能代码,如何添加修改Makefile
2> 在普通的PC上升级Linux kernel
- target:
      熟悉如何编译kernel 的源代码,升级kernel 后,要配置哪些文件,才能正确
的运行kernel
- Status:
- Enhance:
      无
3> 掌握如何用KGDB 调试kernel的源代码
- Target:
      掌握KGDB 和 kgdb 调试器的用法和常用的命令, 图形界面可选, 但是命令行
界面一定要掌握。

二,进阶阶段:
Target:
      进入到具体的编程阶段,加一些练习代码。 熟悉kernel的函数用法
4> 熟悉module的写法, 这是进入kernel的捷径
- Target:
      掌握module的的写法, 具体的Makefile怎么样写?怎么编译?掌握和module有
关的常用的函数,比如 export_symbol() ,MODULE_LICIENCE() 等等, 总之,ldd3头两章要看的比较熟悉才行。
      可以熟练的写一些module ,其实这些module都可以看成是一个driver或者一个内核模块的缩写或者简化版本。
      比如一个helloworld 的module 。 虽然简单, 也能反应很多问题。 driver就是在上面的基础上控制硬件而已。

- 练习:
      看ldd3 上面的 22 页上面的helloworld 小module程序。
      参照
http://dirac.org/linux/writing/lkmpg/2.6/chinese/lkmpg_chs/
来练习module的写法, 和实现一些简单的功能, 这些和arm 和x86 都是无关的, 是通用的。

5> 在x86 机器上练习如何给kernel加上一些系统调用。
- target :
了解什么是“系统调用” , 系统调用的原理, 和 glibc里面的c函数有什么区别, 如何在kernel代码里面加系统调用 , 用户程序如何调用这个系统调用 。
知道如何在kernel现有的基础上加上一些系统调用。
- 参考资料:
      
http://www.kerneltravel.net/journal/iv/index.htm
    陈莉君老师的网站
- 练习:
      我这里有个例子,比如实现一个系统调用:查找某个进程的pid (当然用ps ax
|grep 很容易搞定, 我们这里只是练习而已)
      可以参考我的例子:
      (See attached file: module_syscall.c)  (See attached file:
chardev_test.c) , 供参考, 这是我原来自己练习的例子。

6> 熟悉kernel一些常用的机制,一些基本函数的用法,
Target:
      了解kernel api的用法,
      例子:自旋锁, 信号量,同步,互斥。
推荐书籍:ldd3 (linux device driver 3rd) ,非常好
必看章节:
      第一章设备驱动程序简介,入门。
      第二章构造和运行模块, 了解什么是模块, 怎么编译, 大致怎么写?
      第三障字符设备,  写一个简单的模块,可以实现read write() 函数, 和硬件无关, 因为我们不关心driver
      第四章debug , 掌握printk的用法
选看章节,或者提高章节
第五章并发和竟态       一定要掌握
参考资料:
      ldd3
      下面是我在
www.linuxforum.net
上的一个讨论关于自旋锁和信号量分析的讨
论:对于了解信号量和spinlock的用法,比较有好处。
      (See attached file: spinlock讨论帖子.pdf)
      大家也可以充分利用
www.linuxforum.net
边讨论边学习。这种方式进步很快。
练习:
      - 一个module , 实现read/write/ioctl() 函数。
      - enhance上面的module , 要实现互斥同步的功能。 比如 实现一个module
, 当一个进程read的时候, 另一个进程再去读的时候,要阻塞调用,当第一个进程
释放这个资源的时候,第二个进程要被唤醒。
      这是我的例子:参考:(See attached file: chardev_test_waitqueue.c)
      关于,更多的互斥的例子,可以参考下面我的自己以前练习的例子:
      (See attached file: chardev_test_atomic.c)(See attached file:
chardev_test_sema.c)(See attached file: chardev_test_waitqueue.c)(See
attached file: chardev_test_wait_kmalloc.c)
      下面是 kernel里面timer的用法, 可以参考。
      (See attached file: chrdev_timer.c)
      编译module的时候 ,需要Makefile ,
      下面的Makefile可以作为例子:
      针对2.4 kernel的例子(仅仅是例子, 不要照抄)
      (See attached file: Makefile)
      针对2.6 kernel 的例子:
      (See attached file: Makefile)

6> 进阶资料
可以看看
www.kerneltravel.net
上面的文章, 相当不错,
推荐:内核中的调度与同步
http://www.kerneltravel.net/journal/vi/syn.htm
中断解析
http://www.kerneltravel.net/journal/viii/index.htm
7> 根据工作需要去看相应的代码, 比如 要看jffs2,就要看jffs2的代码,
      如果看实时,  就要看RT的实现代码如果你从事kernel还没有入门, 或者在公司里面根本论不到你作kernel , 也许你可以对照我的计划自学。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

下面是我列出的新人kernel 学习计划, kernel很复杂, 想要入门不容易 。整个计划也基本上反应了我个人对于kernel的学习过程, 感觉上路子还是对的, 对别人应该也比较合适。 有些东西我也没有完全掌握, 比如并发和竟态,需要在长期的开发中积累经验才能彻底掌握, 我们只是从理论上先掌握它。

推荐书籍:
l            ldd3(linux device driver 第三版,有中文版)
l            ulk2 (understanding linux kernel 第二版,中文版),针对2.4 kernel,看起来,不太适合我们。
l            ulk3 (understanding linux kernel 第三版,只有英文版) , 针对 2.6,不错, 我也正在看。
推荐学习网站:
      
www.kerneltravel.net
bbs网站:
      
www.linuxforum.net
里面的内核论坛和嵌入式论坛和driver论坛, 可以问问题。


一 , 入门阶段
target:
知道什么是kernel ,大致了解kernel,解除对kernel的恐惧心理
1> Makefile
- target:
      Makefile 要熟悉,至少对应用程序的Makefile裁减要比较了解, 总之 对
Makefile 比较熟悉, 这是了解kernel的架构组织的基础 。
- 建议练习:
      交叉编译应用程序,裁减Makefile 。
- Status: 已经都练习过了。
- Enhance: 建议平时学习,多多学习Makefile , 可以重点关注kernel代码里面的
Makefile的写法, 以及如何修改Kconfig 文件 ,如何在kernel源代码
           中, 加入新功能代码,如何添加修改Makefile
2> 在普通的PC上升级Linux kernel
- target:
      熟悉如何编译kernel 的源代码,升级kernel 后,要配置哪些文件,才能正确
的运行kernel
- Status:
- Enhance:
      无
3> 掌握如何用KGDB 调试kernel的源代码
- Target:
      掌握KGDB 和 kgdb 调试器的用法和常用的命令, 图形界面可选, 但是命令行
界面一定要掌握。

二,进阶阶段:
Target:
      进入到具体的编程阶段,加一些练习代码。 熟悉kernel的函数用法
4> 熟悉module的写法, 这是进入kernel的捷径
- Target:
      掌握module的的写法, 具体的Makefile怎么样写?怎么编译?掌握和module有
关的常用的函数,比如 export_symbol() ,MODULE_LICIENCE() 等等, 总之,ldd3头两章要看的比较熟悉才行。
      可以熟练的写一些module ,其实这些module都可以看成是一个driver或者一个内核模块的缩写或者简化版本。
      比如一个helloworld 的module 。 虽然简单, 也能反应很多问题。 driver就是在上面的基础上控制硬件而已。

- 练习:
      看ldd3 上面的 22 页上面的helloworld 小module程序。
      参照
http://dirac.org/linux/writing/lkmpg/2.6/chinese/lkmpg_chs/
来练习module的写法, 和实现一些简单的功能, 这些和arm 和x86 都是无关的, 是通用的。

5> 在x86 机器上练习如何给kernel加上一些系统调用。
- target :
了解什么是“系统调用” , 系统调用的原理, 和 glibc里面的c函数有什么区别, 如何在kernel代码里面加系统调用 , 用户程序如何调用这个系统调用 。
知道如何在kernel现有的基础上加上一些系统调用。
- 参考资料:
      
http://www.kerneltravel.net/journal/iv/index.htm
    陈莉君老师的网站
- 练习:
      我这里有个例子,比如实现一个系统调用:查找某个进程的pid (当然用ps ax
|grep 很容易搞定, 我们这里只是练习而已)
      可以参考我的例子:
      (See attached file: module_syscall.c)  (See attached file:
chardev_test.c) , 供参考, 这是我原来自己练习的例子。

6> 熟悉kernel一些常用的机制,一些基本函数的用法,
Target:
      了解kernel api的用法,
      例子:自旋锁, 信号量,同步,互斥。
推荐书籍:ldd3 (linux device driver 3rd) ,非常好
必看章节:
      第一章设备驱动程序简介,入门。
      第二章构造和运行模块, 了解什么是模块, 怎么编译, 大致怎么写?
      第三障字符设备,  写一个简单的模块,可以实现read write() 函数, 和硬件无关, 因为我们不关心driver
      第四章debug , 掌握printk的用法
选看章节,或者提高章节
第五章并发和竟态       一定要掌握
参考资料:
      ldd3
      下面是我在
www.linuxforum.net
上的一个讨论关于自旋锁和信号量分析的讨
论:对于了解信号量和spinlock的用法,比较有好处。
      (See attached file: spinlock讨论帖子.pdf)
      大家也可以充分利用
www.linuxforum.net
边讨论边学习。这种方式进步很快。
练习:
      - 一个module , 实现read/write/ioctl() 函数。
      - enhance上面的module , 要实现互斥同步的功能。 比如 实现一个module
, 当一个进程read的时候, 另一个进程再去读的时候,要阻塞调用,当第一个进程
释放这个资源的时候,第二个进程要被唤醒。
      这是我的例子:参考:(See attached file: chardev_test_waitqueue.c)
      关于,更多的互斥的例子,可以参考下面我的自己以前练习的例子:
      (See attached file: chardev_test_atomic.c)(See attached file:
chardev_test_sema.c)(See attached file: chardev_test_waitqueue.c)(See
attached file: chardev_test_wait_kmalloc.c)
      下面是 kernel里面timer的用法, 可以参考。
      (See attached file: chrdev_timer.c)
      编译module的时候 ,需要Makefile ,
      下面的Makefile可以作为例子:
      针对2.4 kernel的例子(仅仅是例子, 不要照抄)
      (See attached file: Makefile)
      针对2.6 kernel 的例子:
      (See attached file: Makefile)

6> 进阶资料
可以看看
www.kerneltravel.net
上面的文章, 相当不错,
推荐:内核中的调度与同步
http://www.kerneltravel.net/journal/vi/syn.htm
中断解析
http://www.kerneltravel.net/journal/viii/index.htm
7> 根据工作需要去看相应的代码, 比如 要看jffs2,就要看jffs2的代码,
      如果看实时,  就要看RT的实现代码。

原创粉丝点击