免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: arron刘
打印 上一主题 下一主题

[学习分享] 专家坐堂:Godbach 详解Linux内核学习方法(获奖名单已公布-2014-1-14) [复制链接]

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
41 [报告]
发表于 2013-12-20 14:29 |只看该作者
回复 40# 帅绝人寰


   

论坛徽章:
8
CU大牛徽章
日期:2013-09-18 15:20:48CU大牛徽章
日期:2013-09-18 15:20:58CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
42 [报告]
发表于 2013-12-20 15:04 |只看该作者
好活动,强烈支持。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
43 [报告]
发表于 2013-12-20 15:35 |只看该作者
本帖最后由 asuka2001 于 2013-12-20 15:42 编辑

为什么学习Linux内核?

除了兴趣还能是什么其他原因?我喜欢内核,非常喜欢,非常非常喜欢!!!

如何学习内核?

1. 兴趣 + 坚持 = 王道

2. 基础最重要:
操作系统理论:你连中断,调度,文件系统,进程等等概念都抓瞎就去看代码那能不事倍功半?
内核的底层机制:lock,list,wait_queue,completion,tasklet,workqueue,timer,rbtree,idr,等等等等你不混个熟脸你怎么读代码?
所以不要急于求成,基础打坚实了,必然事半功倍!

3. 内核的大体框架要明白,但是初学者务必要不求甚解
内核的源码树的结构你得清楚,Makefile和Kconfig当地图
内核的各个子系统你要清楚,但是不沉迷所有的细节中

4. 选择某个感兴趣的子系统开始剖析
核心数据结构体先混个脸熟,这个时候就是Documentation和google发挥作用的时候了
向外提供的功能接口,自身的初始化都可以作为不错的起点

5. 从熟悉的子系统往外浸润

6. 从菜鸟到老鸟过程中,多交流,多找有用的资源如内核邮件列表,lwn,论坛,各种经典书籍LKD3,LDD3,ULK3等等等等!
   
学习Linux内核对实际工作会有哪些实际帮助?

1. 满足我自己的好奇心

2. 不存在黑盒

3. 借鉴优秀的代码风格,算法,设计

4. 拓展你的眼界,面临问题你会有更多的选择

5. 提高自己阅读代码的水平和研究复杂系统的能力



论坛徽章:
0
44 [报告]
发表于 2013-12-20 16:40 |只看该作者
本帖最后由 sdau 于 2013-12-20 16:42 编辑

Godbach老师,您好:
    关于内核,我比较专注网络方面的东西,有两个问题,纠结了好长时间,进展不下去,希望您能站在高处给我指点迷津

    1. iptables 的模块调试问题:

    关于 REDIRECT和DNAT 这个两个target,我只知道DNAT比REDIRECT强大,但是这样草草的结论,满足不了我这个追根究底的人,于是又了读内核代码的想法,其实不能算是内核,只能算是一个小模块,netfilter的架子我基本能看懂,当然细节肯定不行了,为了了解细节,我想到了KGDB调试,我建了kvm虚拟机,通过远程gdb调试,可以调试内核,但是却不能调试模块,给模块的函数加断点的时候,总是提示:

(gdb) b hook_init               # 失败在这一步:Cannot access memory at address 0xa004a080

    这断了我调试内核模块的想法,如果我说的不清楚,我可以把具体步骤贴出来

    我退而求其次,用ftrace不适很理想,ftrace不能看到函数的参数值,也用过SystemTap,太复杂了,为了调试一个小模块,杀鸡用牛刀了

    关于我这种情况,老师能给一个建议么?


    2. netlink通信问题:

    有没有类似wireshark的东西,可以抓到通信报文啊?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
45 [报告]
发表于 2013-12-20 22:40 |只看该作者
回复 33# 左懒_


第一次参加这种活动,说得不好请指教。谢谢!
1、为什么学习Linux内核?
    我开始学编程的时候就有一个很明确的目标,写一个自己的操作系统。而且在这方面也下了不少努力,自己也写过一个dome的系统玩玩。如果非要究根为什么喜欢内核,我也说不出什么。主要还是兴趣。


有兴趣就好,兴趣是能够持续研究的动力。 :wink:

2、如何学习内核?
    主要是看你要搞哪方面的吧,如果说要从头开始写一个系统的,汇编和CPU的知识肯定不能少,还有各种的操作系统原理需要的知识面甚广呢。如果是搞上层内核子系统的话,个人感觉从驱动设备开始学起最好的。驱动脱离了内核,又引用到内核接口。在开发的时候可以很方便地进行调式,有不用怕内核奔溃。总之,学内核,分两步,看和写。第一是看,看CPU架构的书,看操作系统的书,看各种开源的系统源码。第二是写,自己动手写一个玩具系统比看书更好。甚至比写驱动更好。


直接上手就写系统的,我觉得还是很锻炼人的,可以学到很多系统设计的东西。


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
46 [报告]
发表于 2013-12-20 22:43 |只看该作者
回复 30# kiongf
能够集中时间,系统的研究一下内核,还是很值得纪念的。

虽然工作中未必用得到,但很多程序设计的思路可以借鉴。而且将来工作的久了,早晚会遇上相关的工作内容。那时就可大展身手了。


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
47 [报告]
发表于 2013-12-20 22:44 |只看该作者
帅绝人寰 发表于 2013-12-19 14:38
>       正在努力寻找这方面的工作。 虽然不一定最后能做这个, 但至少现在能乐在其中。

我有个朋友 ...


什么职位,赶紧发 JD 啊

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
48 [报告]
发表于 2013-12-20 22:47 |只看该作者
回复 43# asuka2001

3. 内核的大体框架要明白,但是初学者务必要不求甚解
内核的源码树的结构你得清楚,Makefile和Kconfig当地图
内核的各个子系统你要清楚,但是不沉迷所有的细节中

4. 选择某个感兴趣的子系统开始剖析
核心数据结构体先混个脸熟,这个时候就是Documentation和google发挥作用的时候了
向外提供的功能接口,自身的初始化都可以作为不错的起点

5. 从熟悉的子系统往外浸润


总结的非常好,赞一个。:wink:

   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
49 [报告]
发表于 2013-12-20 22:58 |只看该作者
回复 44# sdau

1. iptables 的模块调试问题:

    关于 REDIRECT和DNAT 这个两个target,我只知道DNAT比REDIRECT强大,但是这样草草的结论,满足不了我这个追根究底的人,于是又了读内核代码的想法,其实不能算是内核,只能算是一个小模块,netfilter的架子我基本能看懂,当然细节肯定不行了,为了了解细节,我想到了KGDB调试,我建了kvm虚拟机,通过远程gdb调试,可以调试内核,但是却不能调试模块,给模块的函数加断点的时候,总是提示:

(gdb) b hook_init               # 失败在这一步:Cannot access memory at address 0xa004a080

    这断了我调试内核模块的想法,如果我说的不清楚,我可以把具体步骤贴出来

    我退而求其次,用ftrace不适很理想,ftrace不能看到函数的参数值,也用过SystemTap,太复杂了,为了调试一个小模块,杀鸡用牛刀了

    关于我这种情况,老师能给一个建议么?


老师不敢当。

DNAT 和 REDIRECT 用在不同的场合,有时 REDIRECT 用起来会更简单那一些。

对于网络模块的研究,我个人倾向于两手抓:
一是读代码,结合模块的功能,大致的梳理代码的流程,并记录下自己有疑问的环节,可以通过google试着找是否存在相关的问题。这是属于逻辑研究层次。
二是调试,这个所谓的调试不是单步代码级别的调试,而是功能层次的调试。结合你已经存在的疑问,在代码的对应的位置,加上一些打印信息。看看数据的处理是否达到预期。网络方面的功能很多都是模块化的,无非就是 insmod/rmmod 来回的测试。大不了 Oops 了,重启一下机器。 Kernel Maillist 中曾有人问内核中最好的调试方法是什么,有人回答 printk,不无道理。

    2. netlink通信问题:

    有没有类似wireshark的东西,可以抓到通信报文啊?


这里如果你想抓去 netlink通信报文的话,我觉得可以直接修改你的应用程序,把接收数据部分打印出来就可以。kernel 里面也可以对应位置加调试信息。

研究 kernel,不要怕 Oops,不要怕重启。很多 BUG,都是在多次 Oops 和重启之后,才找到原因的。:wink:

   

论坛徽章:
0
50 [报告]
发表于 2013-12-22 17:14 |只看该作者
回复 45# Godbach


    自己写过一遍后再去看别人实现的代码会有一种亲切感...看到别人精华之处更会拍手称绝
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP