Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Низкоуровневое программирование для дZeнствующих # 3


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Здесь, по идее, должна быть Ваша реклама
рассылка для изобретателей фонариков на солнечных батарейках
НИЗКОУРОВНЕВОЕ ПРОГРАММИРОВАНИЕ #3

ПРЕДУПРЕЖДЕНИЯ:
ПРИГЛАШАЮТСЯ:
САЙТ HI-TECH:
> В связи с присутствием в рассылке графики настоятельно рекомендуем подписываться на HTML-версию.
> В связи с затянувшимся "расширением канала" у нашего провайдера возможны задержки с выпуском рассылки.
> авторы.
> корректоры.
> художники/дизайнеры.
> владельцы сайтов, авторы рассылок (для взаимной рекламы)
> (хм) спонсоры и рекламодатели.

> архив рассылки
> коллекция инструментов
> исходные тексты
> документация
> учебники, статьи
> форум и хм... гостевая книга


 ЧИТАТЕЛЯМ...

   Нас абсолютно не устраивает та последовательность изложения материала, которая встречается в большинстве учебных пособий/курсов, как отечественного (о, господи!), так и зарубежного "копирайта". А посему мы будем придерживаться собственного Порядка. Если он кого-то не устраивает - на том же Городском Коте вы можете найти как минимум две рассылки подобного содержания, правда, с менее претенциозным названием...

 2. ОСНОВНОЙ КУРС


 2.1. Первое погружение. Виды памяти. Загрузка машины. Область данных BIOS.


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.
   Дожить бы до последнего, правда? (уф... устал я от жизни, ясно!)

 АНОНС!

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

Бесплатный доступ в Инет предоставлен... ну кем? кем? ну?

Рассылка "Низкоуровневое программирование для дZенствующих", #3

http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное