Нас абсолютно не устраивает та последовательность изложения материала, которая встречается в большинстве учебных пособий/курсов, как отечественного (о, господи!), так и зарубежного "копирайта". А посему мы будем придерживаться собственного Порядка. Если он кого-то не устраивает - на том же Городском Коте вы можете найти как минимум две рассылки подобного содержания, правда, с менее претенциозным названием...
1. "Девушки бываю разные - черные, белые, красные..."
2. "Что-то с памятью моей стало..."
[1] Человек может запоминать информацию различными "частями тела". "Мозгами" - это только один из многочисленных способов. Есть еще куча других. Например - "задним умом своей головы". Всех, наверное, в детстве секли ремнем. Не секли? Ну и зря... Есть некоторая информация "фундаментального" характера, которую если и запомнишь "нормальным" способом, то не надолго. А если и надолго, то руководствоваться ей по каким-либо объективным и/или субъективным причинам не станешь. А вот если "память", например, о том, что нельзя папу посылать на три веселых буквы, до конца дней твоих будет напоминать узкими шрамами на мягком месте - это уже совсем другое дело!
И да простит меня администрация Службы Рассылок (завтра будем проситься в "серебрянную категорию"), но это вовсе не "призыв к насилию" либо "материал, не соответствующий описанию", а всего лишь краткое введение на тему "зачем нужна память-только-для-чтения" (в компьютерном простанародье именуемая просто "ROM").
Однако, прежде чем мы совсем неглубоко окунемся в ее (ROM) "отражение", давайте немножко разберемся с терминологией и с некоторыми элементарными вещами, без которых нам будет трудно "держаться на плаву".
[2] Видов памяти в умных книгах расписано до черта и еще больше. Некоторые "завернутые" авторы к ней относят даже регистры (так называемая "сверхбыстродействующая" память). Не станем им уподобляться и выделим _пока_ только три ее вида:
1. Постоянная (Read Only Memory). Это некоторая информация, "намертво" вшитая "в компьютер". Это _самые стандартные_ процедуры для работы с "голым железом", а также минимальные сведения о том, что же собой представляет ваша навороченная тачка.
2. Оперативная (Random Access Memory). Это как бы рабочая область, в которой _временно_ "хранятся" программы и многочисленные промежуточные данные. После выключения компьютера вся находящаяся в ней информация имеет досадное свойство пропадать.
3. Дисковая память. Обоснование смысла ее бытия :) следует из последней строчки предыдущего пункта. В этом виде памяти ("винчестеры", "дискеты") как раз и обречены на долговечное сущестование программы и прочие данные.
И вот, значит, что у нас с памятью "происходит" при включении компьютера:
[3] Сначала выполняется проверка оборудования.
Не пропало ли чего? Не появилось ли чего нового? А что это за процессор установлен? И исправен ли он? А что у нас за винчестер и на каком "языке" с ним разговаривать? Кто я? Где я? Когда я?
Короче - глобальное "АУ" на весь "лес" из проводов и "фигнюшек". Кто откликнется, с тем и дружить будем, а остальных - нехай волки съедят, если еще не съели... (чур Видюху, Клаву, Шину и т. д. не есть!).
Проверка оборудования выполняется хитрой низкоуровневой программой, которая запускается из ROMа. Если с каким-либо устройством можно общаться на "нескольких языках" (или если вы вообще с этой редиской разговаривать не хотите), то вам будет предложено сделать выбор. Правда, в большинстве случаев об этом нужно просить - например нажатием кнопки DEL перед загрузкой.
осле того, как обстановочка слегка прояснится, результаты проверки оборудования переносятся в оперативную память - для того, чтобы другие программы могли впоследствии эти данные использовать для своих безусловно (пакостных) целей.
алее эта хитрая программулька передает управление системному загрузчику.
[4] Системный загрузчик - тож программа хитрющая. Ее 512 байт располагаются на диске, но не в виде файла, а в "специальной" области - загрузочном секторе. (MBR - Master Boot Record).
Наверное, вам уже известно, что для создания системной дискеты недостаточно просто скопировать на нее необходимые системные файлы, а нужно предварительно отформатировать ее "как системную" или воспользоваться утилитой sys.com (c:/windows/command/). Все, что "делают" данная опция форматирования и утилита sys.com - это как раз и есть запись системного загрузчика в MBR вашего жесткого или гибкого диска.
[5] Как уже говорилось, в ROM помимо всего прочего, зашита базовая система ввода-вывода. Однако этой "базовой системы" для работы компьютера маловато будет. А посему на жестком диске раполагается ее "расширение" - в файле io.sys.
Очевидно, что это расширение можно с легкостью изменять, модернизировать, патчить, фиксить - диск он все выдержит. А вот то, что в ROM зашито (повторимся) - своего рода незыблемый закон, пачка "компьютерных" аксиом, на основе которых построено множество завернутых теорем (все они как-раз таки и зашиты в io.sys).
Так вот, первое, что делает "системный загрузчик" в MBR - это вытягивает за хвост расширение BIOS, то есть "комплект теорем", на основе которых впоследствии можно, собственно, и работать.
[6] После загрузки "расширения" системный загрузчик передает управление "командному интерпретатору" command.com. Однако перед этим запрашиваются многочисленные настройки из файла msdos.sys. Например, какой интерпретатор использовать, где он находится (ведь не обязательно в корневом каталоге диска "цэ") и прочие, которые мы еще будем рассматривать.
Первое, что делает "командный интерпретатор command.com" - загружает программы-посредники (они же - драйвера), указанные в файле config.sys. Это своего рода переводчики между языком, который понимает интерпретотор и "родным" языком многочисленных устройств вашего компьютера (как-то: звуковая плата, мышь и пр.).
Вот теперь, можно сказать, что операционная система загрузилась :). То есть не вся, конечно, а лишь жизненно необходимый минимум. "Интерпретатор команд", одним словом, загрузился. Теперь и юзверу можно внести свою скромную лепту - какую-нить команду ввести, например...
Правда, перед тем, как дать это сделать юзверу, command.com выполняет "простыню" команд из "плэйлиста" по имени autoexec.bat. А вот потом уже - пожалуйста:
С:\ (приглашение такое)
[7] Итак, вкратце, компьютер "включается" следующим образом: после тестирования "железа" загружается базовая система ввода-вывода, которая передает управление программе в MBR загрузочного диска. Эта программа в свою очередь подгружает расширение базовой таблицы из файла io.sys. Далее MBR читает установки msdos.sys и загружает командный интерпретатор command.com с той или иной конфигурацией. Командный интерпретатор подключает драйвера различных устройств (config.sys) и выполняет пакет команд из autoexec.bat.
После выполнения последней команды пакета выводится приглашение ввести команду самому пользователю. Что он будет потом делать - мастдая загружать или в досе оставаться - это уже его проблемы.
[8] Read Only Memory пока что оставим в покое. Позже мы к ней еще вернемся. Что касается остальных двух видов памяти (дисковая и оперативная), то прежде чем мы "потрогаем их руками", необходимо сначала познакомиться с такой вещью, как адресация.
Всю оперативную (с дисковой мы потом разберемся) память можно представить в виде толщенной книги, у которой пронумерованы не только страницы, но и строчки.
А дальше все просто: для обращения к конкретному "месту" памяти мы должны указать номер страницы (он же "сегмент" по-компьютерному) и номер строчки (оно же - "смещение"). Правда, иногда нужно указывать еще и "номер книги", но, боюсь, эту тему мы с вами рассмотрим еще не скоро.
[9] Посмотрите на вашу оперативную память прямо сейчас! Для этого запустите программу debug.exe из c:\windows\command и в ответ на появившееся приглашение "-" введите команду "d" (от английского dump).
Вот что вы по идее должны увидеть:
{картинка поскипана}
Эта картинка и называется дампом оперативной памяти.
Слева - это адрес: сегмент памяти + смещение (после двоеточия). Тех, кого смущает наличие буковок в адресе, отсылаем в начало курса - ознакомтесь сначала с системой счисления, так как все числа, отображаемые программой debug - именно шестнадцатеричные.
[10] Ну и что из этого следует? Толку, что мы можем полюбоваться на дамп памяти? (Надеюсь, вопрос о "толке" у вас возникает постоянно...) Зачем это нужно?
А вот зачем:
Как уже говорилось, после тестирования железа программулькой из ROMа, результаты тестирования и некоторые установки переносятся в RAM - это чтобы потом эти "секретные материалы" могла использовать операционная система и прикладные программы.
Вот мы и предлагаем вам сделать небольшую экскурсию по этой области памяти...
Кстати, команда "d" безо всяких параметров выводит просто текущий сегмент памяти, начиная со смещения 100. Чтобы вывести дамп какой-либо конкретной области, нужно всего-то ничего - после команды "d" указать еще и адрес :-) например, "d 10A0:0100". Можно также указать и желаемую длину выводимой строки при помощи ключа "L" ("d 10A0:0100 L 5").
[11] А теперь мы устроим небольшую экскурсию по данной области памяти :-)))).
Первое, на что мы посмотрим, это доступный для программы объем памяти. Это информация расположена по адресу 40:14. Вводим команду (после "минусика"): d 0:413 L2.
На экран должно вывалиться две пары цифр - это доступные килобайты памяти, но в шестнадцатеричной системе счисления. Переведите (в уме естественно) полученное значение в десятичный формат.
32770 K получилось??? А вот и не правильно! На самом деле будет правильно, если их поменять местами сначала :(. Вы потом поймете почему - когда мы разберемся с регистрами. А пока что помедитируйте над следующей табличкой (мы ее у Абеля скатали... хе-хе...):
Шестнадцатеричное нормальное | Шестнадцатеричное обратное | Десятичное (К) |
80 00 | 00 80 | 128 |
00 01 | 01 00 | 256 |
80 01 | 01 80 | 384 |
00 02 | 02 00 | 512 |
80 02 | 02 80 | 640 |
То бишь две пары цифирь, которые у вас получились, поменяйте местами и это будет объем доступной памяти в HEX :-) Во как!
Что? У вас 128 мег ОЗУ, а этот хренов debug показал только жалких 640 килобайт???
Э-э-э, ребята... Оперативная память тоже разная бывает :). Ту, которую мы колумаем - это типа только основная - ее даже на самых навороченных тачках 640 k. А то, что выше - это уже совсем другая история. (Но мы и с ней вскоре познакомимся!)
[12] Теперь посмотрим, какие еще "секретные сведения" нам можно из этой области памяти выколупать:
Например, по адресу ffff:5 - системная дата. Только она в "правом блоке" дампа отображается, там где "буковки" и "точечки" какие-то нездоровые.
Это только первое "погружение", поэтому мы не будем вам объяснять чем "правый блок" от левого отличается :))
[13] Короче, искателям приключений на свое мягко место выдаем "простыню" самых интересных адресов (большинство слов в описании вам пока должны быть непонятны, но вы не пугайтесь!):
417 - два байта разрядов состояния клавиатуры. Они активно используются ROM-BIOS для управления интерпретаций действий клавиатуры. Изменение этих байтов изменяет значение нажатых клавиш :). Прикол, не правда ли?
41A - cлово по этому адресу указывает на начало буфера BIOS для ввода с клавиатуры, расположенного начиная с адреса 41E; в этом буфере храняться и ждут обработки результаты нажатия на клавиши. Конец буфера - слово по адресу 41C.
43E - байт указывает, необходима ли проверка дискеты перед подводом головки на дорожку. Разряды с 0 по 3 соответствуют дисководам с 0 по 3. Если разряд установлен в 0, то необходима проверка дискеты. Как правило, вы можете обнаружить, что разряд установлен в 0, если при предыдущем обращении к дисководу имели место какие-либо проблемы.
Например, разряд проверки будет равен 0, если вы попытаетесь запросить каталог на дисководе, на котором нет дискеты, и затем на запрос, появившийся на экране дисплея: "Not ready reading eroor B; Abort, Retry, Ignore?" вы ответите: A.
44C - 2 байта - длина регенерации экрана. Это число байтов, используемых для страницы экрана. Зависит от режима.
44E - 2 байта - смещение для адреса начала текущей страницы в памяти дисплея. Этот адрес указывает, какая страница в данный момент используется.
460 - 2 байта - размер курсора, представленный в виде диапазона строк развертки. Первый байт дает конечную, а второй - начальную строку развертки.
Честно говоря, эту простыню можно растянуть еще выпусков на пять рассылки :))). Естественно, мы это делать не собираемся.
[14] Ну... еще один и хватит, пожалуй, адресов :).
449 - значение этого байта от 0 до 10 или от 13 до 15 определяют текщий режим выдачи изображения. Расшифровка в табличке:
Код | Значение |
0 | 40-колонный текст, нет цвета |
1 | 40-колонный текст, 16 цветов |
2 | 80-колонный текст, нет цвета |
3 | 80-колонный текст, 16 цветов |
4 | Графика со средним разрешением, нет цвета |
5 | Графика со средним разрешением, нет цвета (4 уровня серого) |
6 | Графика высокого разрешения, 2 цвета |
7 | Режим монохромного адаптера |
8 | Графика низкого разрешения, 16 цветов (в CGA нет) |
9 | Графика среднего разрешения, 16 цветов (в CGA нет) |
10 | Графика высокого разрешения, 4 цвета (в CGA нет) |
13 | Графика среднего разрешения, 16 цветов (в CGA нет) |
14 | Графика высокого разрешения, 16 цветов (в CGA нет) |
15 | Специальная графика высокого разрешения, 4 цвета (в CGA нет) |
[15] На самом деле все намного сложнее, чем мы вам тут расписали. Из каждого правила существует куча исключений. Помните, что это только первое погружение в данную тему - совсем не глубокое. На каждом из этих пунктов мы еще будем останавливаться подробнее, но имейте терпение - не все сразу.
И еще один нюанс :). Сначала мы будем изучать моменты, которые являются ОБЩИМИ для всех моделей процессоров и только потом перейдем к "частностям". А так как "наиболее общей" частью современных компьютеров является архитектура процессора 8086 - с него и начинаем.
Ну а далее, естественно: 86(88) -> 286 -> 386 -> 486 -> P -> P2.
Дожить бы до последнего, правда? (уф... устал я от жизни, ясно!)
В следующем номере - знакомство с регистрами, а также немножко булевой алгебры. Хотя, если чесна, мы оставляем за собой право не выполнят свои обещания :). Ну... редиски мы такие нехорошие... сегодня одно обещаем сделать, а завтра вот передумать можем ни с того, ни с сего...