2012-07-22 4 views
6

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

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

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

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

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

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

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

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

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

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

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

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

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

+3

Из [FAQ]. «Ваши вопросы должны быть разумно область видимости Если вы можете представить себе всю книгу, которая отвечает на ваш вопрос, вы просите слишком много. " Здесь слишком много вопросов, и масштаб действительно широк. Похоже, вам нужна хорошая книга по дизайну операционной системы в целом и хорошая в ARM в частности. – Mat

+0

Да, книга была бы хорошей вещью, как упоминалось в вопросе. сама область вопросов не настолько широка, они либо о преимуществе, либо об отношении пользователя ядра. Однако я боюсь, что их слишком много для одной записи, извините за это. Я посмотрю, что мода рекомендует либо сломать это, либо изменить его на что-то вроде «нужна хорошая книга по дизайну системы для руки». – sgupta

+0

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

ответ

11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+0

Важное значение имеет упреждение ядра (я бы сделал ставку особенно для систем реального времени). http://www.linuxjournal.com/article/5600 – Mat

+0

удовлетворительный ответ, но я до сих пор не понимаю. В 7, я спросил, если код ядра не отображается в виртуальном пространстве, как cpu извлекает код оттуда? не должны ли это прерывать данные? В 8, Так как это монолитное ядро, я реализую «большинство» вещей в ядре, поэтому для меня потребовалось бы сделать код ядра pre emtive, предположим, что я получаю SCHSUNS, или какой-то поток ядра вызывает его на одном CPU , приведет к тупиковой ситуации, но если бы эта нить была выгружена, она будет работать нормально в любой системе, так как поток будет изгнан после использования всего его кванта. – sgupta

+0

@ user1075375 - 7 - Нет, это не приведет к сбою данных, поскольку процессор работает в привилегированном режиме. По крайней мере, так я понимаю - я признаю, что большая часть моей работы была выполнена в системах без MMU или виртуальной памяти. Re 8 - Если у вас несколько процессоров, то да, было бы полезно, если бы код ядра был превентивным. Тем не менее, yu не может получить синхронизацию с помощью spinlock от текущего процессора - когда код ядра запущен, код пользователя не запущен. –

1

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

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

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

Перейдите на страницу main page for uC/OS-III, а слева вы увидите ссылку на видео, в которой рассказывается о доступности исходного кода (доступен «источник uC/OS-III»).

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

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

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

+0

Спасибо, заглянем в это тоже. – sgupta

1

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

Отличный бесплатный RTOS, и очень хорошо объяснено, является FreeRTOS (http: //www.freertos.орг /)

Вы определенно должны взглянуть там

+0

uC/OS не может свободно * лицензировать * в коммерческих продуктах и ​​никогда не был.Цены (из того, что я слышал) для различных продуктов/продуктов/cpu/site [license] (http://micrium.com/page/products/licensing_pricing) варьируются от $ 10 тыс. До $ 20 тыс. Тем не менее, он всегда доступен для источников, и книга фантастическая (да, я думаю, что она лучше документирована, чем FreeRTOS); Жан Лаброс замечательно относится к образованию и открытости. –

+0

Я представил изменение, добавив эту информацию в сообщение. –

+0

Предлагаемое редактирование было отклонено: http://stackoverflow.com/spected-edits/327885 –

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