块设备

1.块设备(磁盘、SD卡)

2.网络设备

3.字符设备

这三种设备驱动程序。

 

块设备与字符设备区别:

1.读取数据单位不同,块设备固定。

2.块设备随机访问、字符设备顺序访问。

VFS:虚拟文件系统。是对各种具体文件系统的一种封装,为用户程序访问文件提供统一的接口。

Disk cache:当用户发起文件访问请求的时候,首先到Disk Cache中寻找文件是否被缓存,如果是,则直接从cache中读取。如果不在,就必须到具体文件系统中读取数据。

  Mapping layer:1、首先确定文件系统的block size,然后计算所请求的数据包含多少个blk。

2.调用具体文件系统的函数访问文件的inode结构,确定所请求的数据在磁盘上的地址。

Generic Block layer:linux内核把块设备看做由若干个扇区组成的数据空间,上层的读写请求在通用块层被构造成一个或多个bio结构。

I/O调度算法

 

设备描述:linux内核使用struct gendisk (定义于<linux/genhd.h>)来描述块设备

二、注册设备:

使用add_disk函数向内核注册块设备驱动

三、设备操作:块设备使用一个结构体:struct block_device_operations:

四、I/O请求:

在linux内核中、使用struct request来表示等待处理的块设备I/O请求。

请求队列:

简单的讲,请求队列就是I/O请求request所形成的队列,在linux内核中struct request_queue描述。

初始化请求队列:

 

 

编写好程序后,先编译:make

加载驱动:insmod simple-blk.ko

检查驱动:在dev下查看: ls  /dev/simp_blkdev -l

块设备驱动测试:

1.insmod simple-blk.ko

2.ls /dev/simp_blkdev

3.mkfs.ext3 /dev/simp_blkdev   //格式化

4.mkdir -p  /mnt/blk

5.mount   /dev/simp_blkdev  /mnt/blk/  //挂载

6.cp /etc/init.d/*  /mnt/blk/  //写数据

7.ls /mnt/blk

8. umount /mnt/blk

9. ls  /mnt/blk

 

第二种方法:

 

BIO:1个struct bio代表1次块设备I/O请求,IO调度器可将连续的bio合并成1个请求 struct request。

不用kernel提供的_make_request()(包含I/O调度算法),自己写请求队列并绑定函数方法:

static int __init simp_blkdev_init(void)
{
        int ret;

        simp_blkdev_queue = blk_alloc_queue(GFP_KERNEL);
        if (!simp_blkdev_queue) {
                ret = -ENOMEM;
                goto err_alloc_queue;
        }
        blk_queue_make_request(simp_blkdev_queue, simp_blkdev_make_request);

        simp_blkdev_disk = alloc_disk(1);
        if (!simp_blkdev_disk) {
                ret = -ENOMEM;
                goto err_alloc_disk;
        }

        strcpy(simp_blkdev_disk->disk_name, SIMP_BLKDEV_DISKNAME);
        simp_blkdev_disk->major = SIMP_BLKDEV_DEVICEMAJOR;
        simp_blkdev_disk->first_minor = 0;
        simp_blkdev_disk->fops = &simp_blkdev_fops;
        simp_blkdev_disk->queue = simp_blkdev_queue;
        set_capacity(simp_blkdev_disk, SIMP_BLKDEV_BYTES>>9);
        add_disk(simp_blkdev_disk);

        return 0;

err_alloc_disk:
        blk_cleanup_queue(simp_blkdev_queue);
err_alloc_queue:
        return ret;
}

 

转载于:https://www.cnblogs.com/Caden-liu8888/p/7726688.html

资源下载链接为: https://pan.quark.cn/s/ddc62c5d4a5d Windows Mobile 是微软在 0200 年代至 2010 年代初推出的移动操作系统,曾广泛应用于智能手机和平板电脑。开发者可以借助各种库和框架为其开发功能丰富的应用,其中 “32feet.NET” 是一个开源的 .NET 库,专为 .NET Framework 和 .NET Compact Framework 提供蓝牙开发支持。它包含多个命名空间,例如 InTheHand.Devices.Bluetooth、InTheHand.Net.Personal 和 InTheHand.Phone.Bluetooth,用于实现蓝牙设备交互功能。 InTheHand.Devices.Bluetooth 命名空间用于执行基础蓝牙操作,比如扫描附近设备、建立连接以及发现蓝牙服务等。InTheHand.Net.Personal 提供了更高级的功能,例如创建个人区域网络(PAN)、文件传输和串行端口模拟,便于开发者开发跨设备的数据共享应用。而 InTheHand.Phone.Bluetooth 主要针对 Windows Phone 平台,支持蓝牙配对、消息收发和蓝牙耳机控制等功能,不过由于 Windows Mobile 已停止更新,该命名空间更多适用于旧设备或项目。 压缩包中的文件列表看似是维基页面的渲染文件,可能是关于 32feet.NET 的使用教程、API 参考或示例代码。文件名如 13632.html、563803.html 等可能是页面 ID,涵盖蓝牙设备搜索、连接和数据传输等不同主题。 使用 32feet.NET 进行蓝牙开发时,开发者需要注意以下几点:首先,确保开发环境已安装 .NET Framework 或 .NET Compact Framework,以及 32feet.NET
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值