linux设备驱动 IO Port

      1. I/O Port

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

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

  1check_region(int io_port, int off_set) 

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

  参数1I/O端口的基地址, 

  参数2I/O端口占用的范围。 

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

  2request_region(int io_port, int off_setchar *devname) 

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

  参数1io端口的基地址。 

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

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

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

在一些pci设备中,I/O端口被映射到一段内存中去,要访问这些端口就相当于访问一段内存。经常性的,我们要获得一块内存的物理地址。

 

  2.内存操作 
  在设备驱动程序中动态开辟内存,不是用malloc,而是kmalloc,或者用get_free_pages直接申请页。释放内存用的是kfree,或free_pages。 请注意,kmalloc等函数返回的是物理地址! 

  注意,kmalloc最大只能开辟128k-1616个字节是被页描述符结构占用了。 

  内存映射的I/O口,寄存器或者是硬件设备的RAM(如显存)一般占用F0000000以上的地址空间。在驱动程序中不能直接访问,要通过kernel函数vremap获得重新映射以后的地址。 

  另外,很多硬件需要一块比较大的连续内存用作DMA传送。这块程序需要一直驻留在内存,不能被交换到文件中去。但是kmalloc最多只能开辟128k的内存。 

  这可以通过牺牲一些系统内存的方法来解决。 

 

http://huxiongwei.spaces.eepw.com.cn/articles/article/item/74756

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值