问一个新手最常问的问题:到底怎么样才能学习好linux呢?
本文是原「蜗窝讨论区」的历史存档(2016-04-19),来自版块「Linux kernel技术问答」,共 7 帖。讨论区已停止服务,此处仅供查阅。
做为一个初学者,对linux一无所知,到底有没有一个公式化的方法可以一步一步进入高手的行列呢?
做为一个过来人,我谈谈我自己的看法,欢迎大家补充:
首先肯定的一点是:不要一上来就看内核代码,基本上你会很快被挫败感打败。内核正在变得越来越庞大,学习曲线越来越陡峭,当你一无所知的时候冒然进入linux kernel,你会发现处处都是障碍,处处都是大坑,你根本走不下去。最好的方法是把对内核源代码的热情先放在心里,从基本功开始。
我认为的基本功包括两个方面: 1、linux的基本操作。内核中的很多设计都是源于应用,你不理解用户空间的操作,也就不会知道内核空间在干什么。这时候,你需要做的就是在自己的计算机上安装一个GNU/linux操作系统,Debian、Ubuntu什么的都OK,最好去掉其他的OS,这可以强迫你在linux下进行学习,工作,生活。在这个过程中,你可能需要google检索一些信息,安装一些软件,学习使用这些软件,理解一些基本的linux的背景知识......如果你想要从事底层的软件开发,那么尽量在终端下工作,这样会让你和linux kernel更接近一些,从而提供更多关于内核的基础知识。
2、第二个方面是软件相关的基础知识。你最好学习一些软件的逻辑思维,学习掌握一门语言,当然最好是c语言。掌握其基本的语法和语义,然后在linux环境下进行实际训练。这里不得不隆重推出一本经典之作《Unix高级环境编程》,仔细阅读这本书,然后动手实践,编写linux下的小程序,给自己找些乐子。
有了基本功之后,你可以选择强攻Linux kernel,不过呢我还是建议从一个小的RTOS入手,构建下面的知识体系: 1、关于OS的基本概念。什么是进程、什么是线程,什么是中断,什么是文件系统,什么是内存管理,什么是上下文,什么是设备管理等等。
2、关于处理器以及周边硬件的基础知识。可以选择ARM,也可以选择其他的处理器,主要是从软件角度来理解一个处理器,知道CPU的基本组成,知道什么是MMU,TLB,中断处理流程,总线的概念,什么是指令集等等。这时候,相信你会接触一些汇编指令,不一定要能写,但是一定要能读懂。
上面的阶段都没有接触Linux内核,但是不要着急,我们马上就要直面Linux内核了,第一个问题就是选择什么版本,不需要太新,但是越早的内核就会越简单,有助你可以把阅读linux内核代码的习惯持续下去。你有几个选择: 1、配合《Linux内核完全注释》来理解0.12内核。我没有看过这本书,听说不错。 2、配合《Linux内核情景分析》来理解2.4内核。当年就是这本书引领我来阅读内核的,我一直都对其充满感激之情 3、配合《深入理解linux内核》来理解2.6.10内核。非常好的书,强烈推荐,我基本上阅读了好几遍这本书,中文版一遍,英文版3遍,每次都有不同的收获。
阅读代码的过程有些枯燥,可以考虑撰写实际的驱动程序来调节一下,《Linux设备驱动》是不二之选。
最后,整理一些心得: 1、英语很重要、英语很重要、英语很重要。一定要学好英语,尽量看英文版书籍。 2、多动手,多思考,多总结。如果有机会,把自己的心得整理出来并发布,和其他工程师交流,这个过程可以有助于夯实你对Linux kernel的理解。 3、clone linux stable的代码仓库,多读一读git log,那是无穷的宝藏
linuxer大神的建议非常好!我当初也是从RTOS开始的,从那里对操作系统有了一个大致的整体的概念,ucosII和ucosIII,推荐大家看看,一共就十几个c文件,麻雀虽小,五脏俱全~~~
收到,看来前路漫漫啊,待我上下求索吧!
+1
3、配合《深入理解linux内核》来理解2.6.10内核。非常好的书,强烈推荐,我基本上阅读了好几遍这本书,中文版一遍,英文版3遍,每次都有不同的收获。
---很牛叉
大约1年前开始访问本网站(原先马甲好像不能用了,今天重新注册一个),受益匪浅,不论对我理解linux 还是linux相关的工作帮助都很大. 对linuxer & wowo 再次表示感谢.
对linuxer的下面的建议,我也强烈赞同.
我大约14年前就购买了《Linux内核情景分析》,但当时还是硬件工程师,有些基础背景知识还不充分, 最终无法看懂全书的内容,努力了几次后都没有结果,最终放弃. 大约8年前购买《深入理解linux内核》(影印版), 几次尝试也都不能坚持到底.
后来,从事转行做软件工程师, 由于工作需要和个人兴趣,阅读ARM/X86/coldfile/Tencilica/MIPS的manual,自己补充编译原理/操作系统的知识, 先是从事xworks& freertos开发, 有机会阅读其操作系统的全部原代码. 自己算是掌握的比较彻底.
大约3年前, 重新阅读《深入理解linux内核》(影印版), 感觉自己的背景知识比较充足了. 有些章节可能反复读几遍. 有些到目前只读了一遍(有时间会继续学习). 最近2年,由于工作需要,天天鼓捣linux, 有些topic才比较深入.
对linuxer总结的体会我深有感触, 也非常赞同. 自己跟linuxer的相似之处是(linuxer是谦虚, 我确实不会, 也没精力全部弄通), 对C比较熟悉, 其它编程语言基本不会. 对kernel & CPU 细节问题倒是花费了好多时间. (基本不分周末和假期)
日常工作中, 我也看到很多年轻同事也能解决一些问题, 但确实没有弄清楚为什么要这样解决, 很多时候是试出来的, 对系统稳定性是隐患.
需要送小孩上学去了, 以后再灌水.
linuxer 写道: 做为一个过来人,我谈谈我自己的看法,欢迎大家补充:
首先肯定的一点是:不要一上来就看内核代码,基本上你会很快被挫败感打败。内核正在变得越来越庞大,学习曲线越来越陡峭,当你一无所知的时候冒然进入linux kernel,你会发现处处都是障碍,处处都是大坑,你根本走不下去。最好的方法是把对内核源代码的热情先放在心里,从基本功开始。
我认为的基本功包括两个方面: 1、linux的基本操作。内核中的很多设计都是源于应用,你不理解用户空间的操作,也就不会知道内核空间在干什么。这时候,你需要做的就是在自己的计算机上安装一个GNU/linux操作系统,Debian、Ubuntu什么的都OK,最好去掉其他的OS,这可以强迫你在linux下进行学习,工作,生活。在这个过程中,你可能需要google检索一些信息,安装一些软件,学习使用这些软件,理解一些基本的linux的背景知识......如果你想要从事底层的软件开发,那么尽量在终端下工作,这样会让你和linux kernel更接近一些,从而提供更多关于内核的基础知识。
2、第二个方面是软件相关的基础知识。你最好学习一些软件的逻辑思维,学习掌握一门语言,当然最好是c语言。掌握其基本的语法和语义,然后在linux环境下进行实际训练。这里不得不隆重推出一本经典之作《Unix高级环境编程》,仔细阅读这本书,然后动手实践,编写linux下的小程序,给自己找些乐子。
有了基本功之后,你可以选择强攻Linux kernel,不过呢我还是建议从一个小的RTOS入手,构建下面的知识体系: 1、关于OS的基本概念。什么是进程、什么是线程,什么是中断,什么是文件系统,什么是内存管理,什么是上下文,什么是设备管理等等。
2、关于处理器以及周边硬件的基础知识。可以选择ARM,也可以选择其他的处理器,主要是从软件角度来理解一个处理器,知道CPU的基本组成,知道什么是MMU,TLB,中断处理流程,总线的概念,什么是指令集等等。这时候,相信你会接触一些汇编指令,不一定要能写,但是一定要能读懂。
上面的阶段都没有接触Linux内核,但是不要着急,我们马上就要直面Linux内核了,第一个问题就是选择什么版本,不需要太新,但是越早的内核就会越简单,有助你可以把阅读linux内核代码的习惯持续下去。你有几个选择: 1、配合《Linux内核完全注释》来理解0.12内核。我没有看过这本书,听说不错。 2、配合《Linux内核情景分析》来理解2.4内核。当年就是这本书引领我来阅读内核的,我一直都对其充满感激之情 3、配合《深入理解linux内核》来理解2.6.10内核。非常好的书,强烈推荐,我基本上阅读了好几遍这本书,中文版一遍,英文版3遍,每次都有不同的收获。
阅读代码的过程有些枯燥,可以考虑撰写实际的驱动程序来调节一下,《Linux设备驱动》是不二之选。
最后,整理一些心得: 1、英语很重要、英语很重要、英语很重要。一定要学好英语,尽量看英文版书籍。 2、多动手,多思考,多总结。如果有机会,把自己的心得整理出来并发布,和其他工程师交流,这个过程可以有助于夯实你对Linux kernel的理解。 3、clone linux stable的代码仓库,多读一读git log,那是无穷的宝藏
