• Песок карьерный доставка

    песок карьерный доставка

    www.all4stroyki.ru

  • Лучшие электрические печи для саун

    лучшие электрические печи для саун

    www.pechilux.ru





Linux Kernel (Ядро линукса) (часть 2)


Выход из системного вызова

Когда служебная процедура системного вызова завершает работу, функция system caii получает код возврата из регистра еах и записывает его в то место стека, где было сохранено содержимое регистра еах в режиме пользователя:
movl еах, 24(esp)
В результате процесс режима пользователя найдет код возврата системного вызова в регистре еах.
Затем функция system caii о отключает локальные прерывания и проверяет флаги В структуре thread_info процесса current:
cli
movl 8(ebp), ecx testw $0xffff, cx je restore_all
Поле flags имеет смещение 8 в структуре thread info, а маска Oxffff выделяет биты, кроме флага tif polling nrflag. Если ни один из этих флагов не установлен, функция переходит на метку restore aii. Как сказано в главе 4, код, расположенный по этому адресу, восстанавливает содержимое регистров, сохраненное в стеке режима ядра, и выполняет ассемблерную инструкцию iret, чтобы возобновить выполнение процесса в режиме пользователя.

Если хотя бы один из флагов установлен, функция должна проделать определенную работу до возвращения в режим пользователя. Если установлен флаг
TIF SYSCALL TRACE, фуНКЦИЯ system call ВТОрОЙ раз ВЫЗЫВаеТ фуНКЦИЮ do_syscall_trace , а затем переходит на метку resume_userspace. ЕСЛИ же флаг TIF SYSCALL TRACE сброшен, фуНКЦИЯ ПереХОДИТ на метку work_pending.

Код, расположенный ПО адресам resume_userspace И work pending, Проверяет наличие запроса на перепланирование процессов, режим виртуального 8086, наличие сигналов, ожидающих доставки, и режим пошагового выполнения. Затем в любом случае совершается переход на метку restore aii, чтобы возобновилось выполнение процесса в режиме пользователя.

Выполнение системного вызова с помощью инструкции sysenter

Ассемблерная инструкция int является медленной по своей природе, потому что она выполняет ряд проверок на непротиворечивость и безопасность. Инструкция sysenter, получившая в документации Intel название Быстрый системный вызов”, предоставляет более быстрый способ переключения из режима пользователя в режим ядра.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без проблем

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга для вас. А так как к книге прилагается компакт- диск с готовой к работе операционной системой Knoppix Live CD, то лишь достаточно вставить его в привод и перегрузить компьютер,...

Linux Kernel (Ядро линукса) (часть 1)

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть другие прерывания того же типа, и другие процессоры могут приступить к их обработке. Без спин-блокировки к главному дескриптору прерывания могли бы обратиться сразу несколько процессоров. Как мы...

Linux Kernel (Ядро линукса) (часть 2)

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно неуклюже: получив системный вызов fork о, ядро в буквальном смысле дублировало все адресное пространство родителя и присваивало копию процессу-потомку. Такая операция...

Linux Kernel (Ядро линукса) (часть 3)

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer head. Этот дескриптор содержит всю информацию, необходимую ядру для работы с блоком, так что перед обработкой блока ядро обязательно проверяет голову...