Лабораторія 12 вправ CS Open CourseWare

Підготовка лабораторії

Для вирішення лабораторії ми будемо працювати в тому ж каталозі, з якого запускаємо віртуальну машину (

лабораторія

Етапи вирішення такі:

Підготовка лабораторного скелета

Лабораторний фреймворк генерується з джерел у каталозі tools/labs/templates. Ми можемо створити скелети для всіх лабораторій, використовуючи таку команду:

Для створення скелета для однієї лабораторії ми будемо використовувати змінну середовища LABS:

Подібним чином, ми можемо створити скелет для однієї вправи, присвоївши значення/змінну LABS .

Компіляція модулів

Команда make build компілює всі модулі в каталозі skels .

Копіювання модулів на віртуальну машину

Ми можемо копіювати згенеровані модулі на віртуальній машині, використовуючи ціль копіювання команди make, коли віртуальна машина зупинена.

Крім того, ми можемо скопіювати файли через scp, щоб уникнути перезапуску віртуальної машини. Докладніше про використання мережевої взаємодії з віртуальною машиною читайте у розділі „Взаємодія з віртуальною машиною”.

Тестування модулів

Створені модулі копіюються на віртуальну машину в каталог/home/root/skels/.

Після запуску віртуальної машини QEMU ми зможемо використовувати команди у вікні QEMU (або в minicom) для завантаження та завантаження модуля ядра:

/ so2/linux/з джерелами ядра, де ми можемо використовувати Vim та cscope для перегляду вихідного коду.

Вправи

/ so2/linux, щоб отримати останню версію лабораторного середовища.

[0,5p] Вступ

Дякую! Знайдіть визначення таких символів у ядрі Linux:

Заповнення форми зворотного зв'язку

Ми цінуємо вашу думку щодо діяльності курсу SO2. Це допомагає нам покращити курс і зробити предмет максимально доступним та цікавим. Для цього заповніть форму зворотного зв’язку на cs.curs.pub.ro (ви повинні пройти аутентифікацію та зареєструватися на курсі). Дякую!

1. [2p] Впровадження шини

Проаналізуйте вміст файлу bex.c, який містить реалізацію драйвера шини. Дотримуйтесь коментарів, позначених TODO 1, щоб реалізувати відсутні елементи: зареєструйте драйвер шини та додайте новий пристрій, який називається root, з none та версія 1 .

Скомпілюйте, скопіюйте модуль на віртуальну машину, завантажте його в ядро ​​та перевірте, чи пристрій шини видно в/sys/bus. Також перевірте, чи пристрій видно в/sys/bus/bex/devices. .

Видаліть модуль і зауважте, що записи в sysfs видалено.

2. [2p] Додайте атрибути для типу та версії

Додайте два атрибути лише для читання: тип і версію. Підписуйтесь на коментарі з тегом TODO 2 .

Зверніть увагу, що два нових атрибути видно в/sys/bus/bex/devices/root. Перевірте вміст цих атрибутів.

Реалізацією функції відображення типу є

3. [2p] Додати атрибути del і add

Додайте два атрибути лише для запису, які називаються del і add. del чекає на ім'я пристрою, щоб його видалити, а add - на ім'я, тип та версію для створення нового пристрою. Підписуйтесь на коментарі з тегом TODO 3 .

Прикладом функції store є:

Створіть новий пристрій і перевірте, чи він відображається в/sys/bus/bex/devices. Видаліть його та перевірте, чи він зник із sysfs .

4. [2p] Реєстрація драйвера bex misc

Змініть файл bex-misc.c, щоб зареєструвати драйвер на шині bex. Вставте модуль bex_misc.ko та створіть новий пристрій bex із sysfs з назвою Тест, тип різного типу та версія 2. Дотримуйтесь коментарів, позначених TODO 4 .

Перевірте, чи новий драйвер видно в/sys/bus/bex/drivers. Чому функція виклику не викликається ?

Реалізуйте функцію збігу у файлі bex.c. Підписуйтесь на коментарі з тегом TODO 5. Спробуйте додати пристрій bex ще раз і зауважте, що цього разу викликається тестова функція.

5. [1,5p] Запис різноманітного пристрою Bex у функції вибірки

Змініть bex_misc.c так, щоб зразок операції не вдався, якщо версія> 1. Зареєструйте різний пристрій у функції bex_misc_probe () та скасуйте реєстрацію в bex_misc_remove. Підписуйтесь на коментарі з тегом TODO 6 .

Створіть новий пристрій із назвою тесту, різним типом та версією 2 та переконайтеся, що тестова операція не вдається. Створіть новий пристрій із назвою тесту, різним типом та версією 1 та переконайтеся, що операція успішно завершена.

Перевірте вміст файлу/sys/bus/bex/devices/test та зауважте, що є новий запис. Визначте головне та другорядне для різного пристрою, створіть пристрій символьного вузла для цього пристрою (Підказка: mknod) та спробуйте виконати операції читання та запису у створеному файлі для доступу до буфера пристрою.

6. [1р] Моніторинг повідомлень про події

Використовуйте команду udevadm і подивіться, що станеться, коли: