Android如何生成设备节点
16lz
2021-01-23
在Android中,由于没有mdev和udev,所以它没有办法动态的生成设备节点,那么它是如何做的呢?
我们可以在system/core/init/下的init.c和devices.c中找到答案:
init.c中
- intmain(intargc,char**argv)
- {
- ...
- /*Getthebasicfilesystemsetupweneedput
- *togetherintheinitramdiskon/andthenwe'll
- *letthercfilefigureouttherest.
- */
- mkdir("/dev",0755);
- mkdir("/proc",0755);
- mkdir("/sys",0755);
- mount("tmpfs","/dev","tmpfs",0,"mode=0755");
- mkdir("/dev/pts",0755);
- mkdir("/dev/socket",0755);
- mount("devpts","/dev/pts","devpts",0,NULL);
- mount("proc","/proc","proc",0,NULL);
- mount("sysfs","/sys","sysfs",0,NULL);
- for(;;){
- ...
- if(ufds[0].revents==POLLIN)
- handle_device_fd(device_fd);
- if(ufds[1].revents==POLLIN)
- handle_property_set_fd(property_set_fd);
- if(ufds[3].revents==POLLIN)
- handle_keychord(keychord_fd);
- }
- return0;
- }
我们再来看看handle_device_fd(),该函数定义在devices.c中
- voidhandle_device_fd(intfd)
- {
- ...
- handle_device_event(&uevent);
- handle_firmware_event(&uevent);
- }
- }
而handle_device_event定义如下:
- staticvoidhandle_device_event(structuevent*uevent)
- {
- ...
- if(!strcmp(uevent->action,"add")){
- make_device(devpath,block,uevent->major,uevent->minor);
- return;
- }
- ...
- }
make_device定义如下:
- staticvoidmake_device(constchar*path,intblock,intmajor,intminor)
- {
- ...
- mode=get_device_perm(path,&uid,&gid)|(block?S_IFBLK:S_IFCHR);
- dev=(major<<8)|minor;
- ...
- setegid(gid);
- mknod(path,mode,dev);
- chown(path,uid,-1);
- setegid(AID_ROOT);
- }
我们看看get_device_perm如下实现:
- staticmode_tget_device_perm(constchar*path,unsigned*uid,unsigned*gid)
- {
- mode_tperm;
- if(get_device_perm_inner(qemu_perms,path,uid,gid,&perm)==0){
- returnperm;
- }elseif(get_device_perm_inner(devperms,path,uid,gid,&perm)==0){
- returnperm;
- }else{
- structlistnode*node;
- structperm_node*perm_node;
- structperms_*dp;
- /*Checkpartnerslist.*/
- list_for_each(node,&devperms_partners){
- perm_node=node_to_item(node,structperm_node,plist);
- dp=&perm_node->dp;
- if(dp->prefix){
- if(strncmp(path,dp->name,strlen(dp->name)))
- continue;
- }else{
- if(strcmp(path,dp->name))
- continue;
- }
- /*Foundperminpartnerlist.*/
- *uid=dp->uid;
- *gid=dp->gid;
- returndp->perm;
- }
- /*Defaultifnothingfound.*/
- *uid=0;
- *gid=0;
- return0600;
- }
- }
我们最后可以看到在devperms中定义了要生成的设备节点:
- staticstructperms_devperms[]={
- {"/dev/null",0666,AID_ROOT,AID_ROOT,0},
- {"/dev/zero",0666,AID_ROOT,AID_ROOT,0},
- {"/dev/full",0666,AID_ROOT,AID_ROOT,0},
- {"/dev/ptmx",0666,AID_ROOT,AID_ROOT,0},
- {"/dev/tty",0666,AID_ROOT,AID_ROOT,0},
- {"/dev/random",0666,AID_ROOT,AID_ROOT,0},
- {"/dev/urandom",0666,AID_ROOT,AID_ROOT,0},
- {"/dev/ashmem",0666,AID_ROOT,AID_ROOT,0},
- {"/dev/binder",0666,AID_ROOT,AID_ROOT,0},
- /*loggershouldbeworldwritable(forlogging)butnotreadable*/
- {"/dev/log/",0662,AID_ROOT,AID_LOG,1},
- /*themsmhw3dclientdevicenodeisworldwritable/readable.*/
- {"/dev/msm_hw3dc",0666,AID_ROOT,AID_ROOT,0},
- /*gpudriverforadreno200isgloballyaccessible*/
- {"/dev/kgsl",0666,AID_ROOT,AID_ROOT,0},
- /*theseshouldnotbeworldwritable*/
- {"/dev/diag",0660,AID_RADIO,AID_RADIO,0},
- {"/dev/diag_arm9",0660,AID_RADIO,AID_RADIO,0},
- {"/dev/android_adb",0660,AID_ADB,AID_ADB,0},
- {"/dev/android_adb_enable",0660,AID_ADB,AID_ADB,0},
- {"/dev/ttyMSM0",0600,AID_BLUETOOTH,AID_BLUETOOTH,0},
- {"/dev/ttyHS0",0600,AID_BLUETOOTH,AID_BLUETOOTH,0},
- {"/dev/uinput",0660,AID_SYSTEM,AID_BLUETOOTH,0},
- {"/dev/alarm",0664,AID_SYSTEM,AID_RADIO,0},
- {"/dev/tty0",0660,AID_ROOT,AID_SYSTEM,0},
- {"/dev/graphics/",0660,AID_ROOT,AID_GRAPHICS,1},
- {"/dev/msm_hw3dm",0660,AID_SYSTEM,AID_GRAPHICS,0},
- {"/dev/input/",0660,AID_ROOT,AID_INPUT,1},
- {"/dev/eac",0660,AID_ROOT,AID_AUDIO,0},
- {"/dev/cam",0660,AID_ROOT,AID_CAMERA,0},
- {"/dev/pmem",0660,AID_SYSTEM,AID_GRAPHICS,0},
- {"/dev/pmem_adsp",0660,AID_SYSTEM,AID_AUDIO,1},
- {"/dev/pmem_camera",0660,AID_SYSTEM,AID_CAMERA,1},
- {"/dev/oncrpc/",0660,AID_ROOT,AID_SYSTEM,1},
- {"/dev/adsp/",0660,AID_SYSTEM,AID_AUDIO,1},
- {"/dev/snd/",0660,AID_SYSTEM,AID_AUDIO,1},
- {"/dev/mt9t013",0660,AID_SYSTEM,AID_SYSTEM,0},
- {"/dev/msm_camera/",0660,AID_SYSTEM,AID_SYSTEM,1},
- {"/dev/akm8976_daemon",0640,AID_COMPASS,AID_SYSTEM,0},
- {"/dev/akm8976_aot",0640,AID_COMPASS,AID_SYSTEM,0},
- {"/dev/akm8973_daemon",0640,AID_COMPASS,AID_SYSTEM,0},
- {"/dev/akm8973_aot",0640,AID_COMPASS,AID_SYSTEM,0},
- {"/dev/bma150",0640,AID_COMPASS,AID_SYSTEM,0},
- {"/dev/cm3602",0640,AID_COMPASS,AID_SYSTEM,0},
- {"/dev/akm8976_pffd",0640,AID_COMPASS,AID_SYSTEM,0},
- {"/dev/lightsensor",0640,AID_SYSTEM,AID_SYSTEM,0},
- {"/dev/msm_pcm_out",0660,AID_SYSTEM,AID_AUDIO,1},
- {"/dev/msm_pcm_in",0660,AID_SYSTEM,AID_AUDIO,1},
- {"/dev/msm_pcm_ctl",0660,AID_SYSTEM,AID_AUDIO,1},
- {"/dev/msm_snd",0660,AID_SYSTEM,AID_AUDIO,1},
- {"/dev/msm_mp3",0660,AID_SYSTEM,AID_AUDIO,1},
- {"/dev/audience_a1026",0660,AID_SYSTEM,AID_AUDIO,1},
- {"/dev/tpa2018d1",0660,AID_SYSTEM,AID_AUDIO,1},
- {"/dev/msm_audpre",0660,AID_SYSTEM,AID_AUDIO,0},
- {"/dev/msm_audio_ctl",0660,AID_SYSTEM,AID_AUDIO,0},
- {"/dev/htc-acoustic",0660,AID_SYSTEM,AID_AUDIO,0},
- {"/dev/vdec",0660,AID_SYSTEM,AID_AUDIO,0},
- {"/dev/q6venc",0660,AID_SYSTEM,AID_AUDIO,0},
- {"/dev/snd/dsp",0660,AID_SYSTEM,AID_AUDIO,0},
- {"/dev/snd/dsp1",0660,AID_SYSTEM,AID_AUDIO,0},
- {"/dev/snd/mixer",0660,AID_SYSTEM,AID_AUDIO,0},
- {"/dev/smd0",0640,AID_RADIO,AID_RADIO,0},
- {"/dev/qemu_trace",0666,AID_SYSTEM,AID_SYSTEM,0},
- {"/dev/qmi",0640,AID_RADIO,AID_RADIO,0},
- {"/dev/qmi0",0640,AID_RADIO,AID_RADIO,0},
- {"/dev/qmi1",0640,AID_RADIO,AID_RADIO,0},
- {"/dev/qmi2",0640,AID_RADIO,AID_RADIO,0},
- /*CDMAradiointerfaceMUX*/
- {"/dev/ts0710mux",0640,AID_RADIO,AID_RADIO,1},
- {"/dev/ppp",0660,AID_RADIO,AID_VPN,0},
- {"/dev/tun",0640,AID_VPN,AID_VPN,0},
- {NULL,0,0,0,0},
- };
更多相关文章
- 为android系统添加USB AUDIO设备的放音和录音功能
- android 自定义xml属性
- Android自定义对话框的大小
- android构建自定义View和自定义组件
- 基于Android设备的 Kali Linux渗透测试教程(内部资料)
- Android USB Host开发之manager.getDeviceList()获取不到设备列
- 使用attrs.xml自定义属性
- 自定义android圆形ImageView
- Android 开发:(十四)NavigationBar篇-自定义顶部导航栏