历史上的今天
今天是:2025年10月13日(星期一)
2022年10月13日 | mini2440 入门块设备驱动(用RAM缓存模拟磁盘)代码记录(内核用的是2.6.32.2)
2022-10-13 来源:csdn
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define RAMBLOCK_SIZE (1024*1024) static struct gendisk *grh_gendisk; static struct request_queue *grh_queue; static DEFINE_SPINLOCK(grh_spin_lock); static int major; static unsigned char *ramblock_buf; //对队列中的请求进行处理的函数 static void grh_do_ramblock_req(struct request_queue *q){ struct request *req; static int read_count=0, write_count=0; unsigned long offset, count; req = blk_fetch_request(q); while (req) { //真正的数据操作 offset = blk_rq_pos(req); //req对应的扇区的偏移量 count = blk_rq_cur_sectors(req); //req对应的数据传输量,以扇区为单位 offset <<= 9; count <<= 9; if(rq_data_dir(req) == READ){ //读操作 printk(KERN_EMERG"read count=%dn", ++read_count); memcpy(req->buffer, ramblock_buf+offset, count); /*从ramdisk把需要搬移的扇区数据移动到req的buffer里面*/ } else{ //写操作 printk(KERN_EMERG"write count=%dn", ++write_count); memcpy(ramblock_buf+offset, req->buffer, count); } if (!__blk_end_request_cur(req, 0)) req = blk_fetch_request(q); } } //获取柱面和扇区信息的函数,用于向分区工具提供参数 static int grh_getgeo(struct block_device *bdev, struct hd_geometry *geo){ geo->heads = 2; //假设2个面 geo->cylinders = 32; //假设32个柱面 geo->sectors = RAMBLOCK_SIZE/512/2/32; //算出扇区个数 return 0; } static struct block_device_operations grh_bdops = { .owner = THIS_MODULE, .getgeo = grh_getgeo, }; static int ram_block_init(void){ //分配gendisk grh_gendisk = alloc_disk(16); //分区个数为16 //设置gendisk grh_queue = blk_init_queue(grh_do_ramblock_req, &grh_spin_lock); //创建操作队列 grh_gendisk->queue = grh_queue; major = register_blkdev(0, "grh_ramblock"); grh_gendisk->major = major; grh_gendisk->first_minor = 0; sprintf(grh_gendisk->disk_name, "ramblock"); grh_gendisk->fops = &grh_bdops; set_capacity(grh_gendisk, RAMBLOCK_SIZE/512); //设置块设备大小为1M ramblock_buf = kzalloc(RAMBLOCK_SIZE, GFP_KERNEL); if(NULL == ramblock_buf){ printk(KERN_EMERG"allocate buffer error!n"); } //注册gendisk add_disk(grh_gendisk); return 0; } static void ram_block_exit(void){ unregister_blkdev(major, "grh_ramblock"); del_gendisk(grh_gendisk); put_disk(grh_gendisk); blk_cleanup_queue(grh_queue); kfree(ramblock_buf); return; } module_init(ram_block_init); module_exit(ram_block_exit); MODULE_AUTHOR("GRH"); MODULE_VERSION("1.0"); MODULE_DESCRIPTION("RAM BLOCK DRIVER"); MODULE_LICENSE("GPL");
史海拾趣
|
下面这篇文章相当全面的介绍了各种RAM的基本原理读写及区别. 好像也是从各个地方收集到一起的,不过组织还可以.可惜是PDF格式而且带框的,不知道如何弄下来.如果你对RAM认识还不够的话,强烈推荐你看看. http://www.dz3w.com/info/basic/memory/index ...… 查看全部问答> |
|
德州仪器(TI)全球特殊应用产品部大中国业务策略拓展副总裁 林坤山 林坤山博士以数字信号处理器(DSP)先锋著称,是早期的DSP博士之一,曾于70年代后期在美国新墨西哥与田纳西大学任教。拥有12项专利的林博士,曾在国际会议与期刊杂志上发表超过5 ...… 查看全部问答> |
|
滤波器的发展历程 ---凡是有能力进行信号处理的装置都可以称为滤波器。在近代电信设备和各类控制系统中,滤波器应用极为广泛;在所有的电子部件中,使用最多,技术最为复杂的要算滤波器了。滤波器的优劣直接决定产品的优劣,所以,对 ...… 查看全部问答> |
|
要求如下 1、支持wince6 2、带有电话、gprs、短信模块 3、ARM9 CPU 总的来说就是方便我能用这个开发板进行一款基于wince6平台的手机开发,价格2000以内吧,如果有性价比更好的,价格高一些也可以,谢谢大家了!… 查看全部问答> |
|
本人新人一个。。 以前不做这块的,刚去一个新单位,领导要开发这么一个东西。 主要目的就是通过usb口接的3g或wifi模块同外部设备进行数据传输。 大家有什么方案建议之类的没有? 例程最好了。学习文档之类的也非常感谢。 多 ...… 查看全部问答> |




