Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
1

програмные прерывания

17.08.2019, 19:09. Показов 2426. Ответов 25
Метки нет (Все метки)

Как вызвать программное прерывание? Читаю книгу по системному программированию и в ней сейчас "прохожу тему" системных вызовов и там есть описание как они вызываются и обрабатываются ,так вот
Если программе нужно сделать системный вызов то она вызывает программное прерывание int со значением 0x80 ,далее вызывается обработчик прерываний ,для 0x80 обработчик системных вызовов и далее уже обрабатывается вызов.
Каким образом вызывается(или создается) программное прерывание?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.08.2019, 19:09
Ответы с готовыми решениями:

Програмные требования
Допустим я создал в MS Visual Studio 2012 проект, зарелизил .exe, какие системные требовани будут у...

програмные файлы, что делать?
при после компиляции программы, если удалить папку debug, то прога не запускается, выдает ошибку,...

Как запустить програмные файлы
Со стороны, понимаю, вопрос кажется детским. Тем более, что если человек спрашивающий считает себя...

прерывания
можно ли создать такую программу, которая вообще никак не будет реагировать на прерывания? на...

25
Модератор
Эксперт С++
11071 / 9128 / 5485
Регистрация: 18.12.2011
Сообщений: 24,399
17.08.2019, 19:21 2
Не совсем понял, о чем Вы, но если имеется ввиду исключение,
то делайте примерно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void f()
{
   ...
   if(....)
     throw (значение переменной какого-нибудь типа);
   ....
   return; 
}
try
{
   .... 
  f();
  ....
}
catch(тип имя_переменной_такого-же_типа)
{
    cout<<"вызвано исключение "<<имя_переменной_такого_же_типа<<endl;
}
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
17.08.2019, 19:26  [ТС] 3
zss, программное прерывание вызывается с помощью исключений?

Добавлено через 1 минуту
Вот с stackoverflow - To execute a system call, user process will copy desired system call number to %eax and will execute 'int 0x80'.
Что значит will execute int 0x80?

Добавлено через 3 минуты
zss, или вот с той книги
On i386, for example, a user-space application exe‐
cutes a software interrupt instruction, int , with a value of 0x80 . This instruction causes
a switch into kernel space, the protected realm of the kernel, where the kernel executes
a software interrupt handler—and what is the handler for interrupt 0x80 ? None other
than the system call handler!

executes a software interrupt instruction, int , with a value of 0x80
0
Модератор
Эксперт С++
11071 / 9128 / 5485
Регистрация: 18.12.2011
Сообщений: 24,399
17.08.2019, 19:37 4
Я не вдавался в подробности, как это делается на аппаратном уровне,
но, если это не то, то прошу прощения.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
17.08.2019, 20:00  [ТС] 5
zss, как оказалось
INT is an assembly language instruction for x86 processors that generates a software interrupt. It takes the interrupt number formatted as a byte value.
С С++ это не связанно.
0
Модератор
Эксперт С++
11071 / 9128 / 5485
Регистрация: 18.12.2011
Сообщений: 24,399
17.08.2019, 20:32 6
Я так и подумал, и, скорее всего, механизм исключений как раз и реализует такое прерывание.
0
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
18.08.2019, 09:02 7
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

Цитата Сообщение от ReYalp Посмотреть сообщение
Что значит will execute int 0x80?
Изнасилование трупа оно означает.
У процессора есть таблица обработчиков процессорных событий, они собственно прерываниями и называются. Задумывалась табличка под нужды процессора. Но хитрые разработчики Доисторической Операционной Системы (сокращенно DOS) подумали что и давайте мы в табличку и системные вызовы пристроим. Ну а че, там же 256 позиций, большую часть процессор не использует, чего добру пропадать. Для этого и была придумана команда int.

Со времен Доисторической Операционной Системы для int придумали множество альтернатив, начиная с "подключу системную DLL, экспортирую из нее Си-интерфейс и пусть у него о всех этих sysenter башка болит". Однако, некоторые некрофилы, оказывается. продолжали использовать этот их int.

Короче, закопайте обратно. Вам это с вероятностью 99% не потребуется.
Цитата Сообщение от zss Посмотреть сообщение
Я так и подумал, и, скорее всего, механизм исключений как раз и реализует такое прерывание.
Исключения никакого отношения к прерываниям не имеют.
2
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
18.08.2019, 11:57  [ТС] 8
Renji,
Цитата Сообщение от Renji Посмотреть сообщение
Короче, закопайте обратно. Вам это с вероятностью 99% не потребуется.
мне было интересно как оно работает и не больше,просто в книге с языком С автор пишет о execute int и для меня это было странно,
насколько я понимаю такое решение уже не используется в современных системах? Что-то читал о SYSENTER/SYSEXIT,Вы слышали об этом?

Добавлено через 2 минуты
точнее насколько я понял Вы слышали об этом,чем оно отличается от int?
0
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
18.08.2019, 12:06 9
Цитата Сообщение от ReYalp Посмотреть сообщение
мне было интересно как оно работает и не больше,просто в книге с языком С автор пишет о execute int и для меня это было странно,
насколько я понимаю такое решение уже не используется в современных системах?
Используется для совместимости, но устарело. На Хабре есть статья пробегающаяся по вариантам системных вызовов. Но за техническими подробностями вам в документацию на процессоры.
0
918 / 635 / 198
Регистрация: 08.09.2013
Сообщений: 1,690
18.08.2019, 14:15 10
Цитата Сообщение от Renji Посмотреть сообщение
Однако, некоторые некрофилы, оказывается. продолжали использовать этот их int.
Если речь о архитектуре i386, то sysenter появился только в Pentium II. Для более ранних CPU int 0x80 - практически единственная реализация системных вызовов для OS, требующих переключения контекста.
0
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
18.08.2019, 14:41 11
Цитата Сообщение от gng Посмотреть сообщение
Если речь о архитектуре i386, то sysenter появился только в Pentium II.
Этож больше двадцати лет тому назад было. А в книжках, оказывается, все еще про int пишут.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
18.08.2019, 14:47  [ТС] 12
Renji, Роберт Лав Системное программирование, там как пример работы в i386 int приведён, а Вы не подскажете как это работало?
Каким образом именно после запуска int 0x80 срабатывало переключение в режим ядра? Никогда не имел дело напрямую с этим, очень интересно.
0
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
18.08.2019, 15:06 13
Цитата Сообщение от ReYalp Посмотреть сообщение
Renji, Роберт Лав Системное программирование, там как пример работы в i386 int приведён, а Вы не подскажете как это работало?
Каким образом именно после запуска int 0x80 срабатывало переключение в режим ядра?
У процессора в таблице прерываний написано, куда там управление перебросить надо. Вам туда писать не дадут, соответственно, произвольный код в режиме ядра вы выполнить не сможете. Только вызвать те функции, которые ОС милостиво разрешила вызывать.
0
918 / 635 / 198
Регистрация: 08.09.2013
Сообщений: 1,690
18.08.2019, 15:33 14
Цитата Сообщение от ReYalp Посмотреть сообщение
там как пример работы в i386 int приведён, а Вы не подскажете как это работало?
Это и сейчас работает - как на i386, так и на x86_64 архитектурах,
причем и на уровне ОС (только что в linux 4.19 64 бит вывел строку в терминал через int 80)
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
18.08.2019, 15:41  [ТС] 15
gng, меня интересует именно принцип работы,я не совсем понимаю как все происходит после запуска int 0x80 (к примеру),к примеру если взять текст с книги
On i386, for example, a user-space application exe‐
cutes a software interrupt instruction, int , with a value of 0x80 . This instruction causes
a switch into kernel space, the protected realm of the kernel, where the kernel executes
a software interrupt handler—and what is the handler for interrupt 0x80 ? None other
than the system call handler!

Запуск инструкции 0x80 влечет за собой переключение в пространство ядра,что это значит и как это происходит? Именно это переключение в пространство ядра,почему в него так легко можно переключится?
0
918 / 635 / 198
Регистрация: 08.09.2013
Сообщений: 1,690
18.08.2019, 15:44 16
Цитата Сообщение от ReYalp Посмотреть сообщение
Именно это переключение в пространство ядра,почему в него так легко можно переключится?
Так инструкция процессора int для этого и предназначена.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
18.08.2019, 15:47  [ТС] 17
gng, Тоесть процессор "видит" что была вызвана int и потом вызывает обработчик int? Это если вкратце?
0
918 / 635 / 198
Регистрация: 08.09.2013
Сообщений: 1,690
18.08.2019, 15:51 18
Цитата Сообщение от ReYalp Посмотреть сообщение
Тоесть процессор "видит" что была вызвана int и потом вызывает обработчик int? Это если вкратце?
int - это и есть инструкция (команда) процессора, наряду с move, add ...
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
18.08.2019, 15:54  [ТС] 19
gng, мало знаком с ассемблером,в универе не приделил ему должного внимания и все что я знаю о move add это то что одна добавляет данные в регистр,другая убирает(вроде так,не уверен),а понятия даже не имею как они работают на уровне железа

Добавлено через 1 минуту
и насколько я помню там не move а mov?
0
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
18.08.2019, 15:57 20
Цитата Сообщение от ReYalp Посмотреть сообщение
Запуск инструкции 0x80 влечет за собой переключение в пространство ядра,что это значит и как это происходит? Именно это переключение в пространство ядра,почему в него так легко можно переключится?
Еще раз. У процессора есть таблица прерываний. В таблице прерываний написано что если произошло такое-то прерывание, надо пнуть такую-то функцию. И поднять ей приоритет выполнения до ядра. Конкретно вас никто и никуда не переключает. Переключают внесенную в табличку функцию.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.08.2019, 15:57

Прерывания asm
Не могу использовать прерывания(int) в встроенном ассемблере. Вылезает ошибка доступа. Помогите...

Таблица векторов прерывания
Здравствуйте, на одном сайте видел следующую запись: static void (* near const _vect)(void)...

Условие прерывания цикла
Из-за чего происходит(условие прерывания) выход из цикла? Мои предположения что пока b не равно...

Механизм прерывания ввода
Ребят, передо мной стоит задание написать функцию, которая принимает в качестве аргумента...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.