Как найти файл, в котором реализован метод в Android binder

#android #android-binder

#Android #android-binder

Вопрос:

Когда я прочитал исходные коды Android binder.c, который находится по адресу.
/frameworks/native/cmds/servicemanager/binder.c .
Я в замешательстве по поводу того, где найти реализацию открытого вызова в приведенных ниже кодах, есть ли у кого-нибудь какие-либо идеи, чтобы помочь?

 struct binder_state *binder_open(const char* driver, size_t mapsize)
{
    struct binder_state *bs;
    struct binder_version vers;

    bs = malloc(sizeof(*bs));
    if (!bs) {
        errno = ENOMEM;
        return NULL;
    }

    bs->fd = open(driver, O_RDWR | O_CLOEXEC);
    if (bs->fd < 0) {
        fprintf(stderr,"binder: cannot open %s (%s)n",
                driver, strerror(errno));
        goto fail_open;
    }

    if ((ioctl(bs->fd, BINDER_VERSION, amp;vers) == -1) ||
        (vers.protocol_version != BINDER_CURRENT_PROTOCOL_VERSION)) {
        fprintf(stderr,
                "binder: kernel driver version (%d) differs from user space version (%d)n",
                vers.protocol_version, BINDER_CURRENT_PROTOCOL_VERSION);
        goto fail_open;
    }

    bs->mapsize = mapsize;
    bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);
    if (bs->mapped == MAP_FAILED) {
        fprintf(stderr,"binder: cannot map device (%s)n",
                strerror(errno));
        goto fail_map;
    }

    return bs;

fail_map:
    close(bs->fd);
fail_open:
    free(bs);
    return NULL;
}```
 

Ответ №1:

Реализация open происходит в ядре Linux, в частности в подсистеме Android IPC.

Следующая структура содержит указатели на функции для узла связующего устройства (ссылка):

 const struct file_operations binder_fops = {
    .owner = THIS_MODULE,
    .poll = binder_poll,
    .unlocked_ioctl = binder_ioctl,
    .compat_ioctl = compat_ptr_ioctl,
    .mmap = binder_mmap,
    .open = binder_open,
    .flush = binder_flush,
    .release = binder_release,
};
 

Для open операции структура содержит указатель на binder_open (ссылку)

В init_binder_device этом случае binder_fops структура присваивается узлу устройства (ссылка).

Комментарии:

1. Я полагаю, вы правы. но Android основан на ядре Linux, теоретически, эти коды должны быть в AOSP, но, похоже, это не соответствует вашему ответу. Кстати, есть ли какая-нибудь статья, в которой объясняется, что такое binder и как он работает полностью?