Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АВМиС(лекции).docx
Скачиваний:
13
Добавлен:
25.09.2019
Размер:
2.28 Mб
Скачать

Особенности создания, компиляции и загрузки модуля ядра

Приложения начинаются с функции main() и заканчивается после выполнения всех команд. Модули исполняются иначе, модуль начинает работу с исполнения функции init_module – это функция запуска модуля, загрузки ее в память, которая подготавливает его для последующих вызовов. После завершения функции init_module модуль ничего не делает, а только ожидает когда ядро обратится к нему. Последняя точка входа в модуль cleanup_module – функция которая загружается перед выгрузкой. Она производит откат тех изменений которые были внесены функцией init_module.

Чтобы модуль быль работоспособен, необходимо его компилировать при помощи компилятора gcc в результате компиляции создается объектный файл с расширением .ko далее имя этого файла задается в качестве параметра команды sudo в командной строке для загрузки модуля insmod ./filename.ko (или для его выгрузки rmmod ./filename.ko).

Компилятор gcc генерирует ассемблерный код, как промежуточный этап компиляции. Увидеть его можно компилируя с ключами –s, -e.

Ассемблерный код для различных типов процессорных архитектур отличается по синтаксису. Существует 2 разновидности синтаксиса ассемблерного кода intel-синтаксис, AT&T –синтаксис

Особенности

Intel

AT&T

1 другой порядок операндов источника, операндов приемника

2 использование символа % перед именем регистра

3 использование префикса $ перед непосредственным значением, номером прерывания в команде int

4 для указания шестнадцатеричной сс используется OxOA

5 в команде указывается размер операнда (l, b, w)

mov ax, bx

movw %bx, %ax

mov ebx, 0ffh

movl $OxFF, %ebx

Int 80h

Int $0x80

mov ecx, [ebx]

movl(%ebx, %ecx)

mov ecx, {edi+ebp+3]

movl 3(%ebx, %ebp), %ecx

movb $0x20, %al – значение

movb 0x20, %al – по дадресу

movb var, %al – регистр al запишется значение переменной var

movb $var, %al – адрес переменной var

Для вставки ассемблерного кода используется функция asm(char *s) в качестве параметра задается строка. _asm_(char *s).

Asm(“movl %eax, %ebx”);

Asm(“movl %eax, %ebx \n\t” “movb $0x20, %ah \n\t

.

.

.

“);

Чтение системной памяти в CMOS (Comlementary Metal Oxide Semiconductor)

Ограниченная область памяти 128 байт используется для хранения системных настроек. Доступ к ней осуществляется не как к обычной памяти, а по команда int и out через порты ввода вывода. Первых 16 байт от 00 до 00FH занимают часы реального времени (real time clock). Адрес 10h до 2Fh (32 байта) в них находится информация по настройке устройств подключенных к системной шине, по адресу 14h находится байт с информацией об установленном оборудовании. От адреса 30h до 3Fh находится другая специфическая информация BIOS. 40h до 7Fh – расширенная информация о конфигурации системы.

Чтобы прочитать из системной памяти необходимо послать в порт с номером 70h адрес байта, который хотим прочитать, командой чтения из порта с номером 71h можно получить содержимое этого байта.

Чтобы прочитать часы реального времени можно и из файла соответствующего proc/driver/rts на для этого необходимо его открыть с функцией open и пока не конец файла считать информацию cget() и не забыть закрыть этот файл.