如何编写Linux设备驱动程序

发表于:2011-1-12 10:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:落落    来源:51Testing软件测试网采编

  1. #include <stdio.h>   
  2. #include <sys/types.h>   
  3. #include <sys/stat.h>   
  4. #include <fcntl.h>   
  5.  
  6. main()   
  7. {   
  8. int testdev;   
  9. int i;   
  10. char buf[10];   
  11.  
  12. testdev = open("/dev/test",O_RDWR);   
  13.  
  14. if ( testdev == -1 )   
  15. {   
  16. printf("Cann't open file \n");   
  17. exit(0);   
  18. }   
  19.  
  20. read(testdev,buf,10);   
  21.  
  22. for (i = 0; i < 10;i++)   
  23. printf("%d\n",buf[i]);   
  24.  
  25. close(testdev);   
  26. }

  编译运行,看看是不是打印出全1 ?

  以上只是一个简单的演示。真正实用的驱动程序要复杂的多,要处理如中断,DMA,I/O port等问题。这些才是真正的难点。请看下节,实际情况的处理。

  如何编写Linux操作系统下的设备驱动程序

  三、设备驱动程序中的一些具体问题

  1. I/O Port.

  和硬件打交道离不开I/O Port,老的ISA设备经常是占用实际的I/O端口,在linux下,操作系统没有对I/O口屏蔽,也就是说,任何驱动程序都可对任意的I/O口操作,这样就很容易引起混乱。每个驱动程序应该自己避免误用端口。

  有两个重要的kernel函数可以保证驱动程序做到这一点。

  1)check_region(int io_port, int off_set)

  这个函数察看系统的I/O表,看是否有别的驱动程序占用某一段I/O口。

  参数1:io端口的基地址,

  参数2:io端口占用的范围。

  返回值:0 没有占用, 非0,已经被占用。

  2)request_region(int io_port, int off_set,char *devname)

  如果这段I/O端口没有被占用,在我们的驱动程序中就可以使用它。在使用之前,必须向系统登记,以防止被其他程序占用。登记后,在/proc/ioports文件中可以看到你登记的io口。

  参数1:io端口的基地址。

  参数2:io端口占用的范围。

  参数3:使用这段io地址的设备名。

  在对I/O口登记后,就可以放心地用inb(), outb()之类的函来访问了。

  在一些pci设备中,I/O端口被映射到一段内存中去,要访问这些端口就相当于访问一段内存。经常性的,我们要获得一块内存的物理地址。在dos环境下,(之所以不说是dos操作系统是因为我认为DOS根本就不是一个操作系统,它实在是太简单,太不安全了)只要用段:偏移就可以了。在window95中,95ddk提供了一个vmm 调用 _MapLinearToPhys,用以把线性地址转化为物理地址。但在Linux中是怎样做的呢?

54/5<12345>
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • Mopig
    2011-1-12 15:18:31

    大幅度

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号