report.docx
Санкт-Петербургский политехнический университет Петра Великого Институт Информационных Технологий и УправленияКафедра компьютерных систем и программных технологий
Рефератпо предмету «Проектирование ОС и компонентов»
Работу выполнил студент гр. 63501/3 Мартынов С. А. Работу принял преподаватель Душутина Е. В.Санкт-Петербург 2016
Содержание
Реверс-инжиниринг ПО (обратный инжиниринг, обратная разработка) это процесс восста- новления структуры, внутреннего устройства программы с целью понимания его принципа её работы.Мотивацией проведения реверс-инжиниринга может являться извлечение спецификации, моделей (выявление архитектуры программы, получение алгоритмов работы, извлечение поведенческих моделей), понимание работы программы, деобфускация или даже восста- новление исходного кода. Необходимость в реверс-инжиниринг может возникнуть когда возникают задачи поддержки legacy кода, при подготовке к реинжинирингу либо когда нужно скопировать какую-то функциональность ПО без нарушения авторских прав. По- следний пункт требует отдельного изучения, т.к. иногда производитель ПО сопровождает свой продукт лицензией не допускающей его реверс-инжиниринга (к примеру Skype).Предметом анализа реверс-инжиниринга обычно является:
Исходный код ПОБинарный код ПОБайт-кодПрограммная документацияРезультатом проведения реверс-инжиниринга может быть:
Диаграммы классовДиаграммы компонентовДиаграммы модулейДиаграммы состоянийДиаграммы последовательностейСхемы алгоритмовМодели данныхПротокол исследованияЛюбые другие текстовые и графические данные, соответствующие поставленной задачеВ зависимости от цели и от того, что есть в наличии у исследователя можно выбрать соответствующий инструмент. К примеру, если есть исходный код какого-то протокола
обмена, то средствами статического анализа (метод обратной трассировки) можно полу- чить диаграмму состояний. Если есть бинарный (исполняемый) код, то можно провести динамический анализ – запротоколировать и визуализировать трассы исполнения.В данной работе мы проведём реверс-инжиниринг свободной (лицензия BSD) Unix-подобной микроядерной операционной системы Minix. Изначально (1987 год) ядро Minix состояло из 1 600 строк на С и 800 ассемблерных строк. Ко второй версии (1997 год) ее размер вырос до 62 200 строк. На данный момент последней стабильной версией является 3.3.0 (16 сентября 2014) и её объём составляет 1 415 811 строк в .c и .h файлах.Нашей целью является реверс-инжиниринг текущей версии Minix для быстрой ориентации по исходному коду. Нами будет рассмотрено микроядро (директория /kernel), серверы (директория /servers), некоторые включаемые файлы (директория /include/), системный загрузчик (директория /boot). Из рассмотрения были исключены системные и пользова- тельские библиотеки (директория /lib), тесты (директория /test) и системные утилиты (директория /commands) т.к. они не являются частями собственно операционной системы. Драйверы содержат много специфичной информации, а вспомогательные файлы (дирек- тории /etc/ и /tools/) не требуют особых пояснений. Так же была исключён раздел с документацией (директории /man/ и /docs/) т.к. они не содержат файлов с исходным кодом.В своей работе мы будем использовать стандартные инструменты разработчика – утилиты grep, find, cat и редактор vim с набором плагинов для подсветки кода.
Микроядро
Директория /kernel
Директория /kernel содержит следующие файлы:
clock.c (12K) – Содержит функции для инициализации таймера и обработчиков таймера. Содержит как обработчик аппаратного прерывания, так и бесконечный цикл для обработ- ки событий. Важные события, обрабатываемые посредством CLOCK, включают также решения по планированию и перепланированию процессов. CLOCK предлагает непосред- ственный интерфейс с процессами микроядра. Системные службы могут обращаться (к данному файлу) посредством системных вызовов, таких как sys_setalarm().При видоизменении данного файла нельзя использовать send() если получатель не готов принять сообщение. Вместо этого желательно использовать notify().CLOCK – это один из процессов микроядра, не вынесенный в отдельный сервер по сообра- жениям производительности.clock.h (4,0K) – Определяет функции для инициализации таймера и обработчиков тайме- ра.config.h (4,0K) – Определяет конфигурацию микроядра. Позволяет установить размеры буферов ядра, включить или исключить отладочный код, функции контроля времени и отдельные вызовы микроядра. (поэтому здесь содержаться краткие их описания, тем не менее настоятельно рекомендуется сохранять все вызовы микроядра включёнными).Этот файл по логике должен быть одним из основных координирующих файлов, однако похоже, что эта функция уже давно стала атавизмом...const.h (4,0K) – Содержит макросы и константы, используемые в коде микроядра. В частности, содержит макросы для запрещения и разрешения аппаратных прерываний.Общие определения и макросы помещаются в этом файле.
debug.c (12K) – Этот файл содержит отладочные функции, не включённые в стандартное микроядро. Доступные функции включают отсчёт времени для блокировок и проверочные функции для очередей управления.debug.h (4,0K) – Определяет все отладочные константы и макросы,а также некоторые (глобальные) переменные. Некоторые отладочные функции требуют переопределения стандартных констант и макросов, поэтому данный заголовочный файл должен находится ПОСЛЕ остальных заголовочных файлов микроядра.
glo.h (4,0K) – Определяет используемые в микроядре глобальные переменные (сами переменные размещаются в table.o). На данный момент определяет:переменные режима ядра (исключение, выход из системы);переменные-структуры информации о ядре;диагностические сообщения;генератора случайных чисел, средней загрузке;указатель на текущий выполняющийся процесс;указатель на следующий процесс, после restart();указатель на процесс для подсчёта тиков;указатель на первые процессы в очередях restart, request, pagefault;переменную учёта тиков, не учтённых в задании CLOCK.interrupt.c (8,0K) – Система аппаратных прерываний Minix3. Содержит процедуры для управления контроллером прерываний:регистрации/удаления обработчика прерываний (PUBLIC void irq_handle(int irq) вызывается системно зависимой частью при возникновении внешнего прерывания);разрешения/запрещения линии прерываний.Определяет переменную:
interrupt.h (4,0K) – Прототипы для системы аппаратных прерываний.
ipc.h (4,0K) – Этот файл определяет константы для межпроцессного взаимодействия. Определения используются в /kernel/proc.c. Пока это константы NON_BLOCKING, SEND, RECEIVE, SENDREC, NOTIFY, SENDNB, SENDA а также макрос WILLRECEIVE(target,source_ep).
kernel.h (4,0K) – Основной заголовочный файл микроядра Minix3. Однако сам по себе он состоит только из заголовков. В частности, он включает почти все заголовочные файлы из /kernel/ .main.c (16K) – Описывает начальный старт микроядра (оно находится ещё в загрузочном образе и уже имеет набор готовых к исполнению системных процессов – серверов).priv.h (4,0K) – Определяет структуру системы привилегий struct priv. Каждый системный
процесс имеет собственную структуру привилегий, для всех пользовательских процессов используется одна структура привилегий:
proc.c (60K) – Вместе с mpx.s этот файл содержит наиболее низкоуровневую часть микроядра.Содержит точку входа для внешних вызовов: sys_call – системный вызов, когда мы попада- ем в микроядро посредством INT. Имеется также несколько точек входа для прерываний и уровня заданий: lock_send – послать сообщение процессу.Этот файл очень большой и требует дополнительного рассмотрения низкоуровневых функций.Следует только заметить, что PROC является одним из процессов микроядра не вынесен- ным в отдельный сервер по соображениям производительности.proc.h (12K) – Определяет таблицу процессов. Таблица процессов включает
состояние регистров и флагов,приоритет планировщика,таблица памяти,различные учётные данные,информацию, используемую для передачи сообщений (IPC).Многие ассемблерные процедуры обращаются к полям этой структуры. Смещения опреде- лены в ассемблерном включаемом файле kernel/arch/i386/sconst.h. Эти два файла должны соответствовать друг другу!Кроме того определены флаги исполнения (runtime) и макросы, для их проверки, установки, очистки.
profile.c (8,0K) – Этот файл содержит несколько функций и переменных, используемых для системного профилирования: статистическое профилирование (обработчик преры- ваний для часов профилирования) и профилирование вызовов (таблица, используемая для данных профилирования, а также функция для определения её размеров; функция
используется процессами микроядра для регистрации их управляющих структур и таблицы профилирования).profile.h (4,0K) – Определяет переменные для профилирования. Зависит от /include/minix/profile.h Содержит общую опцию
proto.h (8,0K) – Файл содержит все прототипы функций (публичного интерфейса), опре- делённых в файлах clock.c, main.c, utility.c, proc.c, start.c, system.c, system/do_newmap.c, system/do_vtimer.c, interrupt.c, debug.c, system/do_safecopy.c, system/do_sysctl.c, profile.c директории /kernel, включая части, зависящие от конкретной платформы.smp.c (8,0K) – архитектурно-зависимая реализация режима мультипроцессорности.
smp.h (4,0K) – заголовок для симметричной мультипроцессорности.
system.c (24,0K) – Обеспечивает интерфейс между микроядром и серверами системных вызовов. Для отображения системных вызовов на функции, их обеспечивающие приме- няется внутренний вектор вызовов. Сами эти функции находятся в отдельных файлах (/kernel/system/). Вектор вызовов используется в основном цикле системного задания для обработки входящих запросов.Кроме основной точки входа (sys_task()), в котором и запускается основной цикл, имеется ещё несколько точек входа:get_priv – заполняет структуру привилегий для пользовательского или системного процесса,set_sendto_bit – позволяет процессу послать сообщение в новом направлении (рас- ширяет привилегии),unset_sendto_bit – запрещает процессу послать сообщение в новом направлении (сужает привилегии),send_sig – посылает сигнал прямо системному процессу,cause_sig – выполняет действие вызванное сигналом вызывая событие через сервер управления процессами,sig_delay_done – сообщает серверу управления процессами что процесс не посылает,umap_bios – отображает виртуальный адрес в BIOS_SEG на физический,get_randomness – накапливает случайности в буфер,
clear_endpoint – лишает процесс возможности посылать и принимать сообщения.SYS является одним из заданий микроядра.
system.h (8,0K) – Прототипы функций системной библиотеки. Сами функции нахо- дятся в /kernel/system/. Если вызов микроядра не включён посредством конфигурации/kernel/config.h, то функция становится синонимом do_unused().
Системная библиотека делает доступным системный сервис посредством вызовов микрояд- ра. Системные вызовы трансформируются в сообщения-запросы к заданию SYS, способному выполнить соответствующий вызов.По соглашению sys_call() преобразуется в сообщение с типом SYS_CALL, которое обраба- тывается функцией do_call().table.c (4,0K) – Содержит большинство данных микроядра. Непосредственно в данном файле определеныконстанты препроцессора:для размеров стеков заданий микроядра,
флаги для различных типов процессов (микроядра),
списки FS_C и DRV_C (разрешённых высовов микроядра),
макросы препроцессора:для определения масок системных вызовов для различных типов процессов,
глобальные переменные:– fs_c[], pm_c[], rs_c[], ds_c[], vm_c[], drv_c[], usr_c[], tty_c[], mem_c[],
PUBLIC struct boot_image image[]
EXTERN внутри данного файла принимает значение пустой строки, поэтому глобальные переменные определённые в заголовочных файлах реально привязываются к данному файлу (место им выделяется в table.o).type.h (4,0K) – Определяет типы, связанные с таблицей процессов и другими свойствами (переменными) системы (микроядра): task_t, proc_nr_t, sys_id_t, sys_map_t, struct boot_image, irq_policy_t, irq_id_t, struct irq_hook, irq_hook_t, irq_handler_t.
utility.c (4,0K) – Этот файл содержит коллекцию различных процедур:
minix_panic – прерывает MINIX в связи с фатальной ошибкой,
kputc – буферизированный putc, используемый функцией kprintf,kprintf – посредством включения файла lib/sysutil/kprintf.c и замены printf на kprintf посредством препроцессора.vm.h (4,0K) – Содержит константы препроцессора: VMSUSPEND, EFAULT_SRC, EFAULT_DST и макросы: FIXLINMSG(prp), PHYS_COPY_CATCH(src, dst, size, a).Файл связан с механизмами виртуальной памяти.
watchdog.c (4,0K) – реализация архитектурно-зависимого механизма watchdog, исполь- зуемого для выявления ошибок в ядреwatchdog.h (4,0K) – прототип механизма watchdog
Директория /kernel/system
do_abort.c (4,0K) – Реализуется вызов микроядра SYS_ABORT (прерывание работы OS Minix3)Параметры:
ABRT_HOW – как выполнить прерывание работы OS Minix3)ABRT_MON_ENDPT – номер процесса параметры монитора которого берутсяABRT_MON_LEN – длина параметров монитораABRT_MON_ADDR – виртуальный адрес параметровdo_copy.c (4,0K) – Реализуется вызовы микроядра SYS_VIRCOPY (копирование обла- стей виртуальной памяти), SYS_PHYSCOPY (копирование областей физической памяти).Параметры:
CP_SRC_SPACE – виртуальный сегмент копируемых данныхCP_SRC_ADDR – смещение копируемых данных относительно сегментаCP_SRC_PROC_NR – номер процесса из виртуальной памяти которого происходит копированиеCP_DST_SPACE – виртуальный сегмент, куда копируются данныеCP_DST_ADDR – смещение относительно виртуального сегмента, куда копируются данные
CP_DST_PROC_NR – номер процесса, в виртуальное адресное пространство кото- рого копируются данныеCP_NR_BYTES – размер копируемых данных в байтахdo_cprofile.c (8,0K) – Реализуется вызов микроядра SYS_CPROFILE (профилирование вызовов).Параметры:
PROF_ACTION – получить/сбросить данные профилированияPROF_MEM_SIZE – доступная память для данныхPROF_ENDPT – узловая точка вызывающегоPROF_CTL_PTR – расположение информационной структурыPROF_MEM_PTR – местоположение памяти для данныхdo_devio.c (4,0K) – Реализуется вызов микроядра SYS_DEVIO (Осуществляет низко- уровневый ввод/вывод в порты ввода/вывода)Параметры:
DIO_REQUEST – запрос на ввод или выводDIO_PORT – порт для ввода/выводаDIO_VALUE – возвращает прочтённое значениеdo_mapdma.c (4,0K) – Реализуется вызов микроядра SYS_MAPDMA (Выделяет об- ласть для выполнения операции устройства с непосредственным доступом к памяти.)Параметры:
CP_SRC_ADDR – Виртуальный адрес.CP_NR_BYTES – Размер структуры данных.do_endksig.c (4,0K) – Реализуется вызов микроядра SYS_ENDKSIG (Вызывается сер- вером управления процессами (PM) после обработки сигнала процессу SYS_GETKSIG. Обычно это сигнал прерывания процесса.)Параметры:
SIG_ENDPT – Процесс, для которого выполнено задание сервера управления про- цессами (PM)
do_exec.c (4,0K) – Реализуется вызов микроядра SYS_EXEC (Замена контекста процес- са.)Параметры:
PR_ENDPT – Процесс, вызвавший execPR_STACK_PTR – Новый указатель на стекPR_NAME_PTR – Указатель на имя программыPR_IP_PTR – Новый указатель инструкцийdo_exit.c (4,0K) – Реализуется вызов микроядра SYS_EXIT (Завершает процесс.) Параметры:PR_ENDPT – Номер слота завершающегося процесса.do_fork.c (8,0K) – Реализуется вызов микроядра SYS_FORK (Создание нового процессакопии родительского.) Параметры:PR_ENDPT – Родитель, процесс, который разветвляетсяPR_SLOT – Слот порождаемого процесса-ребёнка в таблице процессов.PR_MEM_PTR – Новая карта памяти для процесса-ребёнка.PR_FORK_FLAGS – Флаги-параметры вызова fork.do_getinfo.c (8,0K) – Реализуется вызов микроядра SYS_GETINFO (Запрос на систем- ную информацию, которая копируется в адресное пространство запрашивающего процесса. Этот вызов просто копирует соответствующие структуры данных запрашивающему про- цессу.)Параметры:
I_REQUEST – Какую информацию?I_VAL_PTR – Куда её поместить?I_VAL_LEN – Максимальная возможная длинаI_VAL_PTR2 – Второй параметр (может не быть)I_VAL_LEN2_E – Вторая длина или номер процесса.
do_getksig.c (4,0K) – Реализуется вызов микроядра: SYS_GETKSIG (Сервер управления процессами (PM) готов обрабатывать сигналы и периодически делает вызов микроядра для получения очередного сигнала.)Параметры:
SIG_ENDPT – Процесс, посылающий сигналSIG_MAP – Набор битов сигналаdo_irqctl.c (8,0K) – Реализуется вызов микроядра SYS_IRQCTL (Позволяет , в частно- сти, вставить новый обработчик прерываний. Возвращает индекс ловушки прерывания, назначенный в микроядре.)Параметры:
IRQ_REQUEST – Контрольная операция, которую надо выполнить.IRQ_VECTOR – Линия прерываний, которая должна быть проверена.IRQ_POLICY – Позволяет вновь разрешить прерывания.IRQ_HOOK_ID – Предоставляет индекс, который будет возвращён при прерывании.do_kill.c (4,0K) – Реализуется вызов микроядра SYS_KILL (Обеспечивает sys_kill(). Вызывает посылку сигнала процессу. Сервер управления процессами (PM) – централь- ный сервер, где обрабатываются все сигналы и обеспечиваются регистрация порядка их обработки. Любой запрос, за исключением запросов сервера управления процессами (PM), добавляется в "карту"необработанных сигналов, а сервер управления процессами (PM) информируется о поступлении нового сигнала. Так как системные серверы не могут ис- пользовать нормальные POSIX сигналы (ввиду того, что они обычно блокируют процесс на их получении), они могут запросить сервер управления процессами (PM) преобразовать сигналы в сообщения. Это выполняется сервером управления процессами (PM) посредством вызова sys_kill().)Параметры:
SIG_ENDPT – процесс, которому посылается сигнал/ необработанныйSIG_NUMBER – Номер сигнала, который посылается процессу.
do_memset.c (4,0K) – Реализуется вызов микроядра SYS_MEMSET (Записывает обра- зец в определённый участок памяти.)Параметры:
MEM_PTR – виртуальный адресMEM_COUNT – возвращает физический адресMEM_PATTERN – байт-образец, которым заполняется областьdo_privctl.c (12K) – Реализуется вызов микроядра SYS_PRIVCTL (Обновляет приви- легии процесса. Если процесс пока не является системным процессом, выделяет ему его собственную структуру привилегий.)Параметры:
CTL_ENDPT – Точка окончания целевого процесса.CTL_REQUEST – Запрос контроля привилегий.CTL_ARG_PTR – Указатель на запрашиваемые данные.do_profbuf.c (4,0K) – Реализуется вызов микроядра SYS_PROFBUF (При помощи данного вызова микроядра профилируемые процессы и информируют микроядро о ме- стоположении их таблицы профилирования и контрольной структуры. Вызов микроядра используется системой профилирования когда установлена опция профилирования вызо- вов.)Параметры:
PROF_CTL_PTR – Местоположение контрольной структуры.PROF_MEM_PTR – Местоположение таблицы профилирования.do_runctl.c (4,0K) – Реализуется вызов микроядра SYS_RUNCTL Контролирует флаги PROC_STOP процесса. Используется для управления процессами. В некоторых случаях устанавливает MF_SIG_DELAY вместо PROC_STOP. Используется сервером управления процессами (PM) для надёжности управления сигналами.)Параметры
RC_ENDPT – Номер контролируемого процесса.RC_ACTION – Останавливает или восстанавливает исполнение процесса.RC_FLAGS – Флаги запроса.do_safecopy.c (12K) – Реализуется вызовы микроядра SYS_SAFECOPYFROM, SYS_SAFECOPY SYS_VSAFECOPY (Безопасное копирование. Копирование областей памяти с контролем разрешений.)Параметры:
SCP_FROM_TO – другая точка окончанияSCP_INFO – находящийся в собственности вызывающего процесса сегмент из/в который происходит копирование.SCP_GID – Идентификатор разрешенияSCP_OFFSET – Смещение внутри разрешённой области.SCP_ADDRESS – Адрес в собственном адресном пространстве.SCP_BYTES – Размер копируемой области в байтах.do_nice.c (4,0K) – Реализуется вызов микроядра SYS_NICE (Изменяет приоритет про- цесса или прекращает выполнение процесса.)Параметры:
PR_ENDPT – Номер процесса, приоритет которого изменяется.PR_PRIORITY – Новый приоритет.do_segctl.c (4,0K) – Реализуется вызов микроядра SYS_SEGCTL (Возвращает пере- ключатель сегмента и смещение, которые могут быть использованы для достижения физических адресов, для использования в драйверах выполняющих отображённый на память ввод/вывод в области A0000 – DFFFF.)Параметры:
SEG_PHYS – Базовый физический адрес.SEG_SIZE – Размер сегмента.SEG_SELECT – Возвращает переключатель сегмента.SEG_OFFSET – Возвращает смещение внутри сегмента.SEG_INDEX – Возвращает индекс опосредованной памяти. do_sysctl.c (4,0K) – Реализуется вызов микроядра SYS_SYSCTL. Параметры:SYSCTL_CODE – Запрос.SYSCTL_ARG1 – Специфические для запроса аргументы.SYSCTL_ARG2 – Специфические для запроса аргументы.do_setalarm.c (4,0K) – Реализуется вызов микроядра SYS_SETALARM (Выполняет запрос на синхронный сигнал, или на отмену синхронного сигнала.)
Параметры:
ALRM_EXP_TIME – Время до подачи сигнала.ALRM_ABS_TIME – Абсолютное время до подачи сигнала.ALRM_TIME_LEFT – Возвращает секунды, прошедшие от предыдущего сигнала.do_setgrant.c (4,0K) – Реализуется вызов микроядра SYS_SETGRANT (Устанавливает разрешения.)Параметры:
SG_ADDR – Адрес таблицы разрешений в собственном адресном пространстве.SG_SIZE – Число записей таблицыdo_sigreturn.c (4,0K) – Реализуется вызов микроядра SYS_SIGRETURN (Запрос в стиле сигналов POSIX. Требует, чтобы sys_sigreturn упорядочил всё прежде, чем сигнали- зирующий процесс мог снова выполняться.)Параметры:
SIG_ENDPT – Процесс, возвращающийся из обработкиSIG_CTXT_PTR – Указатель на структуру контекстов сигналовdo_sigsend.c (8,0K) – Реализуется вызов микроядра SYS_SIGSEND (Обеспечение сиг- налов в стиле POSIX.)Параметры:
SIG_ENDPT – Процесс для вызова обеспечения сигналаSIG_CTXT_PTR – Указатель на структуру контекста сигналовSIG_FLAGS – Флаги для вызова S_SIGRETURN.do_sprofile.c (4,0K) – Реализуется вызов микроядра SYS_SPROFILE (Обеспечивает статистическое профилирование.)Параметры:
PROF_ACTION – Начинает/прекращает профилирование.PROF_MEM_SIZE – Доступная память для данных.PROF_FREQ – Частота запрашиваемого образца.PROF_ENDPT – Конечная точка запрашивающего.
PROF_CTL_PTR – Местоположение информационной структуры.PROF_MEM_PTR – Местоположение памяти для данных.do_stime.c (4,0K) – Реализуется вызов микроядра SYS_STIME (Системное время) Параметры:T_BOOTITME – Время с момента загрузки системыdo_times.c (4,0K) – Реализуется вызов микроядра SYS_TIMES (Устанавливает инфор- мацию о времени в сообщение. Прерывание часов (таймера) может обновить системное время, что не мешает данному коду.)Параметры:
T_ENDPT – Получает информацию для данного процесса.do_trace.c (8,0K) – Реализуется вызов микроядра SYS_TRACE (Обеспечивает отладоч- ную трассировку.)Параметры:
CTL_ENDPT – Трассируемый процесс.CTL_REQUEST – Запрос трассирования.CTL_ADDRESS – Адрес в пространстве трассируемого процесса.CTL_DATA – Данные, которые должны быть записаны, или место для возвращаемых данных.do_umap.c (4,0K) – Реализуется вызов микроядра SYS_UMAP (Создаёт карту отобра- жения виртуальных адресов на физические)Параметры:
CP_SRC_PROC_NR – Номер процесса.CP_SRC_SPACE – Сегмент, где находится адрес: T (код), D (данные), или S (стек).CP_SRC_ADDR – Виртуальный адрес.CP_DST_ADDR – Возвращает физический адрес.CP_NR_BYTES – Размер структуры данных.do_newmap.c (8,0K) – Реализуется вызов микроядра SYS_NEWMAP (Создаёт новую карту памяти)Параметры:
PR_ENDPT – устанавливает новую карту памяти для этого процессаPR_MEM_PTR – указатель на новую карту памятиdo_vcopy.c (8,0K) – Реализуется вызовы микроядра SYS_VIRVCOPY, SYS_PHYSVCOPY (Копирования физической/виртуальной памяти.)Параметры:
VCP_VEC_SIZE – Размер вектора, запрашиваемого на копирование.VCP_VEC_ADDR – Адрес вектора (в адресном пространстве запрашивающего процесса.VCP_NR_OK – Число успешно скопированных байт, или элементов вектора.do_vdevio.c (8,0K) – Реализуется вызов микроядра SYS_VDEVIO (Выполняет серию операций с устройствами ввода/вывода от имени процесса (а не задания микроядра). Адреса ввода/вывода и значения ввода/вывода получаются или возвращаются в некоторый буфер в адресном пространстве процесса. Реальный ввод/вывод обрамлен lock() и unlock(), во избежание прерываний. Является вызовом, родственным do_devio, выполняющим одиночную операцию с устройством ввода/вывода.)Параметры:
DIO_REQUEST – Запрос на ввод или вывод.DIO_VEC_ADDR – Указатель на пару порт/значение.DIO_VEC_SIZE – Число портов для ввода/вывода.do_vmctl.c (8,0K) – Реализуется вызов микроядра SYS_VMCTL (Обеспечивает нужды виртуальной памяти)Параметры:
SVMCTL_WHO – Какой процесс?SVMCTL_PARAM – Устанавливает имя параметраSVMCTL_VALUE – Устанавливает значение параметра do_vtimer.c (4,0K) – Реализуется вызов микроядра SYS_VTIMER Параметры:VT_WHICH – Таймер: VT_VIRTUAL или VT_PROFVT_SET – Установить или просто получить?
VT_VALUE – Новое/старое время достижения в тиках.VT_ENDPT – Процесс, которому принадлежит таймер.
Директория /kernel/arch/i386/include
archconst.h (8,0K) – Содержит константы для защищённого режима процессора i386.
archtypes.h (4,0K) – Определяет типы и структуры для регистров процессора, сегмент- ного дескриптора защищённого режима процессора, страничных исключений
Директория /kernel/arch/i386
arch_do_vmctl.c (4,0K) – Реализуется вызов микроядра SYS_VMCTL (Обеспечивает нужды виртуальной памяти. Архитектурно зависимая часть.)Параметры:
SVMCTL_WHO – Какой процесс?SVMCTL_PARAM – Устанавливает имя параметраSVMCTL_VALUE – Устанавливает значение параметраclock.h (4.0K) – Прототипы функций инициализации, сброса и чтения значения счётчика системного таймера 8253A. Архитектурно зависимая часть.clock.c (4.0K) – Реализует функции:
Инициализирует канал 0 таймера 8253A устанавливая частоту 60 гц, регистрирует обра- ботчик прерываний задания CLOCK для выполнения каждый тик.
Сбрасывает частоту таймера на значение BIOS (Для перезагрузки.)
Считывает счётчик по каналу 0 таймера 8253A. Счётчик отсчитывает в обратном порядке с частотой TIMER_FREQ и возвращается в значение TIMER_COUNT-1 , когда достигает нулевого значения. Аппаратное прерывание (тик) возникает в момент, когда счётчик достигает нулевого значения и возобновляет свой цикл.
do_int86.c (4.0K) – Реализуется вызов микроядра SYS_INT86. Параметры:INT86_REG86do_iopenable.c (4.0K) – Реализуется вызов микроядра SYS_IOPENABLE. Параметры:IO_ENDPT – Процесс, которому устанавливаются биты уровня защиты ввода/вывода.do_readbios.c (4.0K) – Реализуется вызов микроядра SYS_READBIOS (Получает дан- ные BIOS.)Параметры:
RDB_SIZE – Число байт, которые надо скопироватьRDB_ADDR – Абсолютный адрес в зоне BIOS.RDB_BUF – Адрес буфера в запрашивающем процессе.do_sdevio.c (4.0K) – Реализуется вызов микроядра SYS_SDEVIO (Доступ к портам ввода/вывода.)