免费注册 查看新帖 |

Chinaunix

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

[实践] 深度探索Linux:系统构建和原理解析大家谈!(获奖名单已公布-2013-11-14) [复制链接]

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
51 [报告]
发表于 2013-11-01 09:01 |只看该作者
本帖最后由 T-Bagwell 于 2013-11-01 09:02 编辑

两年多没碰过内核代码,两年多没关注过内核动态了 还是做应用程序开发好玩,尤其是音视频,没事可以转转毛片,这就足够了,玩内核只能让我没办法用我的pad看rmvb格式打毛片……

论坛徽章:
1
lufei
日期:2016-06-17 17:49:16
52 [报告]
发表于 2013-11-01 09:51 |只看该作者
名不虚传,果然是T-Bagwell回复 51# T-Bagwell


   

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34摩羯座
日期:2013-12-01 00:21:362015年迎新春徽章
日期:2015-03-04 09:49:45
53 [报告]
发表于 2013-11-01 10:15 |只看该作者
adidiaos丶丶 发表于 2013-11-01 09:51
名不虚传,果然是T-Bagwell回复 51# T-Bagwell


论坛徽章:
0
54 [报告]
发表于 2013-11-01 17:51 |只看该作者
我精通UCOS嵌入式系统内核。学LINUX如何。

论坛徽章:
0
55 [报告]
发表于 2013-11-02 00:09 |只看该作者
本帖最后由 程序员王柏生 于 2013-11-02 00:19 编辑
reyleon 发表于 2013-10-15 18:03
做为一名运维人员,根本就看不懂内核源码怎么办?


个人没有运维经验,但是和做运维的兄弟们多少有些交流。您也是做运维的,我相信您也和他们有近似的意见。从他们的角度来看,运维工程师更需要的是对系统宏观的掌握。对某个组件的内部的理解相对次要一点。

举一个昨天遇到的实际的例子。有一位同事遇到一个特殊的问题,大致情况是这样:发现服务器上有人通过 USB 接了一部手机,然后网络通过这部手机路由出去了。但是这位同事也不敢贸然动这部手机,就是想把这个网络禁掉。但是他通过如类似 ifconfig down 的命令发现这个手机模拟的出的 USB 网卡还很顽强,down 后马上又 up。事实上,即使能把这个手机模拟的 USB 网卡down掉,又能如何呢。如果再有另外一个通过 USB 接进来的网络设备呢,怎么处理? 我给这位同事提了解决方法之一:在 udev 中加一个 rule, 在这个 rule 中将内核报上来的 usb 网络设备全部禁掉。

从这个问题可以看出,了解系统的宏观结构是多么的重要,否则,遇到问题,可能没有一点线索,就会像无头苍蝇一样到处乱闯,而且费尽九牛二虎之力可能还没有加这么一个 udev rule来的方便通用。


对于您提到的“根本就看不懂内核源码”,这不是问题。如果您有那么一点小理想,只要坚持,一定可以看懂内核源码的。事实上,很多程序员可能都有这样的经历,即当我们接手其他程序员写的代码时,即使是比较简单的应用程序,初看时,我们也会经常丈二和尚,摸不着头脑。所以,从这个角度可以看出,并不是内核的代码逻辑上有多么难懂,而是我们的出发点不是特别恰当。当然,经过多年的演进,内核的代码要晦涩一些。

举个文件系统的例子,很多书中,一句一句分析寻找文件inode、文件读写的代码实现。看上去代码都不是很难,但是为什么很多程序员看完了也没有能很好的理解文件系统呢?我个人认为原因还是我们为了读代码而读代码。

换个角度,假设有这样一个题目:我们已知文件在存储介质上的存储方式(不同的文件系统都有相应的规范),那么请你编写一段代码来实现从存储介质上找到特定文件, 并读/写文件的内容。您怎么来解决这个问题?

显然,你首先要根据熟悉特定文件系统的规范,清楚的了解文件在存储介质上的存储方式,然后从根结点的inode开始,顺藤摸瓜,找到指定文件的inode, 然后根据文件inode中指向的datablocks, 读取datablocks的内容。所以,从这个角度,这段代码与一个简单的如某类文件的解析器有本质区别吗?只不过就是复杂点而已。所以,如果我们首先带着问题,并且从更高的角度宏观上理解某个部分的功能后,再去结合逻辑功能看代码实现,就要容易很多。原本打算把类似这些子系统的分析也放到《深度探索...》一书中,但是担心膨胀的太厉害,而且破坏主线。所以如果最近用空,我会陆续的在 CU 上把这些子系统写一下。当然和本书的风格一样,都是从实践、宏观的角度入手。

再比如驱动,事实上,写过驱动的工程师基本上都会认为驱动相比一些复杂的程序要简单很多。之所以大家比较关心驱动,原因之一是作为软件工程师,接触硬件的机会不多,造成大家觉得驱动很神秘,是系统底层。事实上,内核中的驱动部分之所以看上去比较复杂,很大一部分原因是拜操作系统所赐。以 Linux 为例,为了让驱动工程师开发更容易,Linux 将驱动的公共部分尽可能抽象出来,所以大致上可以概括为三层:最上层是对应文件系统接口;中间是公共的代码层,一般称之为 core;最下面的,也是最简单的部分,一般称为 low level层,这一层直接面对具体的硬件设备,由具体的硬件驱动工程师编写。显然,这样可以极大减少 low level 工程师的工作量。如果有过在一些结构相对单纯的操作系统(比如 RTEMS)上开发过驱动的经验的人,就会知道,驱动的开发要容易得多。就因为这些分层的结构,更加重了代码的复杂度。没办法,没有免费的午餐,这就是tradeoff。low level容易,其他实现就得麻烦点。而且,老外把这叫 framework, 很多程序员一看到 framework 就慌,别怕,没什么。

最后,我个人的观点认为最重要的还是宏观的掌握。对于任何部分,包括内核源码,也包括那些广为传播的经典书籍,比如《UNIX环境高级编程》,这些书籍都是作者用尽心血之作(当然不包括那些攒的书籍了),并无必要从头看到尾,很多书适合做 manual, 用的时候查阅一下就可以了。比如好多书中细致到把各个结构体的每一项都讲解一下,您能记住吗?反正我是记不不住。而且,为什么要记住呢?! 全部都去看也是浪费你宝贵的时间,一旦你宏观上理解了,很多部分都是融汇贯通,稍加理解和分析就可以很快看清其本质。从宏观上理解了,用的时候结合 man page + google + 书籍 进行实现即可。

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
56 [报告]
发表于 2013-11-02 11:41 |只看该作者
回复 55# 程序员王柏生


    感谢您这么长的回复与独到的分析,您说的很有道理,知其然不知其所以然是很痛苦的事情,只有大方向了解了才能融会贯通。宏观掌握似乎也正是运维人员所需要的,在我看来,运维人员似乎都是面广,然而深度不够,个人感觉一名好的运维,可能不需要去码很深的代码,但必须知道各个环节的原理性与流程性的东西,掌握了各个问题的来龙去脉,才能具备良好的分析能力与解决问题的方案,感觉就是一个从整体到局部的过程,就好比小学生写作文,总分总、总分等,哈哈

论坛徽章:
0
57 [报告]
发表于 2013-11-02 22:18 |只看该作者
reyleon 发表于 2013-11-02 11:41
回复 55# 程序员王柏生


别客气,也感谢您的支持。您说的没错,先从宏观上把握,然后无论工作需要也好,亦或是个人兴趣,在逐个深入到各个子部分中深入研究。

论坛徽章:
0
58 [报告]
发表于 2013-11-04 15:36 来自手机 |只看该作者
本帖最后由 opopnhwth 于 2013-11-04 16:05 编辑

我是一个计算机爱好者,从02年上大学开始就是,由于种种原因没有走上这个专业,大学课程中有C语言,用心学之,后面的大学课程和计算机根本是两天路,又不能自由转换专业,本来想算了。但是实在顶不住兴趣的折磨,最后选择了课余自学,没有老师指导,真是无头苍蝇到处乱撞。大学期间学习了c++,汇编,数据结构,数据库原理,操作系统原理等课程,没有学编译原理,离散数学,也没有像计算机专业大学期间的系统学习,但是我一直有一个操作系统梦,我准备希望通过这本书完成这个理想,我想咨询下我还需要学习哪些基础理论书籍?要想看懂这本书还需要学习哪些?
研究生期间课题一部分内容是用MFC做计算软件界面,fortran做算法部分。Linux学习从红帽子9开始,试用过红旗4,6,8版本,ubuntu10以后版本,深度linux。按图索骥编译过内核,编译过一些软件,但是感觉很肤浅,根本不懂内部原理。很想弄懂!

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
59 [报告]
发表于 2013-11-04 19:58 |只看该作者
一时头脑发热就写了下面的内容,对于心理承受能力低的人请不要继续阅读,管理员如觉得有必要,可以删除本回复甚至封号也是可以的

1、说说您的Linux内核源码的学习经验和感受
我从昨天刚开始学习 0.01 版的 Linux 内核源码,所以可以说没什么学习经验可谈吧。感受的话只能用一句来概括“机器与人相比要容易相处得多了,即使是操作系统源码也比与人相处简单”。
我之所以开始学习Linux内核这事要从一个多月前说起。一个多月前基友刚找到女朋友,居然还找我陪他吃饭,聊天,购物什么的。他问我业余时间都在干什么,我说没有什么特别的事可干的,偶尔按照别人的教程写自己的操作系统,偶尔看看高中化学,考虑要不要重新高考。基友说:“重新参加高考很不现实,反正你闲着,我之前总想用现代的编译器编译Linux 0.01 的内核,一直没搞定,现在有女朋友了也没心思搞这个了,要不你研究一下如何才能让Linux 0.01的内核在现代的编译器下编译通过,然后给我讲一讲为什么不进行修改就编译不了”。我当时算是接受了这个提仪吧。不过,我当天晚上给他发了短信说喜欢他(其实说的是如果我说喜欢他,他会有什么反应,对我有什么看法之类的说法)。第二天他仍旧找我吃饭,然后说很荣兴我喜欢他,还说他并不歧视我。不过他明显就表现得很歧视我嘛。后来渐渐的(中间略去一个月左右的事),反正我从来都没去碰过Linux内核(怎一个堕落了得),和他说话的机会也越来越少,到昨天他彻底不理我了,把我从他的Skype的好友列表里也删了。虽然我知道我彻底忘掉他的时刻终于来了,也在考虑要不要找新的工作。但是我把找新工作的事暂时放在了一边,抽了一天的时间经过一些修改,让Linux 0.01的内核可以在gcc 4.8.2下编译通过了,我把我做的修改用邮箱告诉了他,作为我对之前承诺的兑现,同时也作为从此将他从心底移除的纪念。不过,内核源码我还是要继续研究的,光编译通过还不够,还要把shell什么的迁移过去,搭建一个完整的操作系统,不仅仅是一个内核。不过,我也没有特别的冲动要研究Linux内核,所以都闲得花慌的时候就再研究吧。
2、对于普通的Linux程序员和运维人员,是否有必要学习Linux系统构成及源码等基础知识
Linux系统构成和内核源码是完全不相干(其实也有些相干了)的两件事。如果说学习Linux内核源码有助于(或者以我的个人经历来说没有任何帮助)找到一些和基友套近乎的话题的话,那么学习Linux系统构成则是让基友(们)崇拜的基本条件之一。我不是学计算机相关专业出身的,但是我有比计算机相关专业出身的大多数人都长的Linux系统使用经验,这个使用经验可以让我对Linux的使用得心应手,但是对于Linux程序员或者运维人员来说这并不够。我曾经尝试过自己构建LFS系统,基本系统都构建好了,但是编译内核的时候有部分硬件驱动没有编译进去,结果导致系统只能在chroot环境下运行,并不能实际独立运行(后来因为构建LFS系统太花时间了所以没再尝试)。尽管LFS系统的构建算是失败了,但是失败本身没什么,构建这个系统的过程本身我学会了很多东西。碰到问题解决问题的能力,还有就是对CFLAGS,LDFLAGS,LD_LIBRARY_PATH等等Linux程序员和运维人员或者whatever都一知半解,或者完全不知道又很重要的这类的内容我都有了一个很深刻的认识,所以现在很少有我安装不了的开源软件,我对解决Linux的使用问题等都都觉得很得心,所以公司才让我这个非专业人员给那一帮专业人员进行Linux使用以及程序开发和调试的培训。只要知道了事物的本质,就相当于你碰到的问题和将碰到的问题就已经解决了一半。结论,学习Linux内核源码会让你对Linux的本质有个更深刻的认识,但是对普通Linux程序员和运维人员并非必要的,相对的,Linux系统构成的知识比Linux内核源码要浅显些但是内容比较杂,可是却是对普通Linux程序员和运维人员很有必要的。
回到之前的感受,真的,机器比人容易相处多了,给那些看到最后的人的建议(当然这些建议对很多这些看到最后的人可能并不需要):不要觉得Linux很难,不要觉得编程很难,也不要觉得这方面的英文资料很难,这些比和人相处容易多了,你攻克这些只是时间问题,而你想攻克一个人可能就是不可能事件,所以坚持搞技术吧。

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
60 [报告]
发表于 2013-11-04 20:53 |只看该作者
Monox 发表于 2013-11-04 19:58
一时头脑发热就写了下面的内容,对于心理承受能力低的人请不要继续阅读,管理员如觉得有必要,可以删除本回复甚至封号也是可以的。

1、说说您的Linux内核源码的学习经验和感受
我从昨天刚开始学习 0.01 版的 Linux 内核源码,所以可以说没什么学习经验可谈吧。感受的话只能用一句来概括“机器与人相比要容易相处得多了,即使是操作系统源码也比与人相处简单”。
我之所以开始学习Linux内核这事要从一个多月前说起。一个多月前基友刚找到女朋友,居然还找我陪他吃饭,聊天,购物什么的。他问我业余时间都在干什么,我说没有什么特别的事可干的,偶尔按照别人的教程写自己的操作系统,偶尔看看高中化学,考虑要不要重新高考。基友说:“重新参加高考很不现实,反正你闲着,我之前总想用现代的编译器编译Linux 0.01 的内核,一直没搞定,现在有女朋友了也没心思搞这个了,要不你研究一下如何才能让Linux 0.01的内核在现代的编译器下编译通过,然后给我讲一讲为什么不进行修改就编译不了”。我当时算是接受了这个提仪吧。不过,我当天晚上给他发了短信说喜欢他(其实说的是如果我说喜欢他,他会有什么反应,对我有什么看法之类的说法)。第二天他仍旧找我吃饭,然后说很荣兴我喜欢他,还说他并不歧视我。不过他明显就表现得很歧视我嘛。后来渐渐的(中间略去一个月左右的事),反正我从来都没去碰过Linux内核(怎一个堕落了得),和他说话的机会也越来越少,到昨天他彻底不理我了,把我从他的Skype的好友列表里也删了。虽然我知道我彻底忘掉他的时刻终于来了,也在考虑要不要找新的工作。但是我把找新工作的事暂时放在了一边,抽了一天的时间经过一些修改,让Linux 0.01的内核可以在gcc 4.8.2下编译通过了,我把我做的修改用邮箱告诉了他,作为我对之前承诺的兑现,同时也作为从此将他从心底移除的纪念。不过,内核源码我还是要继续研究的,光编译通过还不够,还要把shell什么的迁移过去,搭建一个完整的操作系统,不仅仅是一个内核。不过,我也没有特别的冲动要研究Linux内核,所以都闲得花慌的时候就再研究吧。
2、对于普通的Linux程序员和运维人员,是否有必要学习Linux系统构成及源码等基础知识
Linux系统构成和内核源码是完全不相干(其实也有些相干了)的两件事。如果说学习Linux内核源码有助于(或者以我的个人经历来说没有任何帮助)找到一些和基友套近乎的话题的话,那么学习Linux系统构成则是让基友(们)崇拜的基本条件之一。我不是学计算机相关专业出身的,但是我有比计算机相关专业出身的大多数人都长的Linux系统使用经验,这个使用经验可以让我对Linux的使用得心应手,但是对于Linux程序员或者运维人员来说这并不够。我曾经尝试过自己构建LFS系统,基本系统都构建好了,但是编译内核的时候有部分硬件驱动没有编译进去,结果导致系统只能在chroot环境下运行,并不能实际独立运行(后来因为构建LFS系统太花时间了所以没再尝试)。尽管LFS系统的构建算是失败了,但是失败本身没什么,构建这个系统的过程本身我学会了很多东西。碰到问题解决问题的能力,还有就是对CFLAGS,LDFLAGS,LD_LIBRARY_PATH等等Linux程序员和运维人员或者whatever都一知半解,或者完全不知道又很重要的这类的内容我都有了一个很深刻的认识,所以现在很少有我安装不了的开源软件,我对解决Linux的使用问题等都都觉得很得心,所以公司才让我这个非专业人员给那一帮专业人员进行Linux使用以及程序开发和调试的培训。只要知道了事物的本质,就相当于你碰到的问题和将碰到的问题就已经解决了一半。结论,学习Linux内核源码会让你对Linux的本质有个更深刻的认识,但是对普通Linux程序员和运维人员并非必要的,相对的,Linux系统构成的知识比Linux内核源码要浅显些但是内容比较杂,可是却是对普通Linux程序员和运维人员很有必要的。
回到之前的感受,真的,机器比人容易相处多了,给那些看到最后的人的建议(当然这些建议对很多这些看到最后的人可能并不需要):不要觉得Linux很难,不要觉得编程很难,也不要觉得这方面的英文资料很难,这些比和人相处容易多了,你攻克这些只是时间问题,而你想攻克一个人可能就是不可能事件,所以坚持搞技术吧。...


我败退了,为了基友学习内核 {:3_188:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP