Chinaunix首页 | 论坛 | 博客
  • 博客访问: 468307
  • 博文数量: 145
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1060
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-22 11:52
个人简介

专注计算机技术: Linux Android 云计算 虚拟化 网络

文章分类

全部博文(145)

文章存档

2016年(3)

2015年(21)

2014年(75)

2013年(46)

我的朋友

分类: LINUX

2014-02-13 21:00:38

原文地址:Linux学习计划 作者:

一、熟练学习Linux、配置Linux和使用Linux

   《linux系统管理技术手册》这本书被linux之父誉为“Linux系统管理的圣经”,但是对于初学者来书我更建议你看这本长期位列在热销排行榜上的《鸟哥的Linux私房菜》。这本书以CentOS为例,讲了很多的内容,比如说系统安装、常见配置、软件更新、特殊命令的用法、服务器的配置等等。整本书的内容很厚,而且内容是一版再版,可见大家对Linux的基础知识是非常渴求的。
    现在随着电商和视频网站的迅速发展,一种称为运维工程师的职业开始热门起来。由于行业的特殊性,某些互联网公司需要成百上千的服务器统一对客户进行服务,那么怎么样搭建网站、配置服务器均衡负载、进行远程控制、正确配置数据库和统一管理服务器集群,这些都是运维工程师需要关注的事情。从这个意义上来说,运维工程师的重要性可见一般了。

    当然了对于运维这方面需要掌握的知识很多,我会在对内核有一定的研究后才会去深入研究。

二、利用Linux开发应用层软件

  通俗意义上来说,利用Linux开发应用层的软件和windows上面开发应用软件没有什么不同。可能,在windows上面使用得比较多的就是mfc、gdi、win32这些接口,而在嵌入式上面使用的就比较多种多样了,什么qt、minigui、gtk都是可以用来进行开发的。当然,上面说的都是界面程序,很多公司的Linux程序是没有界面的,比如说游戏公司的Linux工程师。相比较而言,他们看中的更多的是Linux的稳定性,所以在Linux上开发的更多的都是服务器端程序。很多人都有一个误解,认为操作系统就一定比应用软件高级,其实不然。在我看来,office、webkit、samba、mplayer这些软件的代码都是在百万行以上,本身的结构也是相当复杂的。说到应用开发,网上有几本书,分别是《Linux程序设计》、《unix环境高级编程》、《unix网络编程》,对我们都很有借鉴意义。诚然有些书是基于unix系统的,但是基本的编程接口都是差不多的,相应的代码在Linux跑绝对没问题。

三、利用Linux开发驱动

  和其他os系统开发驱动的工作一样,Linux驱动开发也有自己的一整套流程。要想真正地做好驱动,一般来说你需要知道芯片的寄存器特性、电气原理图、总线标准,当然熟悉信号测试,通晓定时器、互斥工具、回调机制、位运算、中断机制、芯片设置、信号时序、地址分配,这些也是少不了的。更极端一点,如果本身创业的公司比较小,驱动开发工程师有的时候还需要自己测试信号、调试boot、焊接芯片,这些都是可能的。所以说,对于真正的芯片企业来说,无论是美资、日资、台资企业来说,驱动开发工程师的收入都是非常可观的。特别是现在有了android的推波助澜,驱动开发工程师的薪酬更是水涨船高。希望在软件上有所突破的硬件工程师或者是希望对系统本身进行更多了解的软件工程师,都可以将此作为自己长期发展的一个方向。关于这方面的书很多,《Linux kernel development》无疑是人气最旺的一本,但是我想说的是有一本国内朋友写的书也相当不错,那就是宋宝华的《Linux设备驱动开发详解》,质量也相当不错,朋友们有时间也可以关注一下。

  Linux驱动其实并不复杂,我们要做的就是在Linux统一的驱动框架下实现对外设的统一管理。很多的代码架构都是现成的,所以我们只要做好模仿、学习、测试和验证就可以了。比较简单的代码就是下面的这一段

点击(此处)折叠或打开

  1. /*hello.c*/
  2. #include <linux/init.h>
  3. #include <linux/module.h>

  4. MODULE_LICENSE("GPL");
  5. MODULE_AUTHOR("butbueatiful");
  6. MODULE_DESCRIPTION("This is just a hello module!\n");

  7. static int __init hello_init(void)
  8. {
  9.     printk("Hello, init\n");
  10.     return 0;
  11. }

  12. static void __exit hello_exit(void)
  13. {
  14.     printk("Hello, exit\n");
  15. }

  16. module_init(hello_init);
  17. module_exit(hello_exit);
  加载模块就是输入insmod hello.ko,卸载模块就是rmmod hello.ko。在这过程中,我们通过 dmesg 命令可以看到相应的打印内容。当然,朋友们可以一直往里面加代码,一步步调试,一步步学习,只要坚持和总结,都是可以学习好Linux的驱动代码的。

点击(此处)折叠或打开

  1. #Makefile
  2. ifneq ($(KERNELRELEASE),)
  3. obj-m := hello.o

  4. else
  5. KVER := `uname -r`
  6. KDIR := /lib/modules/$(KVER)/build
  7. all:
  8.     $(MAKE) -C $(KDIR) M=$(PWD) modules
  9. clean:
  10.     rm -rf *.o *mod.* *.ko* *.order *.symvers
  11. endif
四、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的流程。

推荐书籍:《linux内核设计与实现》、《深入理解LINUX内核》
阅读(820) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~