Android如何生成设备节点

本文详细解析了Android系统如何在运行时动态创建设备节点。主要通过init.c和devices.c中的函数,如mkdir、mknod等,以及handle_device_fd、handle_device_event和make_device等方法来实现。通过对devperms数组的定义,系统可以生成如/dev/null、/dev/ptmx等设备节点,并设置相应的权限和所有者。
摘要由CSDN通过智能技术生成

在Android中,由于没有mdev和udev,所以它没有办法动态的生成设备节点,那么它是如何做的呢?
我们可以在system/core/init/下的init.c和devices.c中找到答案:
init.c中

  1. int main(int argc, char **argv) 
  2.     ...  
  3.          
  4.     mkdir("/dev", 0755); 
  5.     mkdir("/proc", 0755); 
  6.     mkdir("/sys", 0755); 
  7.   
  8.     mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755"); 
  9.     mkdir("/dev/pts", 0755); 
  10.     mkdir("/dev/socket", 0755); 
  11.     mount("devpts", "/dev/pts", "devpts", 0, NULL); 
  12.     mount("proc", "/proc", "proc", 0, NULL); 
  13.     mount("sysfs", "/sys", "sysfs", 0, NULL); 
  14.   
  15.    for(;;) 
  16.        ... 
  17.         if (ufds[0].revents == POLLIN) 
  18.             handle_device_fd(device_fd); 
  19.   
  20.         if (ufds[1].revents == POLLIN) 
  21.             handle_property_set_fd(property_set_fd); 
  22.         if (ufds[3].revents == POLLIN) 
  23.             handle_keychord(keychord_fd); 
  24.     
  25.   
  26.     return 0; 
  27.  


我们再来看看handle_device_fd(),该函数定义在devices.c中

  1. void handle_device_fd(int fd) 
  2.         ... 
  3.         handle_device_event(&uevent); 
  4.         handle_firmware_event(&uevent); 
  5.     
  6.  


而handle_device_event定义如下:

  1. static void handle_device_event(struct uevent *uevent) 
  2.     ... 
  3.     if(!strcmp(uevent->action, "add")) 
  4.         make_device(devpath, block, uevent->major, uevent->minor); 
  5.         return; 
  6.     
  7.     ... 
  8.  


make_device定义如下:

  1. static void make_device(const char *path, int block, int major, int minor) 
  2.     ... 
  3.     mode get_device_perm(path, &uid, &gid) (block S_IFBLK S_IFCHR); 
  4.     dev (major << 8) minor; 
  5.     ... 
  6.     setegid(gid); 
  7.     mknod(path, mode, dev); 
  8.     chown(path, uid, -1); 
  9.     setegid(AID_ROOT); 
  10.  


我们看看get_device_perm如下实现:

  1. static mode_t get_device_perm(const char *path, unsigned *uid, unsigned *gid) 
  2.     mode_t perm; 
  3.   
  4.     if (get_device_perm_inner(qemu_perms, path, uid, gid, &perm) == 0) 
  5.         return perm; 
  6.     else if (get_device_perm_inner(devpe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值