Как писал Мат, это, вероятно, необоснованно охвачено областью. Тем не менее, я постараюсь уделять столько внимания сумме вопросов, сколько мне хотелось бы с одним разумным вопросом, в надежде, что это поможет вам начать исследование.
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 Имеет ли «превентивное ядро» только то, что ядро было спроектировано таким образом, что было бы безопасно иметь контекстный переключатель во время выполнения кода ядра? или требуется ли больше работы, если таковая имеется?
Я думаю, это означает, что ядро может выгрузить код пользователя, а не то, что само ядро может быть выгружено. Было бы сложно и необычно ни для чего прерывать ядро. Это потребует больше работы, и я изо всех сил пытаюсь понять, зачем вам это нужно.
Из [FAQ]. «Ваши вопросы должны быть разумно область видимости Если вы можете представить себе всю книгу, которая отвечает на ваш вопрос, вы просите слишком много. " Здесь слишком много вопросов, и масштаб действительно широк. Похоже, вам нужна хорошая книга по дизайну операционной системы в целом и хорошая в ARM в частности. – Mat
Да, книга была бы хорошей вещью, как упоминалось в вопросе. сама область вопросов не настолько широка, они либо о преимуществе, либо об отношении пользователя ядра. Однако я боюсь, что их слишком много для одной записи, извините за это. Я посмотрю, что мода рекомендует либо сломать это, либо изменить его на что-то вроде «нужна хорошая книга по дизайну системы для руки». – sgupta
Вопросы рекомендации книги здесь не работают. (Есть несколько исторических, которые придерживаются, но новые не приветствуются.) – Mat