1. Linux kernel创建的/dev/下的设备节点是不对的, 其实是kernel仅负责在/sys/(基于内存的虚拟文件系统)创建一大堆下目录和文件,而真正的设备节点是在用户空间程序创建的,应该是udev实现的。

2. 对于非android系统,应该是mdev,其实到底谁来处理,关键看kernel发送uevent事件,应用层通过什么方式处理的,是侦听socket还是通过设置/proc/sys/kernel/hotplug命令文件。

3. Android的设备节点和Linux的设备节点创建方式有些不同,但是都是通过捕获设备注册的event事件来创建设备节点的,而不是在device_add()里面就注册了,因为在内核启动阶段,根文件系统还没有挂载,没有/dev/目录。

在android系统中,由init进程负责处理这种uevent事件,如果是"add" device事件, init会在/dev/下创建相应的节点,具体代码可查看 system/core/init/devices.c: handle_device_event->make_device 节点的用户、组、权限都可以在devperms中定制。

Android 使用Init 进程来创建设备节点文件,分两种情况:静态节点文件和动态节点文件,以应对已经定义好的冷插拔和系统运行起来后插入的热插拔设备。

(1)对于冷插拔设备,init 进程事先获取等待冷插拔处理的驱动程序,事先定义好个驱动的设备节点文件(在android_source_code/system/core/init/devices.c中),在struct perms_devices[ ] 列出了设备节点的名称。访问权限,用户ID,组ID,若要添加新的用户定义的新设备需要在此结构体中添加相应信息。

(2)init 对于热插拔的动态设备,使用事件处理循环来完成,使用poll()监听来自驱动程序的uevent, 然后调用handle_device_fd()创建设备节点。

/*init.c中针对cold-plug设备节点的创建:*/

int main(int argc, char **argv)

int ueventd_main(int argc, char **argv)

device_init();

coldboot("/sys/class");

coldboot("/sys/block");

coldboot("/sys/devices");

do_coldboot(d); //他是一个递归函数

void handle_device_fd()

handle_device_event(&uevent);

handle_block_device_event(uevent);

handle_platform_device_event(uevent);

handle_generic_device_event(uevent); //在这个文件中创建设备节点

handle_device(uevent->action, devpath, uevent->path, , uevent->major, uevent->minor, links);

static void handle_device(const char *action, const char *devpath, const char *path, int block, int major, int minor, char **links)

{

int i;

if(!strcmp(action, "add")) {

make_device(devpath, path, block, major, minor, (const char **)links); /*创建设备节点*/

if (links) {

for (i = ; links[i]; i++)

make_link_init(devpath, links[i]);

}

}

if(!strcmp(action, "remove")) {

if (links) {

for (i = ; links[i]; i++)

remove_link(devpath, links[i]); /*移除软链接*/

}

unlink(devpath); /*移除设备节点*/

}

if (links) {

for (i = ; links[i]; i++)

free(links[i]);

free(links);

}

}

/*main.c中针对hot-plug设备的设备节点的创建*/

int main(int argc, char **argv)

{

.

.

.

nr = poll(ufds, fd_count, timeout);

if (nr <= )

continue;

for (i = ; i < fd_count; i++) {

if (ufds[i].revents & POLLIN) {

if (ufds[i].fd == get_property_set_fd())

handle_property_set_fd();

else if (ufds[i].fd == get_keychord_fd())

handle_keychord();

else if (ufds[i].fd == get_signal_fd())

handle_signal();

}

}

return ;

}

linux 下的使用 ln 创建 软链接 和 硬链接

linux 下的一个指令 ln 作用: 创建软链接或者硬链接 Linux 系统下每创建一个文件,系统都会为此文件生成一个 index node 简称(inode) ,而每一个文件都包含用户数据(use ...

Linux下通过受限bash创建指定权限的账号

在日常业务运维中,有时为了配合解决问题,需要给非运维人员开通系统账号,用于查询日志或代码.通常为了系统安全或避免不必要的误操作等目的,会将账号权限降至最低.下面介绍下在Linux下通过受限bash创建 ...

Linux下的文件夹创建命令使用实践

[文章摘要] 本文以实际的C源程序为样例,介绍了Linux下的文件夹创建命令(mkdir)的用法.为相关开发工作的开展提供了故意的參考. [关键词] C语言  Linux  文件夹创建  makefi ...

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库   创建静态库:ar -rcs test.a *.o查看静态库:ar -tv test.a解压静态库:ar -x test.a 查 ...

【Linux】Linux下设备网卡以及硬件管理等

这是Linux下网络硬件管理的基础知识,虽然平时用到的可能比软件的少一点,但是作为基础命令,还是需要记住,以免用时又得查询. 本文参考官方文档:https://wiki.ubuntu.com.cn/% ...

如何在Linux下使用Gitblit工具创建Git仓库服务

嗨!朋友,今天我们将学习如何在你的Linux服务器或者PC上安装Gitblit工具.首先,我们看看什么是Git,它的功能以及安装Gitblit的步骤.Git是分布式版本控制系统,它强调速度.数据一致性 ...

linux spi 设备节点 读写

本文记录spi设备节点的操作方法. SPI总线设备文件名通常为/dev/spidevN.P(N=0.1.2--,P=0.1.2--), 其中N表示第几路SPI总线,而P表示在该路SPI总线中使用哪个C ...

linux下文件夹的创建、复制、剪切、重命名、清空和删除命令

在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinozzz 一.目录创建 在/home/wwwroot目录下新建一个sinozzz123的 ...

android和Linux下getopt的差别

1. Linux下如果找不到相对应的参数,则会跳过继续找下一个 Android下如果找不到则会直接返回-1,跳出来 2. Linux下通过getopt后会把找到的元素放到数组的前面,没找到的往后移动( ...

随机推荐

Atitit&period;数据检索与网络爬虫与数据采集的原理概论

Atitit.数据检索与网络爬虫与数据采集的原理概论 1. 信息检索1 1.1. ((美)曼宁...)[简介_书评_在线阅读] - dangdang.html1 1.2. ...

HTTP POST请求报文格式分析与Java实现文件上传

时间 2014-12-11 12:41:43  CSDN博客 原文  http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHt ...

Dynamics AX 2012 R2 报表部署权限错误

今天,Reinhard在 Deploy AX Reporting时,发生权限错误. 配置 ID: HOSTMSSQLSERVER 描述: HOST@MSSQLSERVER 默认值: True 报表服务 ...

BZOJ3933 &lbrack;CQOI2015&rsqb;多项式

$\sum_{k = 0} ^ {n} a_kx^k = \sum_{k = 0} ^ {n} b_k(x - t)^k \Leftrightarrow \sum_{k = 0} ^ {n} a_k( ...

100&period; Same Tree&lpar;Tree&rpar;

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre ...

SharePoint 2010&sol;SharePoint 2013 Custom Action&colon; 基于Site Collection 滚动文字的通知&period;

应用场景: 有时候我们的站点需要在每个页面实现滚动文字的通知,怎么在不修改Master Page的情况下实现这个功能?我们可以使用Javascript 和 Custom Action 来实现. 创建一 ...

glsl-UBO

UBO 是什么?为何要用UBO? 1.数据共享设计 采用Block的原因是: 如果你的程序中包含了多个着色器,而且这些着色器使用了相同的Uniform变量,你就不得不为每个着色器分别管理这些变量.Un ...

java和&period;net 处理任意格式日期字符串转日期类型,

1.SimpleDateFormat.parse 把指定格式字符串转日期类型 public static Calendar convToCalender(String str,String templ ...

Delphi体系内部的4种消息传递办法(Send,Post,Perform,Dispatch)

一.什么是消息? 消息是windows对应用程序发送的有关‘发生了某种事件’的通知.例如点击鼠标,调整窗口大小或键盘上按下一个键,都会引起windows发送一条消息到应用程序中去,去通知应用程序发生了 ...

Netflix Recommendations

by Xavier Amatriain and Justin Basilico (Personalization Science and Engineering) In part one of thi ...

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐