Kernel code/ru

From KolibriOS wiki
Jump to navigation Jump to search

Ветка trunk ядра KolibriOS. Путеводитель-справочник по исходному коду.

Директория /

Файл init.inc

Содержит функции, необходимые для инициализации системы.


mem_test

Проводит тестирование памяти.

Если bios имеет функцию 0xE820, то тестирование не производится и происходит выход из функции.

init_mem

Инициализация системной таблицы страниц

init_page_map

TODO

init_BIOS32

TODO

test_cpu

Получение информации о процессоре.

acpi_locate

Поиск поиск структуры RSDP (Root System Description Pointer) которая используется в ACPI.
Функция возвращает указатель на RSDP в регистре eax.
см. https://wiki.osdev.org/RSDP

rsdt_find

В ecx принимает адрес RSDT, в edx сигнатуру таблицы, которую нужно найти (например ACPI_FADT_SIGN)
В eax возвращает адрес требуемой таблицы
см. https://wiki.osdev.org/RSDT

check_acpi

TODO

init_hpet

Инициализация HPET (High Perfomance Event Timer)


Файл kernel32.inc

Этот файл не содержит реализаций и является по сути заголовочным
Здесь содержатся инклуды .inc файлов почти всех подсистем ядра

Файл proc32.inc

Содержит макросы для определения и вызова процедур:

stdcall proc

Directly call STDCALL procedure

invoke proc

Indirectly call STDCALL procedure

ccall proc

Directly call CDECL procedure

invoke proc

Indirectly call CDECL procedure

proc

...

Файл macros.inc

Содержит разные полезные макросы, в том числе для работы со связными списками

$Revision

Клиент svn при работе с репозиторием после ключевого слова $Revision: подставляет текущую ревизию файла.

В macros.inc из исходников ядра, подключающемся первым, определён макрос fasm'а $Revision, который вычисляет максимум из всех мест, где он встретился (то есть во всех файлах, прямо или косвенно подключаемым к kernel.asm), каковой максимум и является номером самой свежей ревизии ядра (не драйверов).

В конце kernel.asm он присваивается переменной __REV__, ну а boot/bootstr.inc включает значение __REV__ в начальную выводимую строку.

diff16

Макрос, который вычисляет разность между вторым и первым аргументом и выводит ее на консоль в 16ичной системе счисления во время ассемблирования fasm'ом
Первый аргумент - строка с сообщением
Пример:
diff16 "cur_saved_data (data32.inc) ", 0, $
cur_saved_data rb 4096
Во время ассемблирования данного участка кода, fasm выведет "cur_saved_data (data32.inc) 0xЧИСЛО", где 0xЧИСЛО будет адресом cur_saved_data

diff10

Аналог diff16, только в 10ичной системе.

dbgstr

Вывод строки на доску отладки.

Макросы для работы со связными списками:

list_init_head

Создание списка

__list_add

Добавление в список (внутреннее использование)

list_add

Вставка в начало списка

list_add_tail

Вставка в конец списка

list_del

Удаление из списка

Файл struct.inc

Содержит макросы для объявления структур и работы с ними

struct

Макрос для объявления структур

Файл fdo.inc

Formatted Debug Output (FDO)
Это набор макросов для повышения удобства отладки приложений.
Работает подобно функции printf(), выводя на доску отладки форматированные сообщения.
Доступные спецификаторы формата %s, %d, %u, %x (с частичной поддержкой ширины).
Использовать обычно нужно только DEBUGF, хотя доступны также и DEBUGS, DEBUGD, DEBUGH.
Примеры:
DEBUGF 1, "%s - %d (%x)", eax, 123, ch
DEBUGF 1, "%d.%d.%d.%d", [ip+0]:1, [ip+1]:1, [ip+2]:1, [ip+3]:1
DEBUGF 1, <"function ", __FNAME__, ": %s - %x - %u">, "text here", [var]:5, [esp+16]
DEBUGF 1, "[%d][%d][%d][%d][%d]\n", al, ax, ebx, [eax], [eax]:1
DEBUGF 2, "[%u][%u][%u][%u][%u]\n", al, ax, ebx, [eax], [eax]:1
DEBUGF 3, "[%x][%x][%x][%x][%x]\n", al, ax, ebx, [eax], [eax]:1
DEBUGF 4, "[%s][%s][%s][%s][%s][%s][%s]\n", "string":4, eax, eax:5, [ebx]:5, eax:ecx, eax:[ecx], eax:byte[ecx]
Ширина:
for %s - any number, register, or in-memory variable
for %d - 1, 2, 4 (only for in-memory arguments)
for %u - 1, 2, 4 (only for in-memory arguments)
for %x - 1 .. 8

Файл const.inc

Содержит константы и объявления структур.
Распространенные сокращения:
bk - от "back", fd - от "forward". Часто в структурах поля bk и fd означают указатель на предыдущий и следующий элемент соотв-но.
также fd может означать "file descriptor"

....

APPOBJ

Структура заголовка объекта, принадлежащего приложению. Используется как составная часть некоторых других структур.
Для создания и уничтожения объектов используются следующие функции:
- create_kernel_object/destroy_kernel_object (создание/удаления объектов ядра)
- create_object/destroy_object (создание/удаление объектов текущего приложения (current_process))

CURSOR

Структура курсора
TODO

EVENT

Структура события

SMEM

TODO

SMAP

TODO

DLLDESCR

TODO

HDLL

TODO

DQ

Структура, просто с двумя dd, т.е для хранения восьмибайтовых значений.

e820entry

Структура элемента карты оперативной памяти, получаемой с помощью интерфейса e820.

....

boot_data

Структура, содержащая данные, полученные при загрузке системы, различная информация о железе, биосе и т.д

display_t

Структура дл яхранения информации о дисплее.

DISPMODE

Структура, хранящая информацию о режиме дисплея: ширина, высота, кол-во байт на пиксель, частота.

PCIDEV

Структура для хранения информации об устройстве на PCI-шине.

....


Файл data32.inc

Здесь определены некоторые структуры данных ядра.
Также содержит строковые константы на различных языках (русский, английский и т.д).
Также в здесь объявлены некотрые переменные и настройки ядра
Включает в себя файлы data32sp.inc (испанский) и data32et.inc (эстонский)

keymap

Содежит раскладку клавиатуры (128 байт)

keymap_shift

Раскладка клавиатуры при зажатой Shift

keymap_alt

Раскладка клавиатуры при зажатой Alt

... - далее идут объявления констант с именами boot_*

Это те самые сообщения, которые пишутся белым шрифтом на черном фоне при загрузке KolibriOS

... - далее идут константы, содержащие пути к драйверам, некоторым файлам

shmem_list

TODO

dll_list

TODO

pcidev_list

TODO

...

syslang

Хранит номер языка системы (1 - en, 4 - ru и тд)

gdts

Судя из названия метки: gdts = GDT Start

GDT это Global Descriptor Table, глобальная таблица дескрипторов, в которой описываются сегменты памяти

Далее описаны элементы этой таблицы то есть сегменты:

os_code_l, int_data_l и os_data_l, app_code_l, app_data_l, pci_code_32, pci_data_32, apm_code_32, apm_code_16, apm_data_16, graph_data_l, tss0_1, tls_data_l

gdte

После описания всех сегментов стоит это метка.
Судя из названия: gdte = GDT End

...

pg_data

TODO

...

sys_pgmap

Таблица физических страниц.
Представляет собой массив битов, который для каждой физической страницы описывает, выделена она или свободна.

...


Файл kglobals.inc

Содержит макросы для объявления глобальных данных (макросы iglobal ... endg и uglobal ... endg)
Рассмотрим файл kglobals.inc. На первый взгляд вовсе не очевидно, что же делают определенные в нем макросы iglobal и uglobal. Их используют при объявления данных в некоторых участках кода ядра. Но зачем же они нужны? Задача этих макросов собрать данные, объявленные с помощью них, в конец компилируемого файла, чтобы добиться уменьшения размера файла (за счет отсутствия лишних выравниваний на границу align 4) и возможно лучшего сжатия, процедурой упаковки ядра. Данные, обозначенные макросом iglobal являются инициализированными и уже заранее содержат нужное значение. Также есть макрос uglobal, который также собирает данные в конец файла, но помещает их за пределами получаемого бинарника - это не инициализированные данные и содержимое их не гарантируется, хотя обычно содержит ноль. Цель макросов iglobal и uglobal — не столько уменьшение размера файла, хотя и это тоже присутствует, сколько ускорение, процессору существенно лучше, когда код и данные разделены. Данные, размещённые в uglobal, сами по себе действительно неинициализированы, но конкретно в случае ядра Колибри при загрузке выполняется код, который область uglobal явным образом обнуляет.

iglobal

use "iglobal" for inserting initialized global data definitions.

uglobal

use 'uglobal' for inserting uninitialized global definitions.
(even when you define some data values, these variables will be stored as uninitialized data)

Файл encoding.inc

Содержит макросы для конвертирования и объявления кодировок

Файл unpacker.inc

Это lzma-распаковщик, содержит одну единственную функцию void unpack(void* packed_data, void* unpacked_data);
dword[packed_data + 0] -> символы 'KPCK'
dword[packed_data + 4] -> размер unpacked_data
TODO: т.е как эта функция определяет длину packed_data?



Директория detect/

Файл biosdisk.inc

Получение информации о жестких дисках с помощью функций bios

Файл biosmem.inc

Получение memory map с помощую функции bios'а
memory map это структура, описывающая физическую оперативную память компьютера

Файл dev_fd.inc

Поиск и занесение в таблицу приводов FDD (Floppy Disk Drive т.е привод гибких дисков т.е дискет)

Файл disks.inc

В этом заголовочном файле просто 4 инклюда:
include 'dev_fd.inc'
include 'dev_hdcd.inc'
include 'getcache.inc'
include 'sear_par.inc'

Файл init_ata.inc

Инициализация ATA интерфейса, поиск, инициализация и настройка IDE контроллеров
Сначала идет код поиска IDE контроллера в списке pci устройств и определение его BAR регистров

set_pci_command_bus_master

Установить bus master бит в командный pci регистр

Init_IDE_ATA_controller

Инициализация ide контроллера

Init_IDE_ATA_controller_2

...

Файл dev_hdcd.inc

Поиск hdd и cd дисков, чтение информации о них, функции посылки команд на них

FindHDD

TODO

FindHDD_2

TODO

FindHDD_1

TODO

сalculate_IDE_device_values_storage

TODO

convert_Sector512_value

TODO

ReadHDD_ID

Чтение идентификатора жесткого диска
Входные параметры передаются через глобальные переменные:
ChannelNumber - номер канала (1 или 2);
DiskNumber - номер диска на канале (0 или 1).
Идентификационный блок данных считывается в массив Sector512.

find_IDE_controller_done

Инициализирует до трех ide контроллеров
Настраивает ide кэш
Ищет разделы на диске
...
Если включен extended_primary_loader, то выполняется код из boot/rdload.inc

Файл getcache.inc

Настройка IDE кэша

Файл sear_par.inc

Поиск разделов на дисках

Файл rdload.inc

Загрузчик ram диска

Файл vortex86.inc

Обнаружение и получение информации о SoC Vortex86 для компьютеров на базе нее

Директория core/

Файл syscall.inc

Содержит таблицу системных вызовов и функции для осуществления системных вызовов различными способами.
TODO: чем отличаются следующие три функции? когда какая применяется?

sysenter_entry

Обработчик системного вызова с использованием технологии Intel SYSENTER/SYSEXIT (AMD CPU support it too)

i40

Обработчик системного вызова по умолчанию, обычным способом (через прерывание 0x40 и возврат из него).

syscall_entry

Обработчик системного вызова с использованием технологии AMD SYSCALL/SYSRET

servetable2

Это таблица системных вызовов.
Хранит адреса функций-обработчиков системных вызовов, начиная с 0ой и заканчивая 80ой.

Файл apic.inc

Реализована работа с APIC (Advanced Programmable Interrupt Controller) и PIC
APIC состоит из двух модулей - LAPIC (свой для каждого ядра процессора) и IOAPIC (контроллер на системной плате).
В начале объявлены глобальные перменные и константы.
Например переменная irq_mode обозначет текущий режим прерываний. Она принимает значение IRQ_PIC и IRQ_APIC
TODO: описать предназначение каждой перменной и константы

APIC_init

эта функция отвечает за APIC.
она инициализирует конроллер IOAPIC и вызывает функцию LAPIC_init

LAPIC_init

инициализация LAPIC

IOAPIC_read

чтение регистра из контроллера IOAPIC.
номер регистра передается в EAX, значение возвращеется в EAX

IOAPIC_write

запись значения в регистр контроллера IOAPIC
номер регистра передается в EAX, значение передается в EBX, функция ничего не возвращает

PIC_init

инициализация PIC (Programmable Interrupt Controller, программируетмый контроллер прерыв