本文系转载,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者: 宋宝华

来源: 微信公众号linux阅码场(id: linuxdev)


前言

《设计模式》这本经典的书里面定义了20多种设计模式,虽然都是面向对象的,似乎需要C++、Java这样的语言才能实现,但是根据笔者前面反复强调的,Linux内核虽然是用C语言和汇编语言写成,但是其实也到处充满了面向对象的设计。面向对象更多的是一种思想,而不是一个语言。我们可以用C语言实现极大的OO,Linux内核到处都有OO。

模版方法

比如,在Linux的设备驱动框架中,就用了一种非常经典简单的设计模式——模板方法(Template Method),当然还有一些其他的设计模式。而设计模式牛逼的地方在于,高手往往不经意之间已经用到了设计模式,甚至自己都不知道。如果高手没有系统地学习过设计模式,这其实不见得是一个问题。这并不意味着它不懂设计模式,只是他自己都不知道自己用到了哪个模式。而设计模式学习的终极目的,当然也是忘记设计模式,这个跟练独孤九剑没什么区别,到最后其实是无招胜有招。

模板方法这个模式,强调定义一个基类,这个基类实现了通用的流程和算法。比如做一件事情需要经过step1()、step2()、step3()。那么我们定义一个基类:

而其中的step1()、step2()、step3()、step4()具体如何实现则是因人而异,所以我们从baseClass类里面,继承出来的类里面,实现step1()、step2()、step3()这样的代码,override掉baseClass里面的函数。

这样的设计让外部不关心derivedClass,因为流程和接口都是在基类的。而基类实现的doSomething()成员函数,是对外的接口。这个UML关系是非常简单的:

驱动案例

在Linux设备驱动里面,大量存在类似的设计,我们以NAND为例子。在drivers/mtd/nand/nand_base.c这层里面,定义了NAND的一些操作流程。

比如写OOB的代码:

它这个里面要走cmdfunc()、write_buf()、cmdfunc()、waitfunc()这些步骤,这些步骤,不管是全世界哪个NAND的硬件,都是一样的通用的,但是具体的不同的NAND硬件控制器,实现这些步骤中涉及到的cmdfunc()等函数的实现方法却因人而异。

譬如freescale的版本fsl_elbc_nand.c就是:

nand_base.c这个C文件是NAND的中间层,它非常类似我们前面说的实现baseClass这一层的代码,nand_write_oob_std函数类似baseClass :: doSomething。而Linux驱动中定义的nand_chip的各个不同的NAND控制器,对nand_chip这个结构体中成员函数cmdfunc()、write_buf()等的实现则是各异的,类似derivedClass里面override掉step1()、step2()。nand_chip定义在include/linux/mtd/nand.h:

这样的设计,好处是非常明显的。特定的硬件只用管与自身操作相关的事情,而通用的流程,都由nand_base搞定,最大程度上减小了具体实例的代码量,也最大程度上复用了中间层的代码。

这样的例子无处不在,比如我们在LCD的中间层:

后语

本文后语不搭前言,请见谅。最近有很多童鞋询问笔者,做Linux驱动有没有前途?笔者明确地告诉大家:根本没有前途!但是前途是自己赚的,这依赖你从驱动进去,但是从更大的视角出来:

  1. 通过做驱动理解很多OO的架构设计思想,升华自己高内聚和低耦合的理解,把自己变成一个更高level的software engineer;

  2. 通过做驱动,进一步理解Linux本身的进程、内存、IO等知识,升华对软件系统和性能分析的理解,把自己变成一个更高level的技术expert。

如果做了5年驱动,进入的时候是调试寄存器搞示波器,出来的时候还是调寄存器搞示波器,那自然是完全没有什么前途的!

有没有前途,这个事情,完全是因人而异的。前途是无所谓有,无所谓无的。你如果有抽象、衍生的能力和不断学习总结的精神,无论是做驱动还是不做驱动,都会是很有前途的事情。反之,做什么基本都没前途。

更多精彩更新中……欢迎关注微信公众号:linux阅码场(id: linuxdev)

宋宝华:Linux设备驱动框架里的设计模式之——模板方法(Template Method)的更多相关文章

  1. Linux设备驱动框架设计

    引子 Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码.能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Li ...

  2. Linux设备驱动中的软件架构思想

    目录 更新记录 一.Linux驱动的软件架构 1.1 出发点 1.2 分离思想 1.3 分层思想 二.platform设备驱动 2.1 platform设备 2.2 platform驱动 2.3 pl ...

  3. 宋宝华: 关于Linux进程优先级数字混乱的彻底澄清

    宋宝华: 关于Linux进程优先级数字混乱的彻底澄清 原创: 宋宝华 Linux阅码场 9月20日 https://mp.weixin.qq.com/s/44Gamu17Vkl77OGV2KkRmQ ...

  4. 一步步理解linux字符设备驱动框架(转)

    /* *本文版权归于凌阳教育.如转载请注明 *原作者和原文链接 http://blog.csdn.net/edudriver/article/details/18354313* *特此说明并保留对其追 ...

  5. 【转】Linux设备驱动--块设备(一)之概念和框架

    原文地址:Linux设备驱动--块设备(一)之概念和框架 基本概念   块设备(blockdevice) --- 是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时 ...

  6. linux驱动开发( 五) 字符设备驱动框架的填充file_operations结构体中的操作函数(read write llseek unlocked_ioctl)

    例子就直接使用宋宝华的书上例子. /* * a simple char device driver: globalmem without mutex * * Copyright (C) 2014 Ba ...

  7. 宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...

  8. 宋宝华:关于ARM Linux原子操作的实现

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 竞态无所不在 首先我们要理解竞态(ra ...

  9. Linux内核的LED设备驱动框架【转】

    /************************************************************************************ *本文为个人学习记录,如有错 ...

随机推荐

  1. [51nod1670] 打怪兽

    lyk在玩一个叫做“打怪兽”的游戏.游戏的规则是这样的.lyk一开始会有一个初始的能量值.每次遇到一个怪兽,若lyk的能量值>=怪兽的能量值,那么怪兽将会被打败,lyk的能量值增加1,否则lyk ...

  2. [POJ2248] Addition Chains 迭代加深搜索

    Addition Chains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5454   Accepted: 2923   ...

  3. 关于git提交

    16年申请注册的git账号,除了需要找一些有用的demo时会逛一下,其实一直没拿起来真实用过. 好了,说一下今天下午呕心沥血弄出来的东西,其实就是简单的用git小黑窗口推文件夹上去,本人较笨,会按照我 ...

  4. Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析

    Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...

  5. 如何使用代理IP进行数据抓取,PHP爬虫抓取亚马逊商品数据

    什么是代理?什么情况下会用到代理IP? 代理服务器(Proxy Server),其功能就是代用户去取得网络信息,然后返回给用户.形象的说:它是网络信息的中转站.通过代理IP访问目标站,可以隐藏用户的真 ...

  6. 远程控制服务(SSH)之Linux环境下客户端与服务端的远程连接

    本篇blog将讲述sshd服务提供的两种安全验证的方法,并且通过这两种方法进行两台Linux虚拟机之间的远程登陆. 准备工作: (1)     准备两台安装有Linux系统的虚拟机,虚拟机软件采用VM ...

  7. Eureka -- 浅谈Eureka

    目录: 一:Eureka介绍 二:Eureka架构图 三:Eureka组件 四:Eureka作用 五:Eureka和Zookeeper对比 什么是Eureka 引入SpringCloud中文文档介绍 ...

  8. 实现基于netty的web框架,了解一下

    上一篇写了,基于netty实现的rpc的微框架,其中详细介绍netty的原理及组件,这篇就不过多介绍 这篇实现基于netty的web框架,你说netty强不强,文中有不对的地方,欢迎大牛指正 先普及几 ...

  9. beanfactory中单例bean的初始化过程(一)

    Date 10.06 pm Point 完成beanfactory中单例bean的初始化 beanFactory.preInstantiateSingletons() 拿到所有的bean定义信息(在 ...

  10. 计算机基础之编程 + 基本组成 + 组成补充 + 操作系统(day01整理)

    目录 一 计算机基础之编程 (一) 什么是编程语言 (二) 什么是编程 (三) 为什么要编程 二 计算机的基本组成 (一) CPU(大脑) (1) 控制器 (2) 运算器 (二) 存储器(记忆) (1 ...