免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1365 | 回复: 6

[内核入门] 内核学习的心理障碍 [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2015-12-21 21:38 |显示全部楼层

写这篇帖,并不是因为我很腻害,其实我学习内核也没多长时间,只是自己在学习前,畏却了很久,迟迟不敢迈出第一步,希望以下的内容,可以让你体会到计算机也就那么回事,克服心理障碍。


1. 硬件“活”了
计算机没有生命也能跟人类“交流”,哪来的思想?
交流=请求+响应。虽然计算机不可能主动请求,只会被动的响应(哪怕是“电子宠物”主动卖萌,也是程序员安排的,只是这种响应表现的像请求;或者是闹铃,也是响应了程序员设定的定时程序),即使“人工智能”、“大数据分析”这些东西,也推不倒这个道理,计算机毕竟没有生命,不像人类头上天生有就个电路,计算机的思想,最终输入的是人类思想(题外话:那人类是怎么出现的,大脑又是谁设计的?如果说大自然的风把一些电子元件吹在了一起,并且一个雷电将操作系统闪进了CPU,从而形成一个电脑,那大自然要花多少年才能造出人类,更何况人类这么复杂,还是有机物组成的,也不可能靠打雷上电)。
总之,计算机以电为驱动力,可以通过各种电路的配合,响应人类的操作,而且还可以在响应中表现请求,或者把响应再次交给请求,所以计算机“活”了,也没啥奇怪的。


2. 软硬件“融合”
人们是如何将思想这么抽象的东西“灌进”计算机的?
如果你对“打开开关,灯亮了”已习以为常。那么,通过程序,向计算机表达思想,同样也没什么好神秘的,因为程序本质上也是通过开关控制电脑,只是多了一些而已。英文26个字母可以组合无数的单词,而单词本质上是事先约定了含义的符号,从而可以写出无数篇文章。同理,开关的状态相当于2个“字母”(0、1),也可以组合无数的“单词”(二进制指令),从而可以写出无数的程序,最早的程序员就是通过大量的开关控制计算机。不要总认为计算机可以执行程序,就等同于计算机可以理解程序,计算机只是一些电路的组合,这些电路只是人类另一种“文字”的载体,就像将诗写在书上,不代表书能读得懂诗一样。

针对开关编程的缺陷,人类所做的努力:
① 每次表达同样的思想,必须重新按一遍大量的开关,所以人们后来发明了穿孔纸带(因为通过光电转换器,它同样可以起到开关的作用),再后来发明了磁盘。
② 开关只能表示2个“字母”,生成的单词难懂,又不方便书写,所以后来有了高级语言。


3. 先有鸡,先有蛋
如今我们写完程序,总是要经过编译,才能执行,那么世界上第一个编译器是通过什么编译出来的?
(脚本虽然不需要编译,但依赖一个解释程序,解释程序同样需要编译)
为了解决这个“先有鸡,先有蛋”的问题,只能猜测世界上第一个编译器是直接用二进制写的。在我们印象中,编译器太复杂了,用爱因斯坦的大脑,也不可能直接用二进制实现出来。所以可以再次猜测,这是一个滚雪球的过程,先用二进制写个简单的编译器,再用这个编译器编译更加强大的编译器,经过一代一代的发展,才形成了如今这么复杂的编译器。我没有验证这个猜测,但至少是可实现的,达到自我安慰的效果即可。

如今我们写程序不再是按开关,而是敲字,在还不能用字写程序的时候,程序员是如何将字“写进”显示器的?
其实只要我们知道存在开关编程这件事,就不存在“先有鸡,先有蛋”问题了,想必是程序员先辈们通过智慧,设计出了一种电路,可以控制“电子枪”指哪打哪,并设计了128个二进制位的矩阵(ascii表),只看这些矩阵中的0或1,就正好是一个工整的文字,然后通过按开关将这些矩阵保存在了电脑里,从此电脑中就可以使用文字了,再加上后来出现的编译器,就可以通过高级语言编写更多的字库制作程序了。

所以说,先有了最早的一批计算机科学家,才有如今大量的程序猿、攻城狮。


总结:
上面写的内容,其实和内核一点关系没有,只是当初我是冲着这些问题学习内核的,并且也被这些问题阻碍过。
另外一方面,上面的内容如果你真的都觉得理所当然了,相信你自然也不会觉得内核神秘了。内核的目的就是创造更幸福的编译环境,把硬件提供给的“文字”先用了一遍,站在一个管理者的全局视野,书写了一套方案,向用户程序提供基础环境和接口服务,以及协调保护用户进程。
相应的,学习内核向下一定要注意软件和硬件的边界,不要过于追究硬件的实现原理,向上要多考虑如何更好的为上层带来优惠。


目前的学习感受:
① 对用户空间和内核空间的理解最重要,最好最先搞懂;
② 完全理解进程调度,需要对其它几个基本模块理解比较到位才行,如果一时半会看不懂,可以先学习别的;
③ 其它的模块相对独立。


论坛徽章:
3
巨蟹座
日期:2015-12-24 09:32:10数据库技术版块每日发帖之星
日期:2015-12-27 06:20:00数据库技术版块每日发帖之星
日期:2016-01-09 06:20:00
发表于 2015-12-22 08:51 |显示全部楼层
说得好,赞一个

论坛徽章:
0
发表于 2015-12-24 09:33 来自手机 |显示全部楼层
赞一个

论坛徽章:
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
发表于 2015-12-24 10:55 |显示全部楼层
回复 1# _nosay
内容虽然跟内核关系不大,但是能感觉出楼主是好奇心比较强的程序员,适合搞内核。

帖子写的不错,考虑后续写一些技术科普的书籍。

   

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2015-12-24 11:54 |显示全部楼层
瀚海书香 发表于 2015-12-24 10:55
回复 1# _nosay
内容虽然跟内核关系不大,但是能感觉出楼主是好奇心比较强的程序员,适合搞内核。


论坛徽章:
16
天秤座
日期:2014-08-17 11:27:4215-16赛季CBA联赛之青岛
日期:2017-02-27 17:06:3015-16赛季CBA联赛之广夏
日期:2017-02-08 13:34:58白银圣斗士
日期:2015-11-30 20:57:05冥斗士
日期:2015-12-01 09:49:10嗜杀者
日期:2015-12-01 09:49:10白银圣斗士
日期:2015-11-27 23:56:51神斗士
日期:2015-12-01 09:49:10嗜杀者
日期:2015-12-01 09:49:10青铜圣斗士
日期:2015-12-01 09:49:10白银圣斗士
日期:2015-11-25 14:19:53黄金圣斗士
日期:2015-11-24 10:43:13
发表于 2015-12-25 01:35 |显示全部楼层
好帖子,Lz让我想起了我接触内核的经历。
我大学四年学的就是软件工程,老师教会了两门语言和各种理论,不过到毕业的时候还是不知道printf是怎么经由硬件到屏幕打出“Hello World!”的,只知道代码这么写会有这么的结果,想想也有点惭愧。
不过经验告诉我,好好学习还是有用的,今天不懂,先记下来,说不定哪天就懂了。
毕业之后漫无目的,找了份运维的工作就干了起来,于是乎软件开发差不多就断片了一年半载。不管第一份工作如何好如何差,它终究让我找到了什么是自己想要的。随后就跳槽了...
来到了当前的公司了,不管以前学过了什么,断片了就是断片了,有几个月没睡过好觉,拼命在补各种知识。终究还是没法跟上开发的节奏,还好公司没直接开了我,转我去做技术支持,支援其他部门做开发。
这技术支持真心没有以前的运维舒服,不过这里开始了我的内核之旅了。最初公司产品主要是VxWorks上开发的,这系统真心好玩,内存随便访问(只要映射了),函数随便调用(只要不整挂系统)。
就这样,随着支持工作的拓展深入,学会了深入代码学思路,遇到各种异常问题,练就了汇编分析、问题定位的能力,也遇到了各种奇葩问题,积累了不少绕坑的经验。不过这都不是重要的。
重要的是我懂了:
1、汇编指令是什么,它是怎么执行的;
2、异常是什么,怎么触发的,触发后CPU如何处理的,系统又是如何接管的;
3、内存是什么,调用栈又是什么,调用栈如何开栈退栈,函数参数如何传递的;
4、系统是如何调度的,信号量如何起到保护资源的作用;
5、网络又是什么,如何通讯的;
其实这些东西真的没什么,但是理解后,由此及彼。后来公司转到linux上开发了,照搬这些东西过去之后就慢慢地懂得了linux的不同,也看了不少理论上的书,纸上得来终觉浅。
看书只能知道鸡长什么样,没啃过也终究没法知道哪块肉好吃。所以现在转开发搞了好久了,还是坚持啃代码理解,linux可以吸收精髓真的很多。

背景交代完了,说说如何越过心理障碍吧。
因为工作关系,我的学习路线有点杂,不过总体还是:
1、先理解CPU在计算机架构上面处于什么位置,然后理解CPU如何工作的。为了理解CPU的工作,我啃过好几本书《计算机组成与设计:硬件、软件接口》、
《编码:隐匿在计算机软硬件背后的语言》、《深入理解计算机系统》等, 坦白说我都没看完,只是看了我理解问题需要的部分。
2、理解中断是如何发生的,异常又是如何发生的,发生了之后系统如何反应,如何接管这些工作,我真心不想说为了理解它,我看过了多少书,
只能说Intel的芯片开发手册以及linux所有的经典书籍,我都看过了。同样,我只看关于中断和异常的章节,都没完整看完过其中的一本,只是看了部分章节,这是因为工作需要。
3、虽然说这个时候,还有很大一片知识海洋我还没探知过,不过心中已无障碍,CPU如何设计的我不懂,但是它对指令和周边的高低电位会有什么反应,
谈不上精通,但也能够知道一二,更详细的信息也知道可以从哪里找到了。
4、回归内核,学习理论,内核莫过于5大块:内存、调度、驱动、网络、文件系统。我就找了一本书啃了一遍,没细啃,因为不全懂里面的细节,
不过也知道各个模块长什么样子,就当做认个路。
5、内核代码估计接近千万行了吧,想想都有点恐怖,什么时候能看完?它还天天更新呢,其实这都是浮云,理论的书看多了还会迷茫呢。
踏踏实实地找一个模块看,linux的结构还是很清晰的,层次也很分明。找一个模块钻研下去,一遍看不懂看两遍,两遍看不懂看三四五遍,
慢慢地啃多了,熟悉了linux的编码风格后,就会有种豁然开朗的感觉了。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2015-12-25 09:18 |显示全部楼层
回复 6# Jean_Leo

有空多来论坛给我们新手指点指点。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP