实例,linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)..."/>
linux 块设备驱动实例,linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)...
块设备驱动的模型还是基本基于字符设备驱动的,可以简单理解为块设备仅仅增加了操作缓冲区,对用户请求顺序进行队列重拍等等。字符设备驱动的相关分析可以查看本博客相关的博文。
按照本博客的行文习惯,在具体分析块设备驱动代码之前,我们会从整体上了解一下研究对象的特征,以及用户空间的使用方法。下面我们就自己写一个小工具(可以读取Rom中任意一个物理扇区的内容)来分析一下高通的分区信息。
在用户空间看到的块设备当然是以块设备节点展现的,如下图。其中mmcblk开头的就是今天我们分析的重点,可以看到这些文件名分为三类:mmcblk0、mmcblk0pX、mmcblk0rpmb。其中mmcblk0是设备节点,其余的为该设备的分区节点(mmcblk0rpmb RPMB是Replay Protected Memory Block的缩写,他的存在目的是用来给系统存放一些特殊的、需要进行访问授权的数据。暂时不做考虑)。Mmcblk0是当前系统的第一个mmc设备(为我们的eMMC存储器),如果插入tf卡,应该会出现mmcblk1设备。
下面我们来实现一个用户空间的小程序来读取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
更多推荐
linux 块设备驱动实例,linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)...
发布评论