中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 操作系统 > Linux > Linux综合
块设备
作者:未知 时间:2005-09-13 22:46 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:块设备
简单的介绍了安装块设备的几个步骤,也算小结吧。

一 。注册模块
  1。注册 register_blkdev(major,name,struct block_device_operation *p);
  2.初始化队列:
    
      多队列  blk_init_queue(request_queue_t *,request_fn);
                blk_dev[major]=sbull_find_queue;
     无队列  blk_queue_make_request(BLK_DEFAULT_QUEUE(major),sbull_make_request);
     单队列  blk_init_queue(BLK_DEFAULT_QUEUE(major),sbull_request);
  3.注册分区设备  register_disk(NULL,MKDEV(major,i),1,&sbull_bdops,sbull_size<<1);
二  。结构
   struct  block_device_operation  sbull_bdops={
           open:                 sbull_open,
           release:              sbull_release,
           ioctl:                sbull_ioctl,
            check_media_change:  sbull_check_change,
            revalidate:          sbull_revalidate,
           }; 
     在linux/blk.h (MAJOR_NR,CURRENT等macro变量);linux/blkdev.h(blk_dev[MAX],blk_size, blksize_size,request_queue_t等结构申明);在drivers/block/ll_rw_blk.c(包含 blk_init_queue等函数的实现);

三 请求处理函数
      sbull_request(request_queue_t *p);
四  支持常用的对快设备操作的命令
      fdisk mount mkfs
     例如  mount 的过程  1。open设备;2。调用request处理方法,传输数据块。

五  可分区设备
     1。在driver/block/genhd.c中的struct gendisk *gendisk_head 为static 所以虽然在linux/genhd.h中申明为extern struct gendisk *gendisk_head ;但在我们的程序中还是出现unresolved symbol ,所以在我们的程序中还得申明一下struct gendisk *gendisk_head 。
    2。申明一个struct gendisk  spull_gendisk 并初始化各成员。
    3。在revalidate函数中重新调用register_disk(struct gendisk *gd,int driver,unsigned minors,struct block_device_operation *ops,long size)注册分区。
   4。模块注册过程和sbull一样。
   5. 中断处理过程,在请求处理函数中启动定时器,然后在定时器函数中end_request(1);
       普通的请求处理函数是在本函数中直接调用end_request(1)的。
       如果驱动程序是中断驱动的,request 函数应该提交一次数据传输并立即返回,而无需调用 end_request。但是,在没有调用 end_request(或其组成部分)之前,不会认为请求已经       完成。因此,在设备告诉驱动程序已完成数据传输时,顶半或底半中断处理程序需要调用 end_request。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有