前言:对于如何学习嵌入式Linux内核,临时想起来一些个人见解和领悟。学习Linux内核,每个人都有一套自己的方法,算是见仁见智吧。一般从事嵌入式Linux驱动和内核开发工作,工程师主要分为两种:一种是做产品研发的,另外一种是做开源社区。作为从事FAE多年的我,认为学习Linux内核比较有效率的,拿出自己的一些个人学习经验给大家做分享。
内核学习
Linux 内核功能越来越完善,如果没有充裕的时间,深入内核并不是很现实。所以建议先读一本内核的书,第一遍是读,会读得很迷糊;之后反省一下,然后再浏览一下;可以想象一个 OS 是如何运行的,这样可以不陷入 Linux 内核的细节;最后可以深入自己感兴趣或者需要的那一个子系统。
即便是子系统,也是很庞大的。一个省力的方式是网上搜一些相关的文章,便于快速了解这个子系统的运作;然后结合代码,形成自己的认知,最后做一下总结。如果仅仅是快速了解某一子系统的运作,可以参考一些早期代码的注解书籍,在深入的时候看看最新的代码实现。
对内核的认知是一个反复的过程,一开始并不完善,可能需要反复纠正。不要陷入这种纠错中;而是以后继续使用和学习过程中,发现了没有弄清楚的地方再深入,毕竟 Linux 内核是不断变化的。
还有一个很好的方式是,从系统调用入手,现在这方面的数据不少,而且对系统调用的语义都有讲解,这样可以间接了解 Linux 系统的一些概念。对系统调用熟悉了,可以根据系统调用的执行过程,来大体了解内核的一个运作过程;但是跟踪系统调用的时候要注意抓主线,现在内核系统很复杂,一些 code path 上可能会涉及多个子系统,可以从名字上猜测它们是干什么的,不需要深入,否则会发现精力完全被分散掉了。
即便是子系统,也是很庞大的。一个省力的方式是网上搜一些相关的文章,便于快速了解这个子系统的运作;然后结合代码,形成自己的认知,最后做一下总结。如果仅仅是快速了解某一子系统的运作,可以参考一些早期代码的注解书籍,再深入的时候看看最新的代码实现。
对内核的认知是一个反复的过程,一开始并不完善,可能需要反复纠正。不要陷入这种纠错中;而是以后继续使用和学习过程中,发现了没有弄清楚的地方再深入,毕竟 Linux 内核是不断变化的。
还有一个很好的方式是,从系统调用入手,现在这方面的数据不少,而且对系统调用的语义都有讲解,这样可以间接了解 Linux 系统的一些概念。对系统调用熟悉了,可以根据系统调用的执行过程,来大体了解内核的一个运作过程;但是跟踪系统调用的时候要注意抓主线,现在内核系统很复杂,一些 code path 上可能会涉及多个子系统,可以从名字上猜测它们是干什么的,不需要深入,否则会发现精力完全被分散掉了。
学习 Linux 内核,一个很重要的是抽象的能力,所谓的抽象这里仅仅是指分清接口和接口的实现。因为 Linux内核子系统很多,有很多子系统相互渗透,这样 code path 看上去很复杂。阅读代码的时候,为了排除干扰,需要分清哪些是自己需要看的,哪些是其它子系统的接口,对于其它子系统的接口,先当作它们功能完善不会出问题好了,这样可以关注重点;打个比方,一个应用程序的代码可能量很大,比如一个 apache 项目,它包含很多组件,有时候阅读代码的时候会看到不同组件的 API,深入看相关组件实现并不现实,这时候分清主次对于代码的阅读就很有帮助了,总不能看到了 malloc 就要先把它的实现弄清楚吧,系统调用多者呢。
接下来怎么办?不停地循环!生命不息,循环不止!两情若是久长时,又岂在朝朝暮暮。下面给大家推荐怎么学习
如何学习嵌入式Linux内核,从系统调用入手
对于如何学习嵌入式Linux内核,临时想起来一些个人见解和领悟。学习Linux内核,每个人都有一套自己的方法,算是见仁见智吧。一般从事嵌入式Linux驱动和内核开发工作,工程师主要分为两种:一种是做产品研发的,另外一种是做开源社区。作为从事FAE多年的我,认为学习Linux内核比较有效率的,拿出自己的一些个人学习经验给大家做分享。
内核学习
Linux 内核功能越来越完善,如果没有充裕的时间,深入内核并不是很现实。所以建议先读一本内核的书,第一遍是读,会读得很迷糊;之后反省一下,然后再浏览一下;可以想象一个 OS 是如何运行的,这样可以不陷入 Linux 内核的细节;最后可以深入自己感兴趣或者需要的那一个子系统。
即便是子系统,也是很庞大的。一个省力的方式是网上搜一些相关的文章,便于快速了解这个子系统的运作;然后结合代码,形成自己的认知,最后做一下总结。如果仅仅是快速了解某一子系统的运作,可以参考一些早期代码的注解书籍,在深入的时候看看最新的代码实现。
对内核的认知是一个反复的过程,一开始并不完善,可能需要反复纠正。不要陷入这种纠错中;而是以后继续使用和学习过程中,发现了没有弄清楚的地方再深入,毕竟 Linux 内核是不断变化的。
还有一个很好的方式是,从系统调用入手,现在这方面的数据不少,而且对系统调用的语义都有讲解,这样可以间接了解 Linux 系统的一些概念。对系统调用熟悉了,可以根据系统调用的执行过程,来大体了解内核的一个运作过程;但是跟踪系统调用的时候要注意抓主线,现在内核系统很复杂,一些 code path 上可能会涉及多个子系统,可以从名字上猜测它们是干什么的,不需要深入,否则会发现精力完全被分散掉了。
即便是子系统,也是很庞大的。一个省力的方式是网上搜一些相关的文章,便于快速了解这个子系统的运作;然后结合代码,形成自己的认知,最后做一下总结。如果仅仅是快速了解某一子系统的运作,可以参考一些早期代码的注解书籍,再深入的时候看看最新的代码实现。
对内核的认知是一个反复的过程,一开始并不完善,可能需要反复纠正。不要陷入这种纠错中;而是以后继续使用和学习过程中,发现了没有弄清楚的地方再深入,毕竟 Linux 内核是不断变化的。
还有一个很好的方式是,从系统调用入手,现在这方面的数据不少,而且对系统调用的语义都有讲解,这样可以间接了解 Linux 系统的一些概念。对系统调用熟悉了,可以根据系统调用的执行过程,来大体了解内核的一个运作过程;但是跟踪系统调用的时候要注意抓主线,现在内核系统很复杂,一些 code path 上可能会涉及多个子系统,可以从名字上猜测它们是干什么的,不需要深入,否则会发现精力完全被分散掉了。
学习 Linux 内核,一个很重要的是抽象的能力,所谓的抽象这里仅仅是指分清接口和接口的实现。因为 Linux内核子系统很多,有很多子系统相互渗透,这样 code path 看上去很复杂。阅读代码的时候,为了排除干扰,需要分清哪些是自己需要看的,哪些是其它子系统的接口,对于其它子系统的接口,先当作它们功能完善不会出问题好了,这样可以关注重点;打个比方,一个应用程序的代码可能量很大,比如一个 apache 项目,它包含很多组件,有时候阅读代码的时候会看到不同组件的 API,深入看相关组件实现并不现实,这时候分清主次对于代码的阅读就很有帮助了,总不能看到了 malloc 就要先把它的实现弄清楚吧,系统调用多者呢。
接下来怎么办?不停地循环!生命不息,循环不止!两情若是久长时,又岂在朝朝暮暮。下面给大家推荐怎么学习
这里给大家分享的是零声学院的的Linux内核源码课程,对标腾讯T6-9级别:
主要从
- 操作系统原理专题
- 进程管理专题
- 内存管理专题
- 网络协议栈专题
- 设备驱动专题
- 内核组件专题
- 文件系统专题
- 内核项目实战专题
- 等等。。。
方面系统全面的讲解Linux内核源码开发技术:
操作系统原理/汇编专题
进程管理专题
内存管理专题
网络协议栈专题
设备驱动专题
内核组件专题
文件系统专题
内核项目实战专题
适合于
- 从事业务开发多年,对底层原理理解不够深入的在职工程师
- 从事嵌入式方向开发,想转入内核开发的在职工程师
- 从事Qt/MFC等桌面开发的,薪资多年涨幅不大的在职工程师
- 从事非开发岗位(算法岗,运维岗,测试岗),向内核开发岗位的在职工程师
- 工作中没有技术没有挑战,工作中接触不到新技术的在职工程师
- 自己研究学习速度较慢,不能系统构建知识体系的开发人员
- 了解很多技术名词,但是深入细问又不理解的工程师
- 计算机相关专业想进入大厂的在校生(本科及以上学历,有c/c++基础)
资料分享:
无论是你短期内想提升Linux内核实力,突破自己工作中的能力瓶颈,还是准备参加 跳槽涨薪面试,都会在这个课程中有所收获。这套课程,根据市场技术,划分了 八个专题。