免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: OstrichFly
打印 上一主题 下一主题

[原创] 写一个块设备驱动 [复制链接]

论坛徽章:
0
241 [报告]
发表于 2012-09-10 16:55 |只看该作者
坚持每一到两周完成lz的一章内容。

试了试第一个实验,替换了两个api,blk_peek_request和blk_end_request,在2.6.32和更高的内核上跑,PC上死机,开发板不会,但不能mkfs。

这个周末认真学习下。

论坛徽章:
0
242 [报告]
发表于 2013-04-01 10:06 |只看该作者
自己对基础知识的了解还是差了些,不能够很快的上手,不过作者写的确实厉害啊,文笔生动形象,很好的学习题材

论坛徽章:
0
243 [报告]
发表于 2013-04-08 13:03 |只看该作者
楼主很强啊,啥时能像楼主这么强就好了。\(^o^)/~

论坛徽章:
0
244 [报告]
发表于 2013-05-06 19:22 |只看该作者
回复 241# iamlbccc

更换了那两个APIs还不够。由于req->buffer指向的仅是request的当前bio的数据内存,而该request下挂的所有bios的数据内存不一定连续。所以最好是挨个的处理request下的bios。附上更新后的simp_blkdev_do_request().

static void simp_blkdev_do_request(struct request_queue *q)
{
        struct request *req;
        while ((req = blk_fetch_request(q)) != NULL) {
                if (((blk_rq_pos(req) << SECTOR_SIZE_SHIFT) + blk_rq_bytes(req))
                        > SIMP_BLKDEV_BYTES) {
                        printk(KERN_ERR SIMP_BLKDEV_DISKNAME
                                ": bad request: block=%llu, count=%u\n",
                                (unsigned long long)blk_rq_pos(req),
                                blk_rq_sectors(req));
                        blk_end_request_cur(req, 0);
                        continue;
                }

                switch (rq_data_dir(req)) {
                case READ:
                        do {
                                memcpy(req->buffer, simp_blkdev_data +
                                        (blk_rq_pos(req) << SECTOR_SIZE_SHIFT),
                                        blk_rq_cur_bytes(req));
                        } while (blk_end_request_cur(req, 0));
                        break;
                case WRITE:
                        do {
                                /*
                                * NOTE: the data buffer for the whole request might not be contiguous,
                                * so we should better handle the bios one by one. The req->buffer just
                                * point to the current bio's data buffer.
                                */
                                memcpy((char *)simp_blkdev_data +
                                        (blk_rq_pos(req) << SECTOR_SIZE_SHIFT),
                                        req->buffer, blk_rq_cur_bytes(req));
                        } while (blk_end_request_cur(req, 0));

                        break;
                default:
                        printk(KERN_ERR "unknown requests\n");
                        /* No default because rq_data_dir(req) is 1 bit */
                        break;
                }
        }
}   

论坛徽章:
0
245 [报告]
发表于 2013-06-13 09:22 |只看该作者
谢谢楼主高手   虽然我用2.6.35到现在还是死机状态。。继续努力

论坛徽章:
0
246 [报告]
发表于 2014-05-11 20:15 |只看该作者
楼主你好,能把1-15的代码的文档都上传吗,或发我一份,谢谢,wzw200@qq.com

论坛徽章:
4
双子座
日期:2014-05-25 00:04:52摩羯座
日期:2014-05-25 23:22:39未羊
日期:2014-06-16 09:10:30水瓶座
日期:2014-11-24 09:12:49
247 [报告]
发表于 2014-05-25 23:43 |只看该作者
支持楼主,慢慢学习

论坛徽章:
0
248 [报告]
发表于 2014-06-19 09:15 |只看该作者
学习学习学习学习学习

论坛徽章:
0
249 [报告]
发表于 2014-06-29 15:48 |只看该作者
我只想说非常感谢 学习中

论坛徽章:
0
250 [报告]
发表于 2014-06-29 23:14 |只看该作者
好文

我最近再看ZRAM也是有用到 block device

看了此文受益良多
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP