Лаборатория 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, без тип и версия 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 .

Пример за функция за съхранение е:

Създайте ново устройство и проверете дали то се вижда в/sys/bus/bex/devices. Премахнете го и проверете дали е изчезнал от sysfs .

4. [2p] Регистриране на драйвера на bex misc

Променете файла bex-misc.c, за да регистрирате драйвера в бекс шината. Поставете модула bex_misc.ko и създайте ново бекс устройство от sysfs, с името Test, misc type и версия 2. Следвайте коментарите, отбелязани с TODO 4 .

Проверете дали новият драйвер се вижда в/sys/bus/bex/drivers. Защо функцията за повикване не се извиква ?

Внедрете функцията за съвпадение във файла bex.c. Следвайте коментари, маркирани с TODO 5. Опитайте да добавите отново бекс устройство и забележете, че този път се извиква функцията за тест.

5. [1.5p] Записване на bex misc устройство във функцията за вземане на проби

Променете bex_misc.c, така че примерната операция да се провали, ако версия> 1. Регистрирайте другото устройство във функцията bex_misc_probe () и го отпишете в bex_misc_remove. Следвайте коментари, маркирани с TODO 6 .

Създайте ново устройство с тестово име, различен тип и версия 2 и проверете дали тестовата операция е неуспешна. Създайте ново устройство с име на теста, различен тип и версия 1 и проверете дали операцията завършва успешно.

Проверете съдържанието на файла/sys/bus/bex/devices/test и забележете, че има нов запис. Идентифицирайте главното и второто за другото устройство, създайте възел тип устройство за това устройство (Съвет: mknod) и опитайте да четете и записвате операции върху създадения файл за достъп до буфера на устройството.

6. [1p] Мониторинг на известия без събития

Използвайте командата udevadm и вижте какво се случва, когато: