LINUX.ORG.RU

[kernel][магия] около container_of

 ,


0

1

Здравствуйте :)

Знающих людей наверняка задолбал этот вопрос, но все-таки... Всем знакомо выражение типа

dev = container_of(inode->i_cdev, struct scull_dev, cdev);
ttnl в однов из постов написал, что

i_cdev заполняется в chrdev_open, если все правильно в probe.

У меня устройства создаются нормально и пока ничего не падает, но все-таки интересно, что именно делает магию? Т.е. как получается, что из inode->i_cdev получается именно то, что нужно? Ведь там просто типы указываются, по логике, тот container_of должен возвращать указатель на inode. Ни в cdev_init, ни в cdev_add ничего похожего я не увидел... :-\

★★★★★

Последнее исправление: metawishmaster (всего исправлений: 6)

поправьте если ошибаюсь, но моё ламерское мнение container_of это костыль который говорит что у проги кривое API.

true_admin ★★★★★
()

include/linux/kernel.h [code] #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) [/code]

никакой магии, как видишь. Всего лишь гнутый синтаксис и typeof, которого нет в стандарте.

anonymous
()
Ответ на: комментарий от geekless

в самом макросе ясно все непонятки в выражении

dev = container_of(inode->i_cdev, struct scull_dev, cdev);
как связан inode->i_cdev с каким-то местов в памяти, которое подразумевается как struct scull_dev? и где происхадит привязка?

metawishmaster ★★★★★
() автор топика
Ответ на: комментарий от metawishmaster

Кааак.

Есть структура scull_dev, у нее поле cdev. Оно равно inode->i_cdev. Из адреса inode->i_cdev вычитается смещение до этого поля, и получается указатель на структуру scull_dev. Где происходит привязка - ну погрепай исходники

anonymous
()
Ответ на: нашел =) от metawishmaster

Эту магию делаешь ты сам, встраивая struct cdev в struct your_device, и передавая в cdev_* именно указатель на этот встроенный объект.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

ага, спасибо :) там еще мне нужно было увидеть, что inode->i_cdev - указатель, тогда все стало ясно :)

metawishmaster ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.