
Mikhail Voronov
29.08.2018
17:53:11

Wrestler
29.08.2018
19:23:59
Кто разбирается в системном программировании помогите, хочу понять что происходит при передаче исполнения от одного процесса к другом, что происходит с контекстом ? Где она сохраняется ?

Mikhail Voronov
29.08.2018
19:28:25
в ядре

Max
29.08.2018
19:30:45

Google

Mikhail Voronov
29.08.2018
19:31:24
в Windows в структурах ETHREAD/KTHREAD/EPROCESS/KPROCESS

Max
29.08.2018
19:31:54
что происходит — ну, ядро сохраняет контекст, вычисляет, кому выполняться следующим и засовывает соотетствующий instruction counter в cpu
обзорно — https://github.com/torvalds/linux/blob/master/include/linux/sched.h .

Mikhail Voronov
29.08.2018
19:32:34
ну что происходит на Windows - это нужно что-нибудь типа Windows Internals почитать, чтобы понять

Wrestler
29.08.2018
19:35:31
дро помещает контекстный уровень в стек при возникновении прерывания, при обращении к системной функции или при переключении контекста процесса. Контекстный уровень выталкивается из стека после завершения обработки прерывания, при возврате процесса в режим задачи после выполнения системной функции, или при переключении контекста. Таким образом, переключение контекста влечет за собой как помещение контекстного уровня в стек, так и извлечение уровня из стека: ядро помещает в стек контекстный уровень старого процесса, а извлекает из стека контекстный уровень нового процесса. Информация, необходимая для восстановления текущего контекстного уровня, хранится в записи таблицы процессов.
В какой стек ?

Max
29.08.2018
19:37:08
стек един.
на x86, как минимум.

Eugene
29.08.2018
19:37:58
Стек непобедим(

Wrestler
29.08.2018
19:38:27
Стек у процесса один

Max
29.08.2018
19:38:31
в cpu есть регистр, в котором находится указатель на голову стека

Wrestler
29.08.2018
19:39:56
Я запутался

Max
29.08.2018
19:40:04

Google

Wrestler
29.08.2018
19:41:18
Пользовательский контекст состоит из кода и данных в которую и входит стек, bss и прочее
Как я знаю

Max
29.08.2018
19:41:24
Стек у процесса один
есть инструкции push/pop. Процесс вообще один только может выполняться на одном ядре. Этот процесс — как правило — ядро, которое может внутри себя запускать какие-то внешние инструкции.
в начале выполнения сохраняется указатель на текущую голову стека — за неё процесс изнутри выйти не может (в общем случае, если нет уязвимостей)
если тебя смущает цитата "Таким образом, переключение контекста влечет за собой как помещение контекстного уровня в стек", то всё происходит наоборот — в стековый регистр помещается указатель на текущую позицию.
обращение к данным в нём — это в общем случае загрузка из RAM, если, конечно, её нет в кеше.

Wrestler
29.08.2018
19:47:54
Как ты понимаешь контекстный уровень ?

Max
29.08.2018
19:49:33
в ядре есть список структур task_struct (точнее, двусвязный список), в task_struct находится вся информация о контексте конекретной таски: выделенная память, занятые дескрипторы, указать на текущую инструкцию, и всякие вспомогательные данные.
судя по ссылкам из гугла, это как раз и есть task_struct в linux.
посмотри на struct task_struct в https://github.com/torvalds/linux/blob/master/include/linux/sched.h .

Wrestler
29.08.2018
19:52:01
Все я понял
Ядро имеет свой стек где хранит информацию о функциях и системных вызовах

Max
29.08.2018
19:53:53

Wrestler
29.08.2018
19:54:53
Понятно, спасибо

Ilia
29.08.2018
20:14:59


Wrestler
29.08.2018
20:18:39

Google

Ilia
29.08.2018
20:20:12

Wrestler
29.08.2018
20:20:45
Процесс имеет два стека, при исполнении в режиме ядра и в режиме задачи

Ilia
29.08.2018
20:20:58

Wrestler
29.08.2018
20:21:48
Операционная система без ядра это что то новое
Для меня

Max
29.08.2018
20:22:23

Ilia
29.08.2018
20:22:37
Ну, о сколько нам открытий чудных...

??▶️?? Yury
29.08.2018
20:22:37

Wrestler
29.08.2018
20:23:00
Как можно представить Linux без ядра ?

Ilia
29.08.2018
20:23:04

Wrestler
29.08.2018
20:24:22
Так это оболочка + дополнения

Pavel
29.08.2018
20:24:28

Wrestler
29.08.2018
20:24:51
Как запустить машину без мотора ?

Eugene
29.08.2018
20:25:24

Ilia
29.08.2018
20:25:46
А почему машину? А если у тебя не машина, а танк, и там турбина?

Wrestler
29.08.2018
20:25:56
Интерфейс не подойдёт ))

Ilia
29.08.2018
20:26:05
Все разное...

Wrestler
29.08.2018
20:26:21
На танк колесо от мерседеса ?

Google

Eugene
29.08.2018
20:26:36

Max
29.08.2018
20:26:42

Eugene
29.08.2018
20:26:47
Есть и примитивные однопользовательские системы

Wrestler
29.08.2018
20:26:59
Так ядро и представляет интерфейс, как можно запустить программу в виндовс на линуксе не изменив системные вызовы ?
К ядру ?
При компиляции через сколько уровней проходит код программы ?

Matwey
29.08.2018
20:30:26
А как по вашему EFI приложения работают?

Wrestler
29.08.2018
20:31:32
Прошивка

Ilia
29.08.2018
20:34:54
Ладно, главное не это, а то что к языку С++ (и С) это все не имеет никакого отношения
Компилятор и Линекер. Все, 2

Joy
30.08.2018
00:14:55
Короч такой вопрос. Хочу я, чтобы enum'ы были раскиданы по своим неймспейсам. Допустим есть у меня класс Powerup. И есть enum powerupType { ... }
Я хочу перенести его под класс, чтобы было enum Powerup::Type, поскольку оно логически относится только к этому классу.
Но это приведет к тому, что везде в других модулях, где используется это перечисление, мне придется инклудить заголовочник powerup.hpp
Делать это ради одного перечисления мне кажется неправильным, потому что на ровном месте появляется лишняя связность
Допустимо ли вынести такие перечисления в отдельный заголовочник? Там будет несколько разных перечислений, относящихся к разным классам, типа Input::Direction
Насколько это плохой тон - держать отдельно от файлов класса код, относящийся к классу

Constantine
30.08.2018
02:07:18

Joy
30.08.2018
02:10:53
Не понял про "развязывать", что имеется в виду? На данный момент решение уже принято - убрать все enum'ы в отдельный файл config.hpp, тот же где все настройки и константы проекта хранятся, и без привязки к классам. Получается убрать сопряжения между классами напрямую. Решил, что это важнее чем держать перечисления внутри подходящих классов.

Constantine
30.08.2018
02:12:16
в каком-то конвенционном виде, вроде
namespace some {
enum class special_enum {};
}
class some_type {
public:
//some::special_enum это что-то мое на самом деле
};
а как только они перестали быть внутри класса, вопроса больше нет - вы с ними как с (А зависит от Б) можете работать
(например, вас же не смущает предка некоторого класса убирать в другой файл)

Google

Joy
30.08.2018
02:18:15
спрошу лучше, как в этот вид переделать то, что у меня есть

Constantine
30.08.2018
02:19:02

Joy
30.08.2018
02:19:47
Можно практический пример? я с трудом понимаю)) Или на моём примере как переделать
https://github.com/narical/asciidunge/blob/libtcod/include/config.hpp
https://github.com/narical/asciidunge/blob/libtcod/src/input.cpp
этот класс использует enum direction { ... } из config.hpp
я так понял речь про какую-то конвенцию, и шестым чувством чую что она полезная и мне стоило бы ее использовать

Constantine
30.08.2018
02:23:28

Joy
30.08.2018
02:24:03
ох, надеюсь где-нить на хабре есть на эту тему почитайка

Constantine
30.08.2018
02:24:35
нет конечно, я совершенно внутреннюю вещь рассказываю сейчас
т.е. ваша проблема закрывается определенной конвенцией именования типов

Joy
30.08.2018
02:26:47

Constantine
30.08.2018
02:30:16
аналогично этому, но менее абстрактный пример можно?
я совершенно не понимаю, что вы хотели сказать классом powerup, но если предположить, что это тип-значение, то
enum class powerup_enum {
health, mana, damage
};
class powerup_type {
explicit powerup_type(powerup_enum type)
: type_(type) {
}
private:
powerup_enum type_ /*m_type, etc...*/;
};
вообще ваш Powerup выглядит, будто это std::variant

Joy
30.08.2018
02:33:59
у меня там большая часть кода заглушечная
теоретически она когда-то должна развиться в нечто совершенно другое, практически же - всё будет переписано с нуля с другим подходом совершенно
Это мой первый проект, который я начал решив выучить плюсы