5. Контрольные вопросы
Преимущества использования команды SHL вместо TEST (пример №1.1)?
Чем отличаются команды
SHL dx,1
и
SHL dx, cl
Как переслать содержимое X в стек и получить обратно?
Опишите методику вывода значения байта в десятеричной системе счисления?
Опишите методику вывода значения байта в шестнадцатеричной системе счисления?
Опишите методику вывода двоичного кода числа, записанного в регистр X
Стек. Принцип работы. Команды работы со стеком.
Укажите отличия в работе тандема команд.
push DS
pop ES
от
push DS
pop ES
Приложение №1
Основные Скан-Коды клавиш клавиатуры.
Клавиша | Код | Клавиша | Код | Клавиша | Код | Клавиша | Код |
Esc | 01h | Enter | 1Ch | K* | 37h | Ins | 52h |
1! | 02h | Ctrl | 1Dh | Alt | 38h | Del | 53h |
2 @ | 03h | A | 1Eh | SP | 39h | SysRq | 54h |
3 # | 04h | S | 1Fh | Caps | 3Ah | Macro | 56h |
4 $ | 05h | D | 20h | F1 | 3Bh | F11 | 57h |
5% | 06h | F | 21h | F2 | 3Ch | F12 | 58h |
6 ^ | 07h | G | 22h | F3 | 3Dh | PA1 | 5Ah |
7 & | 08h | H | 23h | F4 | 3Eh | F13/LWin | 5Bh |
8 * | 09h | J | 24h | F5 | 3Fh | F14/RWin | 5Ch |
9 ( | 0Ah | K | 25h | F6 | 40h | F15/Menu | 5Dh |
0) | 0Bh | L | 26h | F7 | 41h | F16 | 63h |
- _ | 0Ch | ;: | 27h | F8 | 42h | F17 | 64h |
= + | 0Dh | ' " | 28h | F9 | 43h | F18 | 65h |
BS | 0Eh | ` ~ | 29h | F10 | 44h | F19 | 66h |
Tab | 0Fh | LShift | 2Ah | Num | 45h | F20 | 67h |
Q | 10h | \ | | 2Bh | Scroll | 46h | F21 | 68h |
W | 11h | Z | 2Ch | Home | 47h | F22 | 69h |
E | 12h | X | 2Dh | - | 48h | F23 | 6Ah |
R | 13h | C | 3Eh | PgUp | 49h | F24 | 6Bh |
T | 14h | V | 2Fh | K- | 4Ah | EraseEOF | 6Dh |
Y | 15h | B | 30h | 4Bh | Copy/Play | 6Fh | |
U | 16h | N | 31h | K5 | 4Ch | CrSel | 72h |
I | 17h | M | 32h | ® | 4Dh | Delta | 73h |
O | 18h | , < | 33h | K+ | 4Eh | ExSel | 74h |
P | 19h | . > | 34h | End | 4Fh | Clear | 76h |
[{ | 1Ah | /? | 35h | I | 50h | ||
] } | 1Bh | RShift | 36h | PgDn | 51h |
3. Создание лабораторного практикума "Операционная система"
Операционная система состоит из следующих компонентов:
"Собственно ядро"
Драйвера устройств
Системные вызовы
В зависимости от организации внутренних взаимодействий, ядра подразделяются на "микроядра" (microkernel) и монолитные ядра.
Системы с "микроядром" строятся по модульному принципу, имеют обособленное ядро, и механизм взаимодействия между драйверами устройств и процессами. По такому принципу строятся системы реального времени. Примерно так сделан QNX или HURD.
Монолитное ядро имеет более жесткую внутреннюю структуру. Все установленные драйвера жестко связываются между собой, обычно прямыми вызовами. По таким принципам строятся обыкновенные операционные системы типа Linux, FreeBSD.
Естественно, не все так четко, идеального монолитного или "микроядра" нет, наверное, ни в одной системе, просто системы приближаются к тому или иному типу ядра.
Один, отдельно взятый, процессор, в один момент времени, может исполнять только одну программу. Но к компьютерам предъявляются более широкие требования. Мало кто, в настоящее время, удовлетворился однозадачной операционной системой (к каким относился DOS, например). В связи с этим разработчики процессоров предусмотрели мультизадачные возможности.
Возможность эта заключается в том, что процессор выполняет какую-то одну программу (их еще называют процессами или задачами). Затем, по истечении некоторого времени (обычно это время меряется микросекундами), операционная система переключает процессор на другую программу. При этом все регистры текущей программы сохраняются. Это необходимо для того, чтобы через некоторое время вновь передать управление этой программе. Программа при этом не замечает каких либо изменений, для нее процесс переключения остается незаметен.
Для того чтобы программа не могла, каким либо образом, нарушить работоспособность системы или других программ, разработчики процессоров предусмотрели механизмы защиты.
Процессор предоставляет 4 "кольца защиты" (уровня привилегий), можно было бы использовать все, но это связано со сложностями взаимодействия программ разного уровня защиты. Поэтому в большинстве существующих систем используют два уровня.0 - привилегированный уровень (ядро) и 3 - непривилегированный (пользовательские программы).
Всем этим обеспечивается надежное функционирование системы и независимость программ друг от друга.
На "Собственно ядро" возлагаются функции менеджера памяти и процессов. Переключение процессов - это основной момент нормального функционирования системы. Драйвера не должны "тормозить", а тем более блокировать работу ядра. Windows - наглядный пример того, что этого нельзя допустить!
Теперь о драйверах. Драйвера - это специальные программы, обеспечивающие работу устройств компьютера. В существующих системах (во FreeBSD это точно есть, про Linux не уверен) предусматриваются механизмы прерывания работы драйверов по истечении какого-то времени. Правда, все зависит от того, как написан драйвер. Можно написать драйвер под FreeBSD или Linux, который полностью блокирует работу системы.
Избежать этого при двухуровневой защите не представляется возможным, поэтому драйвера надо будет тщательно программировать. В нашей работе драйверам мы уделим очень много внимания, поскольку от этого в основном зависит общая производительность системы.
Системные вызовы - это интерфейс между процессами и ядром (читайте-железом). Никаких других методов взаимодействия процессов с устройствами компьютера быть не должно. Системных вызовов достаточно много, на Linux их 190, на FreeBSD их порядка 350, причем большей частью они совпадают, соответствуя стандарту POSIX (стандарт, описывающий системные вызовы в UNIX). Разница заключается в передаче параметров, что легко будет предусмотреть. Естественно, мы не сможем сделать ядро, работающее одновременно на Linux и на FreeBSD, но по отдельности совместимость вполне реализуема.
Прикладным программам абсолютно безразлично, как системные вызовы реализуются в ядре. Это облегчает для нас обеспечение совместимости с существующими системами.
Ядро системы при распределении памяти оперирует 4-х килобайтными страницами.
Страницы могут использоваться самим ядром, для нужд драйверов (кэширование, например), или для процессов.
Программа или процесс состоит из следующих частей:
Сегмент кода. Может только выполняться, сама программа его не прочитать, не переписать не может! Использовать для этого сегмента swap не нужно, при необходимости код считывается прямо из файла;
Сегмент данных состоит из трех частей:
Константные данные, их тоже можно загружать из файла, так как они не меняются при работе программы;
Инициализированные данные. Участвует в процессе свопинга;
Не инициализированные данные. Так же участвует в свопинге;
Сегмент стека. Так же участвует в свопинге.
Но, обычно, системы делят сегмент данных на две части: инициализированные данные и не инициализированные данные.
Все сегменты разбиваются на страницы. Сегмент кода имеет постоянный размер. Сегмент данных может увеличиваться в сторону больших адресов. Сегмент стека, поскольку растет вниз, увеличивается в сторону уменьшения адресов. Страницы памяти для дополнительных данных или стека выделяются системой по мере необходимости.
Очень интересный момент:
При выполнении программы операционная система делает следующие действия:
Готовит для программы локальную таблицу дескрипторов;
Готовит для программы каталог страниц, все страницы помечаются как не присутствующие в памяти.
Все.
При передаче управления этой программе процессор генерирует исключение по отсутствию страницы, в котором нужная страница загружается из файла или инициализируется.
Еще один интересный момент:
Когда в системе загружается две или более одинаковых программы - нет необходимости для каждой из них выделять место для кодового сегмента, они спокойно могут использовать один код на всех.
Лабораторная работа № 1.
Загрузка операционной системы
Цель работы: Создать загрузочный диск для операционной системы.
Теоретические понятия.
Какие функции выполняет операционная система?
Операционная система должна выполняет следующие функции:
Обеспечивать загрузку пользовательских программ в оперативную память и их исполнение;
Обеспечивать управление памятью. В простейшем случае это указание единственной загруженной программе адреса, на котором заканчивается память, доступная для использования, и начинается память, занятая системой.
Обеспечивать работу с устройствами долговременной памяти, такими как магнитные диски, ленты, оптические диски и т.д.
Предоставлять более или менее стандартизированный доступ к различным периферийным устройствам.
Предоставлять некоторый пользовательский интерфейс.
Что такое загрузочный монитор и каково его предназначение?