Kernel code/ru
Ветка 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.
rsdt_find
- В ecx принимает адрес RSDT, в edx сигнатуру таблицы, которую нужно найти (например ACPI_FADT_SIGN)
- В eax возвращает адрес требуемой таблицы
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
Файл 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)
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);
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
- TODO
i40
- TODO
syscall_entry
- TODO
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, программируетмый контроллер прерываний)
- она выполняет Remap all IRQ to 0x20+ Vectors, IRQ0 to vector 0x20, IRQ1 to vector 0x21...
PIT_init
- инициализирует PIT (Programmable Interval Timer, программируемый интервальный таймер)
- устанавливает интервал срабатывания 1/100 секунды
unmask_timer
- TODO
IRQ_mask_all
- отключить все irq
irq_eoi
- послать сигнал EOI (End Of Interrupt, конец прерывания).
- В cl передается номер irq
proc enable_irq stdcall, irq_line:dword
proc disable_irq stdcall, irq_line:dword
pci_irq_fixup
get_clock_ns
acpi_get_root_ptr
- возращает в eax Root System Description Pointer (есть такая структура данных в ACPI)
Файл debug.inc
- Содержит реализазию системной функции 69 - отладка. (см. http://wiki.kolibrios.org/wiki/SysFn69/)
Файл clipboard.inc
- Содержит реализацию системной функции54 - работа с буфером обмена. (см. http://wiki.kolibrios.org/wiki/SysFn54/)
Файл string.inc
- Реализует следующие функции для работы со строками:
- size_t strncat(char *s1, const char *s2, size_t n); // Append string s2 to s1.
- char *strchr(const char *s, int c); //
- int strncmp(const char *s1, const char *s2, size_t n); //
- char *strncpy(char *s1, const char *s2, size_t n); // Copy string s2 to s1.
- proc strrchr stdcall, s:dword, c:dword; Look for the last occurrence a character in a string.
Файл conf_lib.inc
- Загружает настройки ядра из файла /sys/sys.conf
- для чтения ini использует функции libini.obj (?)
proc set_kernel_conf
- Читает из sys.conf параметры mouse_speed, mouse_delay, midibase и применяет их
proc strtoint
- конвертация строки в dword, сама оределяет hex или dec, по наличию или отсутствию 0x, 0X
proc strtoint_dec
proc strtoint_hex
proc do_inet_adr stdcall,strs
- ковертировать строковую запись ip адреса в dword
Файл memory.inc
alloc_page (proc alloc_page)
- функция выделения одной физической страницы.
- функция ищет первую свободную физическую страницу в таблице физических страниц (sys_pgmap ?).
- Найдя страницу, page_start устанавливается на следующую страницу после найденной.
- но есть при следующем выове свободные страницы бцдцт искаться начиная с нее.
- Система хранит массив битов, который для каждой физической страницы описывает, выделена она или свободна,
- а также вспомогательные переменные:
- подсказку [page_start] - нижнюю границу при поиске свободной страницы (указатель внутри битового массива, относительно которого известно, что все предшествующие данные забиты единицами, а соответствующие страницы выделены),
- указатель [page_end] на конец массива, число свободных страниц [pg_data.pages_free].
- in: ничего
- out: eax = физ. адрес выделенной физической страницы, или eax = 0 если свободной страницы не нашлось.
alloc_pages (proc alloc_pages stdcall, count:dword)
- функция выделения нескольких физических страниц, выделяющая связный диапазон, причём кратный 8 страницам
- in: требуемое количество страниц
- out: eax = начальный физ. адрес выделенного диапазона страниц, или eax = 0 если не удалось выделить.
map_page (proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword)
- функция отображения указанной физической страницы по указанному линейному адресу
- (стандартное добавление элемента в таблицу страниц; работает и с user-mode пространством).
- способная также размаппить страницу (нулевой элемент таблицы страниц соответствует свободной линейной странице).
- in:
- lin_addr - по какому линейному адресу отобразить страницу
- phis_addr - физ. адрес отображаемой страницы
- flags - какие флаги поставить на страницу (констанды этих слагов есть в data32.inc, например PG_SWR и тд)
- out: ничего
map_space
- объявлена, но не реализована, предназначение неясно.
free_page (proc free_page)
- функция освобождения ранее выделенной физической страницы
- in: eax = физ. адрес страницы
- out: ничего
map_io_mem (proc map_io_mem stdcall, base:dword, size:dword, flags:dword)
- функция, создающая отображение заданного блока физических страниц в адресном пространстве ядра
- Как работает: вызывает alloc_kernel_space (см. core/heap.inc), а потом добавляет в таблицу страниц преобразование указанных физических адресов на только что выделенные линейные.
- in:
- base = начало блока
- size = размер блока
- flags = какие флаги поставить на виртуальные страницы
- out:
- eax = линейный адрес начала блока страниц
commit_pages
- аналогичная map_page функция, только для блока непрерывных физических адресов.
- отображает непрерывный блок физических адресов по указанному линейному адресу
- in:
- eax = page base + page flags
- ebx = linear address
- ecx = count
- out: ничего
release_pages
- функция, которая принимает линейный адрес и размер блока и одновременно размаппит из линейных адресов и освобождает физические страницы из этого блока.
- in:
- eax = base
- ecx = count
- out: ничего
unmap_pages
- функция, обратная commit_pages. Размаппит страницы принадлежащие указанному непрерывному блоку линейных адресов.
map_page_table
- TODO
alloc_dma24
- TODO
create_trampoline_pgmap
- TODO
new_mem_resize
- TODO
get_pg_addr
- функция получения физического адреса по указанному линейному
page_fault_handler
- TODO:
map_mem_ipc
- TODO
map_memEx
- TODO
safe_map_page
- TODO
sys_IPC
- реализация системной функции 60
sys_ipc_send
- реализация подфункции 2 сисфункции 60
sysfn_meminfo
- реализация подфункции 20 системной функции 18.
- кстати, таблица подфункций сисфункции 18 находится в kernel.asm, это метка sys_system_table
- обработчик сисфункции 18 sys_system
f68
- реализует подфункции 11-29 системной функции 68
f68call
- это таблица подфункций 11-29 системной функции 68
load_pe_driver
- эту функцию использует реализация подфункции 21 системной функции 68
create_ring_buffer
- TODO
print_mem
- TODO
Файл heap.inc
- в начале объявляется структура MEM_BLOCK и константы MEM_BLOCK_RESERVED, MEM_BLOCK_FREE, MEM_BLOCK_USED, MEM_BLOCK_DONT_FREE
- также объявляется calc_index.
md
- TODO
init_kernel_heap
- инициализация кучи ядра.