2

При изучении Понимание ядра Linux я наткнулся счетчика ссылок в Kobject структуре и контейнера. Итак, как это помогает сопоставить эти структуры?
Ниже представлен прагр из 3-го издания ULK.Что такое счетчик ссылок в отношении модели драйверов устройств?

Поле kref является структурой типа k_ref, состоящей из одного поля refcount. Как следует из названия, это поле является ссылочным счетчиком для kobject, но оно может действовать также как контрольный счетчик для контейнера kobject. Функции kobject_get() и kobject_put() увеличивают и уменьшают соответственно контрольный счетчик; если счетчик достигает нулевого значения, ресурсы, используемые kobject, освобождаются, и выполняется способ освобождения объекта kobj_type объекта kobject. Этот метод, который обычно определяется только в том случае, если контейнер kobject был распределен динамически, освобождает сам контейнер.

Аналогичным образом в другом контексте использовался эта контрольная счетчик. Я хочу знать практическое отображение эталонного счетчика.

+0

Читали [ kref documentation] (https://www.kernel.org/doc/Documentation/kref.txt)? Это выглядит хорошо для введения в счетчик ссылок, используемый в ядре. – Tsyvarev

+0

Спасибо, я новичок в Linux, я просто переживаю это. –

ответ

0

ключевые функции «kobject» должны служить опорным счетчиком для объекта , в который он встроен. Пока существуют ссылки на объект, объект (и поддерживающий его код) должен продолжать существовать. низкоуровневые функции для манипулирования эталонные отсчитывает kobject являются:

struct kobject *kobject_get(struct kobject *kobj); 
void kobject_put(struct kobject *kobj); 

Позвонив в kobject_get счетчик ссылок с шагом kobject и возвращает указатель на kobject и если kobject находится в процессе получения разрушен, эта конкретная операция завершается неудачей и kobject_get Возвращает «Null».

Аналогично, когда ссылка должна быть освобождена, вызов kobject_put уменьшает счетчик ссылок и освобождает объект.

Подсчет ссылок для STRUCT разработчика может быть реализован следующим образом:

struct kobject *dev_get(struct dev *p) 
{ 
struct module *owner = p->owner; 
struct kobject *kobj; 

if (owner && !try_module_get(owner)) 
return NULL; 
kobj = kobject_get(&p->kobj); 
if (!kobj) 
module_put(owner); 
return kobj; 
} 

Я надеюсь, что этот ответ может помочь вам в некотором роде, чтобы понять что-то о kobject и счетчик ссылок :-)

+0

Я читал это в книге, о которой я говорил, проблема в том, что я сомневаюсь, что это нечто большее, чем приращение и уменьшение. –

Смежные вопросы