системный вызов, исключение, деленное на 0 и т. Д., Все они имеют одну и ту же векторную запись в linux. Если в x86 оно равно 0x80, правильно? Так как насчет сигнала? Использует ли ОС также метод int 0x80 для сигнала к процессу? если да, кто называет это? Мы знаем, хотите ли вы ловушку в ядре, вы должны вызвать int 0x80 или его оболочку, как системный вызов, но для случая сигнала, который вызывает 0x80?Для сигнала в linux, который вызывает int 0x80?
ответ
Прежде всего ,. int 0x80 не используется современной ОС для современных процессоров Intel в течение длительного времени. обычно используется команда sysenter (см.: http://siyobik.info/main/reference/instruction/SYSENTER).
Что касается сигналов, то есть два случая -
Если цель сигнала не работают на процессоре, когда сигнал посылаются, то посылает сигнал ничего более маркировки немного в данном ядре структуру, которая указывала ядру, что при планировании этого процесса обратно в ЦП поставить программный счетчик на процедуру обработки сигнала, а не на оригинальный ПК.
Если, однако, программа, по которой вы посылаете сигнал, запускается на CPU при отправке сигнала, сигнал запускается как прерывание - если сигнал синхронный (например, деление на ноль исключение), прерывание - это прерывание исключения, которое генерируется из ядра ЦП. Если сигнал является асинхронным (например, другой процесс, выполняющийся на другом ядре, отправляющем сигнал), прерывание представляет собой прерывание между процессорами, отправленное из этого другого ядра.
Итак, нет int 0x80 в любом месте :-)
В основном сигналы не похожи на прерывания. Процесс на уровне пользователя периодически прерывается ядром. Когда он собирается отправить сигнал процессу пользовательского уровня, ядро просто заставляет указатель инструкции процесса уровня пользователя указывать на код обработчика сигнала, прежде чем планировать его снова. Он также устанавливает соответственно стеки и другие регистры.
Согласовано, за исключением того, что на большом расстоянии концептуально (но не в деталях) асинхронные сигналы немного напоминают прерывания ... (даже если они, конечно, не прерываются) –
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
Когда вы звоните syscall
, вы используете int 0x80
.
Однако, когда вы получаете сигнал, будь то от другого процесса или SIGSEGV
или SIGFPE
, вам не нужно звонить int 0x80
, чтобы получить его.
Что происходит, так это то, что прерывание таймера, которое обрабатывает вызовы sched_tick
, также проверяет, есть ли ожидающий сигнал перед возвратом управления в процесс пользовательского пространства, а если он существует (и его сигнальная маска позволяет), вызывает соответствующий сигнал обработчик.
Кроме того, когда сигнал будет получен, ядро устанавливает столбец так, что syscrection syscall вызванный сразу после возвращения из обработчика сигнала пользователя ... –
ориентированное на возвращение программирование на его самом прекрасном = D – cha0site
- 1. mmap in nasm using int 0x80 on linux x86
- 2. Добавление файла с int 0x80 (бит доступа?)
- 3. malloc in linux обработчик сигнала вызывает тупик
- 4. int $ 0x80 в программировании с нуля
- 5. Что означает «int 0x80» в коде сборки?
- 6. Записывает ли регистры значения int 0x80?
- 7. С чипами x86 есть ли инструкции INT, кроме 0x80?
- 8. Как ядро знает разницу между «int 0x80» и «int x»
- 9. num1> = 0x80 - Что такое 0x80?
- 10. как принудительно использовать int $ 0x80 вместо sysenter для обнаружения syscall
- 11. Возврат boolean из метода, который вызывает Int
- 12. Не удается открыть файл в Linux через 0x80
- 13. Linux получает прерывание сигнала для программы ttycontrol
- 14. «siginfo_t * info» сигнала «вызывает ошибку сегментации»
- 15. Linux: источник сигнала
- 16. Потеря сигнала дочернего процесса Linux
- 17. обнаружить отправителя сигнала (linux, ptrace)
- 18. Проблема с Perl сигнала INT
- 19. Ошибка при обработке сигнала для процессов в Linux
- 20. Использование sig_atomic_t в функции маски сигнала linux
- 21. Удаление обработчика сигнала C (Linux)
- 22. Как написать обработчик сигнала для сигнала сигабра?
- 23. Ассамблея Intel 0x80 против 80h
- 24. Linux: Можно ли выгрузить эквалайзер сигнала?
- 25. как установить vriable для эхо-сигнала в командной строке Linux
- 26. прерывание перекодировки 128 0x80 в xinu
- 27. Добавление `int` для адреса вызывает добавление int 4 раза
- 28. sigaction и игнорирование сигнала с помощью c в среде linux
- 29. Получить значение ИН из сигнала Int
- 30. Linux Bluetooth программа l2ping с силой сигнала
Возможно, вы сбиты с толку. Сигнал посылается ядром в процесс приложения (поэтому ему не нужно никаких «int» или trap). Читайте http://basepath.com/aup/ http://www.advancedlinuxprogramming.com/ http://tldp.org/HOWTO/Assembly-HOWTO/ –
'int 80h' используется для генерации прерывания (CPU прекратит выполнение текущего кода и перескакивает в вектор, индексированный номером int). «Деление на ноль» - это другой способ генерации прерывания (он генерируется самим ЦП, когда второй аргумент «DIV» равен нулю), и обрабатывается как «int 0h». Векторный элемент указывает на конкретный ** Обработчик прерываний **, который является частью ядра ОС. Обработчик проверяет, что делать, поведение для каждого номера int различно. Например. в течение 80 часов обработчик начнет выбранный системный вызов (с переключением из режима пользователя в режим ядра); для 0h он будет генерировать сигнал. – osgx