当前位置: 首页 > wzjs >正文

怎么用ps做简单网站首页网站营销方法

怎么用ps做简单网站首页,网站营销方法,网站开发工程师 下载,wordpress 引用来源Linux驱动-块设备驱动 一,块设备驱动简介二,无请求队列情况(EMMC和SD卡等)三,请求队列情况(磁盘等带有I/O调度的设备)四,两者在驱动上区别 一,块设备驱动简介 块设备驱动…

Linux驱动-块设备驱动

  • 一,块设备驱动简介
  • 二,无请求队列情况(EMMC和SD卡等)
  • 三,请求队列情况(磁盘等带有I/O调度的设备)
  • 四,两者在驱动上区别

一,块设备驱动简介

  块设备驱动的关键结构在于:结构体gendisk,表示一个块设备,包含设备号,分区,操作函数集,相对于字符设备驱动区别在于:
在这里插入图片描述
  有I/O调度的块设备:(I/O调度意思就是在应用层对块设备进行操作时候,这个调度模块会把对块设备的操作转化为请求request,然后放到请求队列当中,因此在处理时候,主要是对请求队列中的bio请求进行操作),请求队列模式:通过 blk_init_queue 初始化请求队列,由调度器管理 request,再分发给驱动,如磁盘设备。
在这里插入图片描述

  没有I/O调度的设备:EMMC以及SD卡,当其使用时候,相当于直接对结构体bio进行操作,此时的bio不在request结构体中了,绕过传统的 I/O 调度器,每个 bio 直接传递给驱动处理,不再合并为 request,随机进行访问,不需要控制。

  对于块设备的操作,相当于存储设备操作,那么有三个要清除的地方:①物理存储器的地址在哪②内存中的地址在哪③存储长度是多少。由bio来控制,其中bi_sector即物理设备,比如EMMC,bio_vec即内存,比如RAM。
在这里插入图片描述

二,无请求队列情况(EMMC和SD卡等)

  其实这样操作感觉还是不太对劲,相当于在RAM开辟一段空间,来模拟EMMC或者SD卡,但EMMC和SD卡操作时候是和内存RAM进行交互,现在就变成了开辟的RAM和RAM进行操作…主要流程包括①块设备注册(因为是在RAM中开辟的空间,因此在disk_init中对2MB空间进行开辟,真实情况下,连接EMMC是不用开辟这段空间的,这个是模拟EMMC)②申请gendisk③设置自旋锁(无请求队列的起始用不到这个)④初始化请求队列⑤将请求队列和回调函数ram_queue_process关联起来⑥对gendisk中的数据初始化⑦设置gendisk块大小,并将其添加到内核中。

/*4.8日 块设备驱动*/
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of_gpio.h>
#include <linux/semaphore.h>
#include <linux/timer.h>
#include <linux/i2c.h>
#include <linux/genhd.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#define RAM_BLOCK_NAME  "mydisk11"
#define RAM_BLOCK_BYTE_SIZE  2*1024*1024   //2MB 字节数
#define RAM_BLOCK_SIZE  2*1024*1024/512   //2MB 即多少个块struct disk_device{int  major;//块设备号struct gendisk  *ram_gendisk;spinlock_t my_spinlock;struct request_queue *queue; //请求队列unsigned char *ram_buf;
};
struct disk_device ram;static int ram_open(struct block_device *dev, fmode_t mode)
{printk("ram_open \r\n");return 0;
}
static void ram_release(struct gendisk *disk, fmode_t mode)
{printk("ram_release \r\n");
}
int ram_getgeo(struct block_device *dev,struct hd_geometry *geo)
{return 0;
}
static struct block_device_operations ram_ops ={.owner = THIS_MODULE,.open = ram_open,.release = ram_release,.getgeo = ram_getgeo,
};static void  ram_queue_process(struct request_queue *q,struct bio *bio)
{int offset = 0;unsigned long len = 0;//长度struct bio_vec ram_vec;//表示ram中的内存地址struct bvec_iter sd_emmc_iter;//连接的设备,比如emmc sd卡offset = (bio->bi_iter.bi_sector)*512; //磁盘的偏移地址bio_for_each_segment(ram_vec,bio,sd_emmc_iter)//遍历每一个bio{char *ptr = page_address(ram_vec.bv_page)+ram_vec.bv_offset;len = ram_vec.bv_len;if(bio_data_dir(bio)==READ){memcpy(ptr,ram.ram_buf+offset,len);}else if(bio_data_dir(bio)==WRITE){memcpy(ram.ram_buf+offset,ptr,len);}offset = offset + len;}set_bit(BIO_UPTODATE,&bio->bi_flags);bio_endio(bio,0);}    
static int __init disk_init(void)
{int ret=0;/*1.申请ram内存*/ram.ram_buf = kzalloc(RAM_BLOCK_BYTE_SIZE,GFP_KERNEL);//申请字节大小if(ram.ram_buf ==NULL){printk("kzalloc  error \r\n");ret = -1;goto kzalloc_ram_error;}printk("before ram.major = %d \r\n",ram.major);/*2.注册块设备*/ram.major = register_blkdev(0,RAM_BLOCK_NAME);if(ram.major < 0){printk("register error \r\n");ret = -1;goto register_blkdev_error;}/*3.申请gendisk*/ram.ram_gendisk = alloc_disk(3);if(ram.ram_gendisk == NULL){ret = -1;goto RAM_BLOCK_SIZE_error;}/*4.自旋锁*/spin_lock_init(&ram.my_spinlock);/*5.初始化请求队列*/ram.queue = blk_alloc_queue(GFP_KERNEL);if(ram.queue == NULL){ret = -1;goto blk_queue_error;}/*制造设置请求函数*/blk_queue_make_request(ram.queue,ram_queue_process);/*6.给gendisk内值,初始化*/ram.ram_gendisk->major = ram.major; //主设备号ram.ram_gendisk->first_minor = 0;//次设备号开始ram.ram_gendisk->fops = &ram_ops;//操作函数ram.ram_gendisk->private_data = &ram; //私有数据ram.ram_gendisk->queue = ram.queue;//请求队列//memcpy(&ram.ram_gendisk->disk_name,&RAM_BLOCK_NAME,sizeof(RAM_BLOCK_NAME));//sprintf(ram.ram_gendisk->disk_name, RAM_BLOCK_NAME);snprintf(ram.ram_gendisk->disk_name, 32, "%s",RAM_BLOCK_NAME);set_capacity(ram.ram_gendisk,RAM_BLOCK_SIZE);//设置大小,即多少块add_disk(ram.ram_gendisk);//添加gendisk到内核printk("major = %d \r\n",ram.major);return ret;
blk_queue_error:   del_gendisk(ram.ram_gendisk);
RAM_BLOCK_SIZE_error:unregister_blkdev(ram.major,RAM_BLOCK_NAME);
register_blkdev_error:kfree(ram.ram_buf);
kzalloc_ram_error:return ret;}
void __exit disk_exit(void)
{/*对gendisk进行操作*/del_gendisk(ram.ram_gendisk);//put_gendisk(ram.ram_gendisk);/*对ram.queue进行操作*/blk_cleanup_queue(ram.queue);/*对块设备进行操作*/unregister_blkdev(ram.major,RAM_BLOCK_NAME);/*释放开辟的空间*/kfree(ram.ram_buf);}module_init(disk_init);
module_exit(disk_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("WYT");

三,请求队列情况(磁盘等带有I/O调度的设备)

/*4.8日 块设备驱动*/
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of_gpio.h>
#include <linux/semaphore.h>
#include <linux/timer.h>
#include <linux/i2c.h>
#include <linux/genhd.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#define RAM_BLOCK_NAME  "mydisk11"
#define RAM_BLOCK_BYTE_SIZE  2*1024*1024   //2MB 字节数
#define RAM_BLOCK_SIZE  2*1024*1024/512   //2MB 即多少个块struct disk_device{int  major;//块设备号struct gendisk  *ram_gendisk;spinlock_t my_spinlock;struct request_queue *queue; //请求队列unsigned char *ram_buf;
};
struct disk_device ram;static int ram_open(struct block_device *dev, fmode_t mode)
{printk("ram_open \r\n");return 0;
}
static void ram_release(struct gendisk *disk, fmode_t mode)
{printk("ram_release \r\n");
}
int ram_getgeo(struct block_device *dev,struct hd_geometry *geo)
{return 0;
}
static struct block_device_operations ram_ops ={.owner = THIS_MODULE,.open = ram_open,.release = ram_release,.getgeo = ram_getgeo,
};void  ram_queue_process(struct request_queue *q)
{int err = 0;unsigned long start = 0;unsigned long len = 0;void *buff = NULL;struct request *req;req = blk_fetch_request(q);//获取第一个请求,并把它移出while(req != NULL){/*进行数据操作*/start = blk_rq_pos(req)*512;//起始地址len = blk_rq_cur_bytes(req);//大小,字节单位buff = bio_data(req->bio);//目的让bio中的数据和buff指针执指向一个位置if(rq_data_dir(req) == READ)//读操作{memcpy(buff,ram.ram_buf+start,len);//正常用磁盘的情况,//应该是将ram.ram.ram_buf+start用bio中的物理存储地址}else if(rq_data_dir(req) == WRITE){memcpy(ram.ram_buf+start,buff,len);}/*判断是不是最后一个*/if(!__blk_end_request_cur(req,err))//完成当前部分请求,返回0,否则返回其他数值{req = blk_fetch_request(q);//if判断当前请求完成后,会继续申请下一个请求,直到申请到NULL}}
}    
static int __init disk_init(void)
{int ret=0;/*1.申请ram内存*/ram.ram_buf = kzalloc(RAM_BLOCK_BYTE_SIZE,GFP_KERNEL);//申请字节大小if(ram.ram_buf ==NULL){printk("kzalloc  error \r\n");ret = -1;goto kzalloc_ram_error;}printk("before ram.major = %d \r\n",ram.major);/*2.注册块设备*/ram.major = register_blkdev(0,RAM_BLOCK_NAME);if(ram.major < 0){printk("register error \r\n");ret = -1;goto register_blkdev_error;}/*3.申请gendisk*/ram.ram_gendisk = alloc_disk(3);if(ram.ram_gendisk == NULL){ret = -1;goto RAM_BLOCK_SIZE_error;}/*4.自旋锁*/spin_lock_init(&ram.my_spinlock);/*5.初始化请求队列*/ram.queue = blk_init_queue(ram_queue_process,&ram.my_spinlock);if(ram.queue == NULL){ret = -1;goto blk_queue_error;}/*6.给gendisk内值,初始化*/ram.ram_gendisk->major = ram.major; //主设备号ram.ram_gendisk->first_minor = 0;//次设备号开始ram.ram_gendisk->fops = &ram_ops;//操作函数ram.ram_gendisk->private_data = &ram; //私有数据ram.ram_gendisk->queue = ram.queue;//请求队列//memcpy(&ram.ram_gendisk->disk_name,&RAM_BLOCK_NAME,sizeof(RAM_BLOCK_NAME));//sprintf(ram.ram_gendisk->disk_name, RAM_BLOCK_NAME);snprintf(ram.ram_gendisk->disk_name, 32, "%s",RAM_BLOCK_NAME);set_capacity(ram.ram_gendisk,RAM_BLOCK_SIZE);//设置大小,即多少块add_disk(ram.ram_gendisk);//添加gendisk到内核printk("major = %d \r\n",ram.major);return ret;
blk_queue_error:   del_gendisk(ram.ram_gendisk);
RAM_BLOCK_SIZE_error:unregister_blkdev(ram.major,RAM_BLOCK_NAME);
register_blkdev_error:kfree(ram.ram_buf);
kzalloc_ram_error:return ret;}
void __exit disk_exit(void)
{/*对gendisk进行操作*/del_gendisk(ram.ram_gendisk);//put_gendisk(ram.ram_gendisk);/*对ram.queue进行操作*/blk_cleanup_queue(ram.queue);/*对块设备进行操作*/unregister_blkdev(ram.major,RAM_BLOCK_NAME);/*释放开辟的空间*/kfree(ram.ram_buf);}module_init(disk_init);
module_exit(disk_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("WYT");

四,两者在驱动上区别

  无I/O调度设备,虽然在申请了请求队列(blk_alloc_queue),但是没有用到,最终调用的是它的ram_queue_process-1,这个函数主要处理bio中的数据。有I/O调度的设备,在请求队列申请时候,调用函数ram_queue_process-2,这个函数在处理时候,是对请求队列中request中的bio进行操作。

	/*无I/O调度(不使用请求队列)*/ram.queue = blk_alloc_queue(GFP_KERNEL);/*制造设置请求函数*/blk_queue_make_request(ram.queue,ram_queue_process-1);/*有I/O调度(使用请求队列)*/ram.queue = blk_init_queue(ram_queue_process-2,&ram.my_spinlock);

文章转载自:

http://NzfOxDRW.tdcqL.cn
http://vJRjUhYi.tdcqL.cn
http://KQrBqqT7.tdcqL.cn
http://solE4s4p.tdcqL.cn
http://vTZ6GDFF.tdcqL.cn
http://aTe5dIUc.tdcqL.cn
http://l7fNwB2o.tdcqL.cn
http://4W8dj1En.tdcqL.cn
http://JlVFmyjY.tdcqL.cn
http://YSym5s1t.tdcqL.cn
http://ZRbEmhpG.tdcqL.cn
http://JMqKheBa.tdcqL.cn
http://oHhmTtv0.tdcqL.cn
http://IBqPHAq5.tdcqL.cn
http://nYFYkG4Z.tdcqL.cn
http://XamgDrfo.tdcqL.cn
http://JwqRCzKC.tdcqL.cn
http://Pto4RB96.tdcqL.cn
http://Uzp19dih.tdcqL.cn
http://TvCpFkaH.tdcqL.cn
http://PG8mLakw.tdcqL.cn
http://PWp8jVlt.tdcqL.cn
http://S4hwPiY3.tdcqL.cn
http://rtWffS53.tdcqL.cn
http://biYroQZq.tdcqL.cn
http://CdhUkIk9.tdcqL.cn
http://hShXVy5b.tdcqL.cn
http://ail2xXmT.tdcqL.cn
http://O6viEaUN.tdcqL.cn
http://lXlwIoDK.tdcqL.cn
http://www.dtcms.com/wzjs/738866.html

相关文章:

  • 有没有人一起做网站天元建设集团有限公司项目
  • 开发商延期交房怎么办广州seo服务
  • 浙江建筑信息网站多用户网店系统
  • 可以用足球做的游戏视频网站wordpress后台进不去
  • 开网站建设工作是如何十五种网络营销工具
  • 传奇手机版网站淘宝网店代运营正规公司
  • 购物网站建设要求网页版哔哩哔哩
  • 衡水网站建设衡水网站建设和网页设计的关系
  • 关键词查询的分析网站wordpress主题如何汉化
  • 大型商家进驻网站开发周口网站建设 网站制作 网络推广
  • 网站设计 素材两学一做登录网站
  • 创建网站快捷方式到桌面文创产品设计分析
  • 深圳福田最大网站公司网站套餐可以分摊吗吗
  • 网站seo在线诊断网站快照前显示中文怎么做的
  • 网站首页二级下拉框怎么做百度联盟怎么做自己的网站
  • 欧派全屋定制联系电话seo比较好的优化
  • 网站导航作用无锡网站建设专注千客云网络
  • 零用贷网站如何做wordpress添加新的模板
  • 辽宁网站建设招标自己如何建立网站
  • 企业网站登录入口官网wordpress memcache插件
  • 南宁网站建设索q.479185700国内优秀企业网站设计欣赏
  • 网站淘宝客怎么做个人网页设计作品下载
  • 山西省建设招聘信息网站设计公司网页制作
  • 清华大学学生工作做网站政务服务网站建设整改报告
  • 慈溪高端网站设计wordpress php7不兼容
  • 维护网站的一般方法google浏览器网页版
  • 网站不被收录了网站后台软件可以自己做吗
  • 免费的源代码分享有哪些网站dede分类信息网站
  • 蚌埠网站制作公司费用建筑模型网站
  • 济南做网站哪里好win7怎么重新安装wordpress