linux 块设备驱动实例,linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)...

块设备驱动的模型还是基本基于字符设备驱动的,可以简单理解为块设备仅仅增加了操作缓冲区,对用户请求顺序进行队列重拍等等。字符设备驱动的相关分析可以查看本博客相关的博文。

按照本博客的行文习惯,在具体分析块设备驱动代码之前,我们会从整体上了解一下研究对象的特征,以及用户空间的使用方法。下面我们就自己写一个小工具(可以读取Rom中任意一个物理扇区的内容)来分析一下高通的分区信息。

在用户空间看到的块设备当然是以块设备节点展现的,如下图。其中mmcblk开头的就是今天我们分析的重点,可以看到这些文件名分为三类:mmcblk0、mmcblk0pX、mmcblk0rpmb。其中mmcblk0是设备节点,其余的为该设备的分区节点(mmcblk0rpmb RPMB是Replay Protected Memory Block的缩写,他的存在目的是用来给系统存放一些特殊的、需要进行访问授权的数据。暂时不做考虑)。Mmcblk0是当前系统的第一个mmc设备(为我们的eMMC存储器),如果插入tf卡,应该会出现mmcblk1设备。

625ba491580f7065c07264c80cb7db1e.png

下面我们来实现一个用户空间的小程序来读取eMMC中的原始数据进行分析。

我们在external/文件夹下建立radia_test.c、android.mk,代码如下:

radia_test.c/*************************************************************************

File Name: radia_test.c

Author: [email protected]

Created Time: 2017.6.9

brief:adjust audio parameters

************************************************************************/

#include

#include

#include

#include

#include

#include

#include

#include

#include

//extern int errno;

int get_disk_sector(int fd){

int sectorsize;

ioctl(fd, BLKSSZGET, §orsize) ;

return sectorsize;

}

/**

* read_disk_sector:

* @dev: raw disk FILE *

* @sector:

* return is the disk sectorsize

* */

int read_disk_sector(int fd, unsigned long sector, char **p){

int sectorsize;

FILE *fp;

/* get disk sector size */

sectorsize = get_disk_sector(fd);

if (sectorsize == 0){

fprintf(stderr, "get disk sector size failed\n");

return (-1);

}

/* seek it */

lseek(fd, 0 ,SEEK_SET);

//注,在offset设置得过大时,lseek可能返回OVERFLOW的错误,但实际上,它已经执行了定位,只是返回的值超出了范围。返回值为-1时,此时要判断一下错误号

if (lseek(fd, (sectorsize * sector), SEEK_CUR) == -1 ){

fprintf(stderr, "seek to %d failed\n"

, sectorsize * sector);

return (-1);

}

/* read it */

*p = (char *)malloc(sectorsize);

if (*p == NULL){

fprintf(stderr, "malloc memory fa

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值