Перейти на главную   
  helloworld.ru - документация и книги по программированию  
helloworld.ru - документация и книги по программированию
    главная     хостинг    
Поиск по сайту:  
Смотрите также
Языки программирования
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Интернет-технологии
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
протоколы TCP/IP
Apache

Web-дизайн
HTML
Дизайн
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Программирование игр
DirectDraw
DirectSound
Direct3D
OpenGL
3D-графика
Графика под DOS

Алгоритмы
Численные методы
Обработка данных

Сис. программирование
Драйверы

Базы данных
MySQL
SQL

Другое

Хостинг


Друзья
demaker.ru
Реклама

Лучший хостинг. Аренда серверов




helloworld.ru

5.3. Как Linux устанавливает вектора системных вызовов

Код startup_32 находящийся в /usr/src/linux/boot/head.S начинает всю работу запуская setup_idt(). Подпрограмма устанавливает IDT (таблицу описания прерываний) с 256 записями. Никаких отправных точек прерываний этой программой не загружается, и делается это лишь после разрешения пейджинга и перехода ядра по адресу 0xC0000000. В IDT находится 256 записей по 4 байта каждая, всего 1024 байта.

Когда вызывается start_kernel() (/usr/src/linux/init/main.c) она запускает trap_init() (описае в /usr/src/linux/kernel/traps.c). trap_init() устанавливает таблицу дескрипторов прерываний как показано на рис 4.3

         0  -   divide_error (ошибка деления)
         1  -   debug (отладка)
         2  -   nmi (немаскируемое прерывание)
         3  -   int3
         4  -   overflow (переполнение)
         5  -   bounds (достижение границ)
         6  -   invalid_op (неверный процесс)
         7  -   device_not_avaible (обращение к устройству невозможно)
         8  -   double_fault (двойная ошибка)
         9  -   coprocessor_segment_overrun (перезапуск сегмента сопроцкссора)
         10 -   invalid TTS (неверная TTS)
         11 -   segment_not_present (отсутствие сегмента)
         12 -   stack_segment (стековый сегмент)
         13 -   general_protection (общая защита)
         14 -   page_fault (ошибка чтения страницы)
         15 -   не используется
         16 -   coprocessor_error(ошибка сопроцессора)
         17 -   alignment_check(проверка расстановки)
         18-48- не используются

На этот момент вектор прерывания системных вызовов не установлен. Он инициализируется sched_init() (находится в /usr/src/linux/kernel/sched.c). Вызов set_system_gate (0x80,&system_call) устанавливает прерывание 0x80 как вектор параметра system_call().

5.4. Как установить свой собственный системный вызов

  • Создайте каталог в /usr/src/linux/ для вашего кода.
  • Поместите нужные вам библиотеки в /usr/include/sys/ и /usr/include/linux/
  • Поместите ваш отлинкованный модуль в ARCHIVES и подкаталог в строки SUBDIRS высокого уровня создания файла. См fs/Makefile - fs.o.
  • Поместите #define __NR_xx в unistd.h для присвоения номера вашему системному запросу, где xx - индекс описания вашего вызова. Она будет использована для установки вектора с помощью sys_call_table вызываемого ваш код.
  • Введите отправную точку для вашего системного запроса в sys_call_table в sys.h. Она будет зависеть от индекса xx в предыдущем пункте. Переменная NR_syscalls будет пересчитана автоматически.
  • Измените какой-нибудь код ядра в /fs/mm/ для установки инсрументов нужных вашему вызову.
  • Запустите процесс компановки на высшем уровне для создания вашего кода в ядре

    После этого вам останется лишь занести системный вызов в ваши библиотеки, или использовать макрос _syscalln() в программе использующей ваши разработки, для разрешения им доступа к новому системному вызову.

    В библиографии содержаться несколько полезных ссылок на книги охватывающие эту тему. В частности полезно будет просмотреть "The 386DX Microprocessor Programmer's Reference Manual" и "Advanced 80386 Programming Techniques" Джеймса Турли.


    [ Назад | Оглавление | Далее ]









  • helloworld.ru © 2001-2021
    Все права защищены