2012-02-02 3 views
1

системный вызов, исключение, деленное на 0 и т. Д., Все они имеют одну и ту же векторную запись в linux. Если в x86 оно равно 0x80, правильно? Так как насчет сигнала? Использует ли ОС также метод int 0x80 для сигнала к процессу? если да, кто называет это? Мы знаем, хотите ли вы ловушку в ядре, вы должны вызвать int 0x80 или его оболочку, как системный вызов, но для случая сигнала, который вызывает 0x80?Для сигнала в linux, который вызывает int 0x80?

+2

Возможно, вы сбиты с толку. Сигнал посылается ядром в процесс приложения (поэтому ему не нужно никаких «int» или trap). Читайте http://basepath.com/aup/ http://www.advancedlinuxprogramming.com/ http://tldp.org/HOWTO/Assembly-HOWTO/ –

+0

'int 80h' используется для генерации прерывания (CPU прекратит выполнение текущего кода и перескакивает в вектор, индексированный номером int). «Деление на ноль» - это другой способ генерации прерывания (он генерируется самим ЦП, когда второй аргумент «DIV» равен нулю), и обрабатывается как «int 0h». Векторный элемент указывает на конкретный ** Обработчик прерываний **, который является частью ядра ОС. Обработчик проверяет, что делать, поведение для каждого номера int различно. Например. в течение 80 часов обработчик начнет выбранный системный вызов (с переключением из режима пользователя в режим ядра); для 0h он будет генерировать сигнал. – osgx

ответ

6

Прежде всего ,. int 0x80 не используется современной ОС для современных процессоров Intel в течение длительного времени. обычно используется команда sysenter (см.: http://siyobik.info/main/reference/instruction/SYSENTER).

Что касается сигналов, то есть два случая -

Если цель сигнала не работают на процессоре, когда сигнал посылаются, то посылает сигнал ничего более маркировки немного в данном ядре структуру, которая указывала ядру, что при планировании этого процесса обратно в ЦП поставить программный счетчик на процедуру обработки сигнала, а не на оригинальный ПК.

Если, однако, программа, по которой вы посылаете сигнал, запускается на CPU при отправке сигнала, сигнал запускается как прерывание - если сигнал синхронный (например, деление на ноль исключение), прерывание - это прерывание исключения, которое генерируется из ядра ЦП. Если сигнал является асинхронным (например, другой процесс, выполняющийся на другом ядре, отправляющем сигнал), прерывание представляет собой прерывание между процессорами, отправленное из этого другого ядра.

Итак, нет int 0x80 в любом месте :-)

4

В основном сигналы не похожи на прерывания. Процесс на уровне пользователя периодически прерывается ядром. Когда он собирается отправить сигнал процессу пользовательского уровня, ядро ​​просто заставляет указатель инструкции процесса уровня пользователя указывать на код обработчика сигнала, прежде чем планировать его снова. Он также устанавливает соответственно стеки и другие регистры.

+0

Согласовано, за исключением того, что на большом расстоянии концептуально (но не в деталях) асинхронные сигналы немного напоминают прерывания ... (даже если они, конечно, не прерываются) –

+1

Pls, прочитайте вопрос. «Деление на ноль» - прерывание (синхронное, с программным обеспечением, проверка http://pdos.csail.mit.edu/6.828/2005/lec/lec8-slides.pdf). Он будет обрабатываться обработчиком прерываний в ядре (вот настройка обработчика http://lxr.linux.no/#linux+v2.6.33/arch/x86/kernel/traps.c#L891).Он (в функции do_trap) установит «флаг» ожидающего сигнала и заставит немедленную доставку сигнала с помощью «force_sig_info» – osgx

3

Когда вы звоните syscall, вы используете int 0x80.

Однако, когда вы получаете сигнал, будь то от другого процесса или SIGSEGV или SIGFPE, вам не нужно звонить int 0x80, чтобы получить его.

Что происходит, так это то, что прерывание таймера, которое обрабатывает вызовы sched_tick, также проверяет, есть ли ожидающий сигнал перед возвратом управления в процесс пользовательского пространства, а если он существует (и его сигнальная маска позволяет), вызывает соответствующий сигнал обработчик.

+2

Кроме того, когда сигнал будет получен, ядро ​​устанавливает столбец так, что syscrection syscall вызванный сразу после возвращения из обработчика сигнала пользователя ... –

+0

ориентированное на возвращение программирование на его самом прекрасном = D – cha0site

Смежные вопросы