Развитие на Linux ядрото модул част 12

тип Directory / ИЪ / модули / `uname -r` / изграждане / включва съдържа всички заглавни файлове е необходимо да се включат дефинициите в кода на модула и да се получи допълнителна информация. Точното име на директория зависи от версията на ядрото и може да се намери, като се използва следната команда:

Изчисление Използвайте връзките

Един от най-важните понятия (и често се дължи на изключително сложен) в областта на модули на ядрото е използването на референтен броене модул. Референтен брой е вътрешният областта на описанието на модул на структурата и по принцип пряк достъп до нея не е нужно (или поне един лесен начин да се получи този достъп не е). При зареждането на модул първоначална стойност на референтния брой е нула. Когато зареждате следващия модул, който използва имената (внос), изнесени от този модул, това посочване брой модул се увеличава. Модул, където тезгяха употреба, която не е нулева, не могат да бъдат разтоварени rmmod команда. Този въпрос е толкова внимателно наблюдавани, защото на критичността на наличието на модули в системата: неправилно позоваване на несъществуваща модул осигурява разпадането на цялата система.

Да разгледаме следния прост команда:

В тези случай, регистриран в системата под i2c_core на име (това не е името на файла, и е произволно взети от броя на заредените модули в системата) е текущата стойност на референтния брой от 5, и е последвано от списък с имената на 5 модула, връзка към него. Докато всички тези 5 модула няма да бъде отстранен от системата, извадете i2c_core модул ще бъде невъзможно.

Какво е объркването отбелязано по-горе, във връзка с обсъждането на референтния брой? Фактът, че в тази концепция от ядрото към постоянните промени, които се провеждат, и те се случват с такава скорост, че литературата и дискусиите не се държат с тях, и така те често се описват някои несъществуващи механизми. До сега, описанията често може да намерите връзки към MOD_INC_USE_COUNT () макро и MOD_DEC_USE_COUNT (). което увеличава и намалява броя на референтния. Но тези макроси бяха на 2.4 ядрата. В 2.6 ядро ​​са взели своето място следните извиквания на функции (дефинирани в ):

  1. вътр try_module_get (структура на модул * модул) - увеличават референтната броят на модула (връща индикация за успеха на операцията);
  2. нищожен module_put (структура на модул * модул) - да се намали броят справка за модула;
  3. неподписан вътр module_refcount (структура на модул * мод) - връща стойността на референтния брой на модула;

Като опция за всички тези предизвикателства обикновено се предават THIS_MODULE Конст показалка. така че призовава примери, в крайна сметка, са както следва:

Така, че е ясно, че има някаква възможност да се контролира стойността на референтния брой на кода на собствената си модул. Това трябва да става много внимателно, защото ако броим увеличение и симетрично впоследствие не се намалява, модулът ще бъде невъзможно да се разтоварят (докато системата се рестартира). Това е един от вариантите, с които се срещат в системата на "постоянни" модули, съществува възможност и на възникването им: модул, който не разполага в своите код завършване функции. В някои случаи може да е необходимо да се променя динамично, референтния брой, предотвратяване по време на разтоварване е възможно модул. Това е вярно, например, функции, които изпълняват операции на открито () (за увеличаване на щанда на справки) и адрес близо електронното () (Намаляване / възстановяване на насрещни жалби) за драйвери на устройства, или ще бъде на разположение модул разтоварване, обслужване на открито устройство и след лечение (от процеса на потребителя пространство), за да се отвори работа уред ще бъде изпратен на непосветените памет!

И тук има още един объркване (което може да се види в кода на някои модули): Разнообразие от ресурси се препоръчва при отваряне на устройството, за да увеличите броя на използване на собствения си код модул и снижаване, когато той е затворен. Това беше вярно. но някои версии на ядрото (не можех да следите как е) този референтен номер за проследяване се извършва автоматично по време на отваряне и затваряне. Примери за това ще бъдат проучени по-подробно по-късно, когато обмисляте няколко устройства за отваряне (архив mopen.tgz този пример ще бъде представена в по-късна статия).

заключение