自己动手写操作系统的心得与总结--设备驱动

http://blog.163.com/jilianglijie@126/blog/static/13605259820123452531507/

  自从知道驱动程序这个词以后,就一直感觉他很是神秘,这个设备驱动到底是什么东西?那么作为程序员该如何编写设备驱动程序?

      以下是我对设备驱动程序的认识:
      (1)设备驱动程序是操作系统代码的一部分,由操作系统将设备驱动程序加载到内存并同一管理;
      (2)设备驱动程序独立于线程(进程的调度)统一由内核的单独的功能来进行调度;
      (3)设备驱动程序是没有经过链接的目标文件(这一点不知道对不对,后面我会讲我自己的观点);
      (4)设备驱动程序代码执行效率是高效的,稳定的;
      我已经将我对驱动程序的认识列了出来,现在分别来解释一下我为什么会这么认为。

设备驱动程序是操作系统代码的一部分,由操作系统将设备驱动程序加载到内存并同一管理
       操作系统的任务是进行各项资源的管理,其中就有硬件的管理以及驱动,因为操作系统中不可能含有所有硬件的驱动程序,因此操作系统必须就有可扩展性,因此就有了设备驱动程序这么一说,在系统启动时由操作系统将机器上安装硬件的驱动程序加载到系统的内核空间中,并建立各种各样的表来进行管理。
设备驱动程序独立于线程(进程的调度)统一由内核的单独的功能来进行调度
       操作系统为每一个驱动程序建立一个内核线程,但是这些内核线程共享内核的地址空间,这些代码拥有最高的特权。这些驱动程序都是在某些特定的情况下被执行,并且执行过程中不能被打断,因此就催生出了一种单独调度内核线程的机制。
设备驱动程序是没有经过链接的目标文件
      驱动程序的格式一直是我心中的疑惑,当后面学习了什么是地址空间和内存空间后我大概明白设备驱动程序是怎么回事了。在windows下我见过两种驱动程序文件一种是后缀名为.sys的一种是.dll的,前一种.sys是windows的驱动程序毋庸置疑,后面这个.dll是windows下的动态链接库文件,动态链接库文件是一种可以被映射到任何地址的文件(希望这样理解没有错)根据这个我就联想到驱动程序的目标代码地址很可能是浮动的(可调整的,可重定位的),这样的话就位驱动程序的编写提供了便利,但是在驱动程序执行时,并不是将驱动程序文件加载到内存中就可以执行了,而是需要操作系统对驱动程序中的符号进行重定位,也就是将驱动程序中引用到的外部变量的符号确定下来,这些符号的地址在操作系统启动时由系统完成符号表的构建与维护。可能这时还有疑问,为什么驱动程序要引用外部变量,这些外部变量是来自于哪里的?首先驱动程序是操作系统的一部分,在第一条就讲过了,因此驱动程序需要系统中其他的数据来进行工作,而不是独立的盲目的使用自己的数据。其次这些引用的变量来自于操作系统的核心,原因同上。当驱动程序中的所有符号都被重定位(解析)成功后,操作系统将调用该驱动程序中的初始化函数(如何知道这个初始化函数,并且是怎么调用的?)完成驱动的初始化。操作系统是如何知道这个函数的?这个看前面的符号表联想一下就知道了,这个初始化函数肯定是一个约定的名字,操作系统通过驱动程序的符号表找到该函数的地址,并通过函数指针的形式调用该函数。
设备驱动程序代码执行效率是高效的,稳定的
      每一个驱动程序对应一个或多个设备,当用户需要使用这些设备的时候就需要通过驱动程序来和这些设备进行沟通,当设备发出中断请求,并且中断可被接受的情况下,系统将会把这个中断请求路由到该设备对应的驱动程序,由该驱动程序完成对设备的操作。因为现在的系统大部分都是分时系统,即每个进程都只能在自己的时间片里执行,但前面也已经说过了,驱动程序不同于其他的进程,他对CPU的占有是不可剥夺的,要使驱动程序不占用CPU只能是由以下情况产生:
(1)设备驱动程序主动放弃对CPU的占有;
2)设备驱动程序完成了设备的I/O操作;
(3)设备驱动程序在等待外设的中断请求,这个时候请求服务的其他进程将被挂起,直到驱动程序完成了I/O;
可以看出驱动程序的重要地位,因为设备驱动程序对CPU的占有是不可剥夺的,因此必须为设备驱动程序提供出口,设备驱动程序的执行效率一定要高,第一条也说过了驱动程序是操作系统的一部分,因此驱动程序的健壮与否关系到系统的稳定性。

明白了上面的内容,如何编写设备驱动程序的问题也就迎刃而解了,首先得有目标操作系统的内核头文件,设备驱动开发的头文件,当然这些头文件中包含了我们写驱动程序的变量的声明,大都是extern datadtype express;这样的形式。可能还会有一些驱动开发的静态库,动态库文件等等。我们写好的代码也只需用编译一遍而不需用链接,然后通过操作系统提供的接口将驱动程序添加到系统中就好了。

       以上就是我对设备驱动成序的以下简单认识,可能有大量的错误,希望看到的人给予指正,不胜感激!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值