在Android中,由於沒有mdev和udev,所以它沒有辦法動態的生成設備節點,那麼它是如何做的呢?
我們可以在system/core/init/下的init.c和devices.c中找到答案:
init.c中
- int main( int argc, char **argv)
- {
- ...
- /* Get the basic filesystem setup we need put
- * together in the initramdisk on / and then we'll
- * let the rc file figure out the rest.
- */
- 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);
- }
- return 0;
- }
我們再來看看handle_device_fd(),該函數定義在devices.c中
- void handle_device_fd( int fd)
- {
- ...
- handle_device_event(&uevent);
- handle_firmware_event(&uevent);
- }
- }
而handle_device_event定義如下:
- static void handle_device_event( struct uevent *uevent)
- {
- ...
- if (!strcmp(uevent->action, "add" )) {
- make_device(devpath, block, uevent->major, uevent->minor);
- return ;
- }
- ...
- }
make_device定義如下:
- static void make_device( const char *path, int block, int major, int minor)
- {
- ...
- 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如下實現:
- static mode_t get_device_perm( const char *path, unsigned *uid, unsigned *gid)
- {
- mode_t perm;
- if (get_device_perm_inner(qemu_perms, path, uid, gid, &perm) == 0) {
- return perm;
- } else if (get_device_perm_inner(devperms, path, uid, gid, &perm) == 0) {
- return perm;
- } else {
- struct listnode *node;
- struct perm_node *perm_node;
- struct perms_ *dp;
- /* Check partners list. */
- list_for_each(node, &devperms_partners) {
- perm_node = node_to_item(node, struct perm_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 ;
- }
- /* Found perm in partner list. */
- *uid = dp->uid;
- *gid = dp->gid;
- return dp->perm;
- }
- /* Default if nothing found. */
- *uid = 0;
- *gid = 0;
- return 0600;
- }
- }
我們最後可以看到在devperms中定義了要生成的設備節點:
- static struct perms_ 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 },
- /* logger should be world writable (for logging) but not readable */
- { "/dev/log/" , 0662, AID_ROOT, AID_LOG, 1 },
- /* the msm hw3d client device node is world writable/readable. */
- { "/dev/msm_hw3dc" , 0666, AID_ROOT, AID_ROOT, 0 },
- /* gpu driver for adreno200 is globally accessible */
- { "/dev/kgsl" , 0666, AID_ROOT, AID_ROOT, 0 },
- /* these should not be world writable */
- { "/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 },
- /* CDMA radio interface MUX */
- { "/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 },
- };
本文出自 “Mobile and Linux Development ” 博客,請務必保留此出處http://buaadallas.blog.51cto.com/399160/394351