从四个方向分析我们可以从linux学到什么
我们真正关心的是自身可以从这个生态圈中获得些什么?说得更直白一点就是,我们可以从linux系统上面学到点什么,它对我们个人的成长和发展有哪些积极的因素。个人觉得,完全可以通过下面四个维度并结合自己的兴趣进行选择和判断。
(1)熟练学习linux、配置linux和使用Linux
2011年有一本书特别火,长期位列在热销排行榜上,这本书就是《鸟哥的linux私房菜》。这本书以centos为例,讲了很多的内容,比如说系统安装、常见配置、软件更新、特殊命令的用法、服务器的配置等等。整本书的内容很厚,而且内容是一版再版,可见大家对linux的基础知识是非常渴求的。另外一方面,现在随着电商和视频网站的迅速发展,一种称为运维工程师的职业开始热门起来。由于行业的特殊性,某些互联网公司需要成百上千的服务器统一对客户进行服务,那么怎么样搭建网站、配置服务器均衡负载、进行远程控制、正确配置数据库和统一管理服务器集群,这些都是运维工程师需要关注的事情。从这个意义上来说,运维工程师的重要性可见一般了。
(2)利用linux开发应用层软件
通俗意义上来说,利用linux开发应用层的软件和windows上面开发应用软件没有什么不同。可能,在windows上面使用得比较多的就是mfc、gdi、win32这些接口,而在嵌入式上面使用的就比较多种多样了,什么qt、minigui、gtk都是可以用来进行开发的。当然,上面说的都是界面程序,很多公司的linux程序是没有界面的,比如说游戏公司的linux工程师。相比较而言,他们看中的更多的是linux的稳定性,所以在linux上开发的更多的都是服务器端程序。很多人都有一个误解,认为操作系统就一定比应用软件高级,其实不然。在我看来,office、webkit、samba、mplayer这些软件的代码都是在百万行以上,本身的结构也是相当复杂的。说到应用开发,网上有几本书,分别是《linux程序设计》、《unix环境高级编程》、《unix网络编程》,对我们都很有借鉴意义。诚然有些书是基于unix系统的,但是基本的编程接口都是差不多的,相应的代码在linux跑绝对没问题。
(3)利用linux开发驱动
和其他os系统开发驱动的工作一样,linux驱动开发也有自己的一整套流程。要想真正地做好驱动,一般来说你需要知道芯片的寄存器特性、电气原理图、总线标准,当然熟悉信号测试,通晓定时器、互斥工具、回调机制、位运算、中断机制、芯片设置、信号时序、地址分配,这些也是少不了的。更极端一点,如果本身创业的公司比较小,驱动开发工程师有的时候还需要自己测试信号、调试boot、焊接芯片,这些都是可能的。所以说,对于真正的芯片企业来说,无论是美资、日资、台资企业来说,驱动开发工程师的收入都是非常可观的。特别是现在有了android的推波助澜,驱动开发工程师的薪酬更是水涨船高。希望在软件上有所突破的硬件工程师或者是希望对系统本身进行更多了解的软件工程师,都可以将此作为自己长期发展的一个方向。关于这方面的书很多,《linux driver development》无疑是人气最旺的一本,但是我想说的是有一本国内朋友写的书也相当不错,那就是宋宝华的《Linux设备驱动开发详解》,质量也相当不错,朋友们有时间也可以关注一下。
linux驱动其实并不复杂,我们要做的就是在linux统一的驱动框架下实现对外设的统一管理。很多的代码架构都是现成的,所以我们只要做好模仿、学习、测试和验证就可以了。比较简单的代码就是下面的这一段话,
加载模块就是输入insmod hello.ko,卸载模块就是rmmod hello.ko。在这过程中,我们都可以看到相应的打印内容。当然,朋友们可以一直往里面加代码,一步步调试,一步步学习,只要坚持和总结,都是可以学习好linux的驱动代码的。
这里顺便把Makefile也写一下,
(4)linux kernel代码移植、修改和维护
linux kernel代码相信是被很多人奉为经典的,但是linux kernel的代码很长也很难。一方面,linux代码存在技巧代码、汇编代码,同时部分函数冗长、文件冗长、命名不规范,另外一方面linux的代码分布合理、系统流程明显、相关资料众多。关键是我们自己怎么从linux kernel中学到东西?是看书呢,还是看代码呢?是每一行都看呢,还是按照模块看呢?是掌握主要原理呢,还是看实现技巧呢?是看高版本呢,还是先熟悉低版本呢?下面,我想就自己的经历谈谈自己的看法,
a)熟悉的代码认真看,不熟悉的代码了解一下接口就可以,对于内存管理只要了解__get_free_page、kmalloc、vmalloc这几个函数就可以了;
b)代码不要贪多求快,多思考多实践;
c)忽视技巧,看中代码的处理流程和策略的权衡,多多思考为什么要这么设计;
d)利用module特性查看代码的执行日志,代替函数堆栈的功能;
e)了解linux性能的改进方法,了解为什么有软中断、rcu、slab和各种各样的延时函数;
f)自己编写os,实现内存管理、信号量、消息队列、驱动开发、中断和线程调度,深入理解os的流程。
最后依然为大家分享相关的学习资料供大家参考学习用
九天学会linuxC语言
http://www.makeru.com.cn/course/1861.html?s=45051
linux基础
http://www.makeru.com.cn/course/details/2058?s=45051
Linux网络经典案例
http://www.makeru.com.cn/live/3485_1630.html?s=45051
shell脚本
http://www.makeru.com.cn/live/3485_1489.html?s=45051
从四个方向分析我们可以从linux学到什么的更多相关文章
- ActiveMQ、RabbitMQ、RocketMQ、Kafka四种消息中间件分析介绍
ActiveMQ.RabbitMQ.RocketMQ.Kafka四种消息中间件分析介绍 我们从四种消息中间件的介绍到基本使用,以及高可用,消息重复性,消息丢失,消息顺序性能方面进行分析介绍! 一.消息 ...
- Android四个多线程分析:MessageQueue实现
Android四个多线程分析:MessageQueue的实现 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前面两篇文章<Android多线 ...
- JS用斜率判断鼠标进入DIV四个方向的方法 判断鼠标移入方向
本文要介绍的是一种鼠标从一个元素移入移出时,获取鼠标移动方向的思路.这个方法可以帮助你判断鼠标在移入移出时,是从上下左右的哪个方向发生的.这个思路,是我自己琢磨出来,利用了一点曾经高中学过的数学知识, ...
- Android自定义组件——四个方向滑动的菜单实现
今天无意中实现了一个四个方向滑动的菜单,感觉挺好玩,滑动起来很顺手,既然已经做出来了就贴出来让大家也玩弄一下. 一.效果演示 (说明:目前没有安装Android模拟器,制作的动态图片太卡了,就贴一下静 ...
- Linux及安全实践四——ELF文件格式分析
Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...
- 51nod 1572 宝岛地图 (预处理四个方向的最大步数优化时间,时间复杂度O(n*m+k))
题目: 这题如果没有时间限制的话暴力可以解,暴力的话时间复杂度大概是O(k*n),1s的话非常悬. 所以我们需要换个思路,我们对每个点预处理四个方向最多能走的步数,这个预处理时间复杂度是O(n*m). ...
- Android自定义组件系列【15】——四个方向滑动的菜单实现
今天无意中实现了一个四个方向滑动的菜单,感觉挺好玩,滑动起来很顺手,既然已经做出来了就贴出来让大家也玩弄一下. 一.效果演示 (说明:目前没有安装Android模拟器,制作的动态图片太卡了,就贴一下静 ...
- Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装
原文:Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装 Linux内核分析(一) 从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底 ...
- TCP/IP三次握手四次挥手分析
流程图 全部11种状态 客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 服务器独有的:(1)LISTEN (2 ...
随机推荐
- Stream 流
Stream流(接口不是函数接口) 描述 在java.1.8中,由于 lambda表达式这种函数编程jdk引入了一个全新的改变Stream流它是用来解决已有集合类库的一些弊端的. Stream是jav ...
- 树莓派的kodi设置遥控器的方法
首先你需要买一个红外接收器,根据卖家的文档,插到树莓派的GPIO串口上, 我的红外接收器是18入口,17出口, 所以我的config.txt文件设置如下 dtoverlay=lirc-rpi,gpio ...
- HDU1548 Building Roads
A strange lift Description There is a strange lift.The lift can stop can at every floor as you want, ...
- 关于在.H文件中定义变量
KEIL中,在".H"文件定义变量. 如果该".H"文件同时被两个".C"文件调用,则会出现重复定义错误(*** ERROR L104: M ...
- nuxt.js同路由跳转参数不同,mounted不执行时
watch: { '$route'(to, from) { if (to.fullPath !== from.fullPath) { this.$nextTick(() => { // 不加th ...
- js复制功能代码
js复制代码: http://www.clipboardjs.cn/
- webpack 安装与卸载
全局安装(不推荐): npm install webpack webpack-cli -g 安装好后打印版本: webpack -v webpack-cli -v 卸载全局 npm uninstall ...
- springboot多数据源配合docker部署mysql主从实现读写分离
本篇主要有两部分: 1.使用docker部署mysql主从 实现主从复制 2.springboot项目多数据源配置,实现读写分离 一.使用docker部署mysql主从 实现主从复制 此次使用的是wi ...
- Selenium多浏览器处理 (Chrome/Firefox/IE)
测试用例文件:test_selenium/test_hogwarts.py 使用pytest框架 定义一个变量,通过外部传入变量,确定使用哪个浏览器 browser = os.getenv(" ...
- HTML 网页开发、CSS 基础语法——四. HTML基本语法
1. HTML规范和HTML标签 W3C:world wide web consortium,万维网联盟.专门发布和维护互联网的规范和标准. 2. HTML标签 HTML 标记通常被称为 HTML 标 ...