Как Linux или другая ОС тестируют свою ОС, чтобы подтвердить, что контекст двух процессов корректно переключается? - PullRequest
0 голосов
/ 18 ноября 2018

Я учусь и пишу операционную систему. И теперь я узнал о том, как переключать два процесса, чтобы моя ОС поддерживала многопроцессорность.

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

Я знаю, что это потому, что EIP двух процессов или некоторые другие регистры были сохранены неправильно ...

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

Итак, я хочу знать, как Linux, Windows или другая операционная система тестируют переключение контекста своего процесса?

1 Ответ

0 голосов
/ 23 ноября 2018

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

top:
    cmp rax_v(%rip), %rax
    jne rax_error
    cmp rbx_v(%rip), %rbx
    jne rbx_error
    ....
    jmp top

выполнение этого с низким приоритетом должно дать вам довольно хорошее покрытие, что обработчики прерываний и прерывания -> контекстный переключатель сохраняет и восстанавливает регистры должным образом.Не забудьте использовать большое количество значений в регистрах, чтобы минимизировать ложные совпадения.

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

Запустите набор процессов, возможно, несколько из них как потоки.

Далее,Вы захотите увеличить нагрузку прерывания, с целью достижения максимально возможной вложенности прерывания.Если у вас есть реальные последовательные порты, они могут быть их отличным источником - подключите источник шума (генератор функций или антенны) к выводу Carrier Detect UART и включите прерывания состояния модема.Большинство уартов не управляют этими выводами состояния на бодовых часах, поэтому вы можете получить максимальный шторм прерывания.Попробуйте установить уартс на самый низкий приоритет прерывания.

Удачи, впереди у вас будет много веселья!

...