android vold,android – vold和udevd之间的区别
我知道Android使用的是卷守护进程而不是udevd.
由于这两个守护进程的行为类似如下:
>使用netlink socket接收从内核发送的uevents.
>处理文件节点以进行进一步处理.
我不清楚这两个不同的守护进程之间的区别.
有人可以提供反馈吗?有利有弊的话会很棒.
谢谢
解决方法:
看了vold source code之后,我只能说它只是udevd的简单替代品.
你是对的,vold正在使用netlink socket从内核接收uevent.但是我会说它处理块子系统事件而不是你所说的“文件节点”.
在NetlinkHandler.cpp中,您可以看到以下内容:
void NetlinkHandler::onEvent(NetlinkEvent *evt) {
VolumeManager *vm = VolumeManager::Instance();
const char *subsys = evt->getSubsystem();
if (!subsys) {
SLOGW("No subsystem found in netlink event");
return;
}
if (!strcmp(subsys, "block")) {
vm->handleBlockEvent(evt);
}
}
最后一行只是将uevent子系统字符串与“block”进行比较.这是与udevd的主要区别,因为udevd处理所有子系统,而vold是一个简单的守护进程来处理像存储卡这样的块设备.
编辑子系统
子系统是整个内核的高级部分的表示.实际上,子系统只是内核kset的包装器.在LDD3中有一篇很好的文章,第14.1章 – Kobjects,Ksets和子系统.
例如,让我在插入USB记忆棒时监控事件.
$udevadm monitor -k
KERNEL[82215.299677] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1 (usb)
KERNEL[82215.299921] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0 (usb)
KERNEL[82215.300192] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10 (scsi)
KERNEL[82215.300226] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/scsi_host/host10 (scsi_host)
KERNEL[82216.339987] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0 (scsi)
KERNEL[82216.340047] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0 (scsi)
KERNEL[82216.340069] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/scsi_disk/10:0:0:0 (scsi_disk)
KERNEL[82216.340088] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/scsi_device/10:0:0:0 (scsi_device)
KERNEL[82216.340302] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/scsi_generic/sg2 (scsi_generic)
KERNEL[82216.340445] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/bsg/10:0:0:0 (bsg)
KERNEL[82217.110295] add /devices/virtual/bdi/8:16 (bdi)
KERNEL[82217.141629] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/host10/target10:0:0/10:0:0:0/block/sdb (block)
要确定此输出中的子系统是什么,让我们看一下udevadm-monitor.c中的udev代码
static void print_device(struct udev_device *device, const char *source, int prop)
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
printf("%-6s[%llu.%06u] %-8s %s (%s)\n",
source,
(unsigned long long) ts.tv_sec, (unsigned int) ts.tv_nsec/1000,
udev_device_get_action(device),
udev_device_get_devpath(device),
udev_device_get_subsystem(device));
if (prop) {
struct udev_list_entry *list_entry;
udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(device))
printf("%s=%s\n",
udev_list_entry_get_name(list_entry),
udev_list_entry_get_value(list_entry));
printf("\n");
}
}
在第一个printf中,udev_device_get_subsystem(device)将在括号中的最后一个字段中输出sybsystem.
因此,对于udevadm监视器输出,您可以看到以下子系统:
> usb
> scsi
> scsi_host
> scsi_disk
> scsi_device
> scsi_generic
> bsg
> bdi
>块
例如,udev将处理所有这些事件以在/ dev下创建不同的条目
> / dev / disk / by-id /< entry>将基于磁盘SCSI WWN创建
> / dev / disk / by-path /< entry>将基于PCI连接和SCSI主机信息创建.
>依此类推
相比之下,vold只对来自块sybsystem的uevents感兴趣,它不关心scsi,usb或bdi的东西.
标签:android,linux-kernel,usb,udev
来源: https://codeday.me/bug/20190528/1174032.html
android vold,android – vold和udevd之间的区别相关推荐
- android布局距边距,Android初学者填充和边距之间的区别
Android初学者填充和边距之间的区别 这个问题已经在这里有了答案: 视图的填充和边距之间的区别 14个答案 我已经提到了有关SO的问题. 还检查了答案: 填充是边框内部,边框和实际视图内容之间的空 ...
- Android 9.0 Vold 流程分析(-)
Vold 介绍 Vold(volume Daemon),即Volume守护进程,用来管理Android中存储类的热拔插事件,处于Kernel和Framework之间,是两个层级连接的桥梁.vold 代 ...
- ANDROID中的VOLD分析
现在可能很少有人会用mknod这个命令了,也很少有使用它的机会,但就在几年前,这还是一项linux工程师的必备技能,在制作文件系统前或加载新的驱动前,我们必须小心翼翼的创建设备节点. 不需要使用mkn ...
- android vold 分析,vold流程分析
前言 框架 VOLD分析.png 代码分析 init进程启动vold Android起来后会解析init.rc,init.rc中启动了vold,代码如下 service vold /system/bi ...
- Android 9.0 Vold 挂载流程分析
在Android 系统中所有的热插拔设备都是通过Vold 进程挂载的.通过kernel–>vold–>StorageManagerService这样的架构去逐级上报热插拔事件. 一.Vol ...
- Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析...
在前面一篇文章中,我们分析了Android应用程序与SurfaceFlinger服务的连接过程.Android应用程序成功连接上SurfaceFlinger服务之后,还需要一块匿名共享内存来和Surf ...
- android jni 将BYTE* 和 jbyteArray 之间的转换
今天,简单讲讲如何在jni中将 BYTE* 转成 jbyteArray. 这个是我在做jni时碰到的问题.因为c传回的值是BYTE*,而返回给java代码是byte[],对应的jni的数据 ...
- Android JSON数据与实体类之间的相互转化-------GSON的简单用法
Android JSON数据与实体类之间的相互转化-------GSON的用法 1_Gson的导入 1.1_方法一:直接导入jar包 1.2_方法二:引入依赖 2_json形式的字符串互转实体对象 2 ...
- html5+、ReactNative、Weex、Ionic之间的区别、(配置java、python、Android环境)、ReactNative(react-native-cli)、yarn、Weex
html5+.ReactNative.Weex.Ionic之间的区别: html5+和Ionic: 在开发原理上基本相同,都是需要先开发出一个完整的网站,再通过html5+或Ionic提供的打包技术对 ...
最新文章
- 屏幕滚动控件Scrollview
- WCHAR,CHAR,TCHAR的区别
- 未能将网站配置为使用ASP.NET4.0,不能打开VS项目
- 淘宝 oracle mysql_Oracle 与 MySQL 的区别-阿里云开发者社区
- STL源码剖析 set
- 程序员如何自制酒店 Wi-Fi?
- SQL 修改主键约束
- mysql 创建用户并赋予用户权限
- SSIS中的字符映射表转换组件
- 微信小程序项目-出租屋管理系统
- 南丁格尔玫瑰图的Python
- C函数的参数中有取地址符
- 二等分计算机打印机尺寸,241两等分打印纸尺寸 电脑打印纸,规格241mm等份是2等份,是多大的纸呀?...
- Windows软件清单
- 播布客教学视频_C学习笔记_8.1_统计1到100中9的个数(分治)
- 校园网拨号上网一直掉线但实际网络通路是连接着的
- 13. 利用 条件运算符 的嵌套来完成此题: 学习成绩>=90分的同学A表示, 60-89分之间的用B表示, 60分以下的用C表示
- 阿里云服务器如何解析添加二级域名+阿里云服务器或者其他网站绑定域名方法+域名解析是什么意思【申明:来源于网络】
- Ubuntu搭建zhenxunbot聊天机器人
- [STM32CubeMax配置] 一、系统RCC配置