разница между вытеснением и переключением контекста

Небольшое вступление,

В настоящее время я пишу небольшое (читай крошечное) ядро ​​​​RTOS, ну, оно должно быть монолитным с большинством вещей в ядре. Однако я не могу найти много информации о нескольких вещах, перечисленных ниже. Это было бы очень полезно, и, кроме того, на самом деле это не какой-то университетский проект, а то, чем я занимаюсь по собственному желанию.

Лучшей альтернативой ответам на все вопросы было бы, если бы вы могли сослаться на свободно доступную RTOS (или даже бесплатную книгу) для рук, желательно, которые реализуют пользовательское пространство и являются вытесняемыми (но не сложными, как Linux) . В Linux есть одна из худших документации, которые я когда-либо видел (я пытался понять что-то из кода Linux, но есть просто тонны определений, разбросанных по миллиону файлов и функциональных хуков со странными именами и прочими вещами, которые переименовываются, каждая версия также получает иногда шевелится...)

  1. В чем разница между «вытеснением» и «переключением контекста»?

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

  3. Как создать и работать с пользовательским режимом?

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

  4. Если да, то единственный способ для программы пользовательского пространства использовать код ядра — это системные вызовы?

  5. Как тогда ядро ​​​​отвечает или взаимодействует с пространством пользователя?

  6. Означает ли это, что единственным потоком ядра после загрузки (в простой системе) будет бездействующий поток?

  7. Если страница, на которой находятся код ядра и данные, не отображается при переключении на пользовательский процесс, то при системном вызове или прерывании, как код ядра выполняется без отображения в виртуальном адресном пространстве?

  8. Означает ли «вытесняемое ядро» только то, что ядро ​​было спроектировано таким образом, чтобы было безопасно переключать контекст во время выполнения кода ядра? или это требует дополнительной работы, если таковая имеется?

О, и если такие множественные вопросы здесь не разрешены, извините, ничего не нашел по этому поводу.


person sgupta    schedule 22.07.2012    source источник
comment
Из часто задаваемых вопросов: ваши вопросы должны иметь разумный охват. Если вы можете представить целую книгу, отвечающую на ваш вопрос, вы слишком многого требуете. Здесь слишком много вопросов, и рамки действительно широки. Похоже, вам нужна хорошая книга по проектированию операционных систем в целом и по ARM в частности.   -  person Mat    schedule 22.07.2012
comment
Да, книга была бы хорошей вещью, как упоминалось в вопросе. сам объем вопросов не так широк, они касаются либо вытеснения, либо отношения пользователя ядра. Однако я боюсь, что их слишком много для одного поста, извините за это. Я посмотрю, что порекомендует мод, чтобы либо сломать это, либо изменить его на что-то вроде «нужна хорошая книга по системному дизайну для оружия».   -  person sgupta    schedule 22.07.2012
comment
Вопросы о рекомендации книг здесь не работают. (Есть несколько старых, которые остались, но новые не приветствуются.)   -  person Mat    schedule 22.07.2012
comment
Я был бы рад получить ответы в любой форме, будь то ссылка на ветку, столь же старую, как и я, ссылка на книгу, длинный ответ здесь, ссылка на исходный код какого-нибудь хорошего (бесплатного) программного обеспечения и т. д. Однако, если мне нужна рекомендация для хорошей книги по проектированию систем (хотя я просто искал несколько ответов, хорошее чтение не повредит), где я могу опубликовать ее? это был самый подходящий сайт стека, который я мог придумать.   -  person sgupta    schedule 22.07.2012
comment
Сайты Stack Exchange, как правило, представляют собой систему вопросов и ответов, а не систему рекомендаций.   -  person Mat    schedule 22.07.2012
comment
См.: stackoverflow.com/questions/5283501/ , stackoverflow.com/questions/3543659/ , а затем задайте все оставшиеся вопросы в отдельный пост по каждому вопросу.   -  person ninjalj    schedule 23.07.2012


Ответы (3)


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

1 В чем разница между «вытеснением» и «переключением контекста»?

Упреждение — это акт прерывания процесса без его участия. В этом контексте это, вероятно, означает, что сработает прерывание таймера. Это слово происходит от юридического понятия преимущественного права: действие или право требования или покупки до или в предпочтении перед другими. Для ваших целей это означает, что когда срабатывает прерывание по таймеру, процедура обслуживания прерывания (ISR) имеет приоритет над кодом, который выполнялся ранее. Это не обязательно должно включать ядро; у вас может быть код, работающий в любом ISR, который будет выполняться с упреждением.

Переключение контекста — это то, что происходит, когда код ОС (работающий упреждающе) изменяет состояние процессора (регистры, режим и стек) между контекстом одного процесса или потока и другим. Состояние процессора может быть на определенной строке кода в одном потоке. Он будет иметь временные данные в регистрах, указатель стека на определенную область памяти и другую информацию о состоянии. Упреждающая ОС может сохранять это состояние (либо в статической памяти, либо в стеке процессов) и загружать состояние предыдущего процесса. Это известно как переключение контекста.

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

В вытесняющем ядре прерывание может срабатывать между любыми двумя ассемблерными инструкциями (известными как «точки последовательности»). В невытесняющем ядре работающий процесс должен вызвать функцию yield(), чтобы разрешить выполнение других потоков. Упреждающие ядра более сложны, но обеспечивают лучшую иллюзию параллелизма. Невытесняющие ядра можно очень просто реализовать с помощью setjmp.h, но каждый поток должен регулярно вызывать yield(), иначе другие потоки не будут выполняться.

Когда вызывается такая функция, как yield(), состояние процессора сохраняется автоматически. Если вы хотите сделать свою ОС вытесняющей, вы должны сохранить эту информацию вручную.

3 Как создать и работать с пользовательским режимом?

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

Правильный. Однако они также говорят, что любое прерывание будет выполняться в привилегированном режиме автоматически. В системе ARM вы можете использовать инструкцию svc для генерации программного прерывания. После этого код SVC (часть вашей ОС) сможет работать в привилегированном режиме.

4 Если да, то единственный способ для программы пространства пользователя использовать код ядра — это системные вызовы?

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

5 Как тогда ядро ​​реагирует или взаимодействует с пользовательским пространством?

В ARM инструкция SVC может иметь 8-битное значение. Это можно использовать для генерации 256 системных вызовов, таких как yield, enable interrupts, disabled interrupts и т. д., что вам нужно. Вы также можете создать общую память или механизм обмена сообщениями, если вам это нужно.

6 Означает ли это, что единственным потоком ядра после загрузки (в простой системе) будет бездействующий поток?

Это полностью зависит от того, как вы проектируете свою систему. Вероятно, будет проще, если вы решите запустить ядро ​​только после того, как все ваши потоки будут созданы — таким образом вам не нужно беспокоиться о динамическом распределении потоков. Или вы можете начать с бездействующего потока и добавить другие потоки позже (через удаленную оболочку? Я думаю, вы хотите, чтобы хотя бы один пользовательский поток работал последовательно...)

7 Если страница, на которой находятся код ядра и данные, не отображается при переключении на пользовательский процесс, то при системном вызове или прерывании, как выполняется код ядра без отображения в виртуальном адресном пространстве?

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

8. Означает ли «вытесняемое ядро» только то, что ядро ​​было спроектировано таким образом, чтобы было безопасно переключать контекст во время выполнения кода ядра? или это требует дополнительной работы, если таковая имеется?

Я думаю, это означает, что ядро ​​может вытеснять пользовательский код, а не само ядро. Было бы сложно и необычно прерывать работу ядра. Это потребует больше работы, и я изо всех сил пытаюсь понять, зачем вам это нужно.

person Kevin Vermeer    schedule 22.07.2012
comment
Упреждение ядра действительно важно (я бы поставил особенно для систем реального времени). linuxjournal.com/article/5600 - person Mat; 22.07.2012
comment
удовлетворительный ответ, однако я до сих пор не понимаю. В 7 я спросил, если код ядра не отображается в виртуальном пространстве, как процессор извлекает оттуда код? разве это не должно привести к прерыванию данных? В 8, поскольку это монолитное ядро, я реализую большинство вещей в ядре, поэтому мне потребовалось бы, чтобы я фактически сделал код ядра приоритетным, предположим, я получаю системный вызов получения спин-блокировки или какой-то поток ядра вызывает его на одном ЦП, будет привести к тупику, но если этот поток был вытеснен, он будет нормально работать в любой системе, поскольку поток будет выброшен после использования всего его кванта. - person sgupta; 22.07.2012
comment
@ user1075375 - 7 - Нет, это не приведет к прерыванию данных, поскольку ЦП работает в привилегированном режиме. По крайней мере, я так это понимаю — я признаю, что большая часть моей работы была сделана на системах без MMU или виртуальной памяти. Относительно 8. Если у вас несколько процессоров, то да, было бы полезно, если бы код ядра был вытесняемым. Однако вы не можете получить системный вызов для получения спин-блокировки от текущего ЦП - когда код ядра работает, пользовательский код не работает. - person Kevin Vermeer; 22.07.2012
comment
@Mat - А, я вижу - вы фактически запускаете другое ядро ​​​​одновременно с вашим вытесняемым ядром. Интересный! - person Kevin Vermeer; 22.07.2012
comment
Я уже проголосовал за него. Однако я буду ждать лучшего ответа, если таковой имеется, еще некоторое время, спасибо за ваше время. - person sgupta; 22.07.2012
comment
Вообще отличная статья. У меня есть только две незначительные проблемы. 1. Переключение контекста может происходить и в ядрах без вытеснения. 2. В совместной многозадачности все системные вызовы обычно содержат неявный yield(). Таким образом, процессы должны явно уступать только во время длинных участков кода без системных вызовов в них. - person JeremyP; 24.07.2012
comment
@user1075375 user1075375 вы не получите лучшего ответа, если этот уже опубликован. Другие люди, такие как я, могли бы опубликовать ответы, но мы не собираемся этого делать, потому что большая часть их текста будет повторением этого. - person JeremyP; 24.07.2012
comment
@JeremyP - (1) Верно. (2) Для меня это новость! Хотя в этом есть смысл. Код Я работал с требуемыми явными выходами в нужных точках, что давало немного больше контроля над состоянием, но я вижу, как это может быть полезно. - person Kevin Vermeer; 24.07.2012
comment
@KevinVermeer Если подумать, так и должно быть. Если процесс запрашивает блок с диска, вы не хотите, чтобы весь компьютер останавливался во время его извлечения. Вы также можете переключиться на другой процесс. Сказав это, также часто требуются явные выходы. - person JeremyP; 27.07.2012

Вместо того, чтобы отвечать на каждый из ваших перечисленных вопросов, я сделаю все возможное, чтобы удовлетворить вашу (к счастью) просьбу, выделенную жирным шрифтом:

Лучшей альтернативой ответам на все вопросы было бы, если бы вы могли сослаться на свободно доступную ОСРВ (или даже бесплатную книгу) для руки

uC/OS-III от Micrium — это ядро ​​реального времени на основе приоритетов, которое (конечно) поддерживает как синхронное, так и асинхронное вытеснение. И, как назло (и причина, по которой я отвечаю), это то, что есть бесплатная книга, а также доступен исходный код.

Перейдите на главную страницу uC/OS-III, а слева вы увидите ссылку на видео, рассказывающее о доступности исходного кода ("Доступен исходный код uC/OS-III").

Что касается книг, перейдите на страницу проектов. и выберите книгу, наиболее точно соответствующую вашей цели. 90% материала одинаковые; только вещи, специфичные для процессора (такие как переключение контекста, прерывания и инициализация), будут варьироваться от книги к книге.

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

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

person Dan    schedule 24.07.2012
comment
Спасибо, это тоже рассмотрим. - person sgupta; 24.07.2012

У меня сложилось впечатление, что uC/OS-III была не бесплатной, а лицензированной.

Отличная бесплатная ОСРВ с очень хорошим объяснением — это FreeRTOS (http://www.freertos.org/).

Вам обязательно стоит туда заглянуть

person Rafael Dazcal    schedule 24.07.2012
comment
uC/OS нельзя бесплатно лицензировать в коммерческих продуктах и ​​никогда не делала бесплатно. Цены (из того, что я слышал) для различных продуктов/линейки продуктов/процессоров/сайтов лицензий колеблется от 10 до 20 тысяч долларов. Тем не менее, исходный код всегда был доступен, и книга просто фантастическая (да, я думаю, что она лучше документирована, чем FreeRTOS); Жан Лаброс великолепен в вопросах образования и открытости. - person Kevin Vermeer; 24.07.2012
comment
Предлагаемое изменение было отклонено: stackoverflow.com/suggested-edits/327885 - person Kevin Vermeer; 25.07.2012
comment
@KevinVermeer - Это довольно экстремальное редактирование, и оно действительно меняет смысл ответа, поэтому я понимаю, почему люди его отвергли. Мое предложение состояло бы в том, чтобы опубликовать его как совершенно новый ответ или добавить его к вашему принятому ответу. Это выглядит как отличный материал, но мы стараемся уважать намерения оригинального автора. - person Brad Larson; 25.07.2012
comment
@BradLarson - Спасибо, что взвесили. Я понимаю, что это многое добавляет, но я не добавляю новую информацию. Я поясняю намерение автора: подкрепить и прояснить расплывчатое «впечатление» доказательствами с исходного сайта, перейти от простой текстовой ссылки к правильно отформатированным ссылкам на полезные части большого сайта и процитировать соответствующую статью о достоинства предлагаемой ОСРВ. - person Kevin Vermeer; 25.07.2012
comment
@KevinVermeer - В начале есть тонкое изменение тона, и вы добавляете много новой информации. В прошлом у нас были люди, жаловавшиеся на то, что редакторы слишком сильно меняли свой ответ с такими дополнениями, поэтому я по-прежнему думаю, что лучшим решением было бы написать собственный ответ на основе вашего редактирования (возможно, сказать что-то вроде расширения на что Рафаэль сказал в своем ответе...). Нет проблем с несколькими ответами на вопрос. - person Brad Larson; 25.07.2012