1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Несколько вопросов начинающего

Тема в разделе "WASM.BEGINNERS", создана пользователем s3dworld, 6 окт 2010.

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброго утра!

    Вот решил продолжить изучение процессора, а если быть точнее - то решил пересмотреть всё с самого начала. Так сказать: хочу по кирпичикам всё разобрать...

    При включении компьютера BIOS производит диагностику оборудования (если тестирование включено). Процессор работает в реальном режиме, то есть в 16-битной адресации. Далее он опрашивает те носители, которые указаны в списке как загрузочные. Когда он найдёт тот, где есть данные, то он копирует 512 байт в память (адрес этой памяти не помню, возможно в 0000:7c00).

    Кстати, раз реальный режим и 16-бит адресации, то не будет ли 0000:7c00 равно 0001:7bff?

    Вот мне и интересно, он копирует эти 512 байт в какую именно память? В ОЗУ? Вот у меня ОЗУ на 2048 байта (хотя не уверен что байт в байт) и он в какой-то адрес этой памяти копирует или в какую-то другую память?

    Я к чему клоню то, вот прочитал "Перезагрузку надёжнее выполнять с помощью инструкции JMP FFFF:0000 (EA 00 00 FF FF)...". Это получается что в памяти находятся инструкции для перезагрузки или как? И опять же, что это за память: ОЗУ или что-то ещё? Если это ОЗУ, то неужели производители памяти туда уже вшитые инструкции включают или туда их процессор добавляет при включении компьютера? Вот что меня интересует.

    Поясните, пожалуйста.
     
  2. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    Нет. Правило пересчета: Абсолютный адрес = Seg*16 + Ofs. Т.е. не 1:7bFF, а 1:7BF0.

    Такое крохотное ОЗУ бывает только у микроконтроллеров. :) На самом деле, видимо, 2048 мегабайтов.

    Да. Адресное пространство физически неоднородно.
    Адреса 0..9FFFF принадлежат ОЗУ.
    Адреса A0000..C7FFF принадлежат видеокарте (это видеопамять).
    Адреса C8000..EFFFF принадлежат ПЗУ видеокарты (там живет видеоBIOS).
    Адреса F0000:FFFFF принадлежат ПЗУ матплаты (там живет системный BIOS).
    Адреса 100000 и выше опять принадлежат ОЗУ.
    Где-то высоко-высоко (навскидку не помню) опять будут адреса, принадлежащие системному BIOS, но это только на современных матплатах.

    То есть, FFFF0 - это в области системного BIOS, где живут стандартные 16-битовые процедуры тестирования оборудования, обработки прерываний, работы с дисками и клавиатурой, etc.

    На матплате есть такой дивайс: контроллер памяти. Вот он и распределяет адреса между ОЗУ, ПЗУ и т.п.
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В реальном режиме сегменты пересекаются со сдвигом на 16 байт поэтому адрес 0000:7c00 = 0001:7bf0

    это ты в смысле x86 процессор в микроконтроллер встраиваешь? даже в IBM XT такого не встречалось :))
    в реал моде доступно 1Мб + 64кб ОЗУ из которых 640кб используется программами, свыше этого зарезервировано для оборудования - видеокарты и т.п.

    По адресу FFFF:0000 должно находиться ПЗУ в котором как раз BIOS и прошит, есно его туда помещают производители материнок.
     
  4. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Извиняюсь за ошибку: у меня 2048 мегабайт (2 гигабайта).

    Значит получается так:

    Код (Text):
    1. XX YY : MM NN
    XX YY - это байты для смещения, кратные 16.
    MM NN - это смещение.

    То есть 0000:0010 будет равно 0001:0000.

    2 в 16-ой степени равно 65536, то есть 64 килобайта. Видимо в реальном режиме не 16-битная адресация, раз можно адресовать 1 мегабайт памяти (например 0xFFFFF). Но суть то заключается в том, что за 512 байт важно успеть перевести процессор в защищённый режим (если нужно, то и в длинный режим) для большей адресации.

    А если у меня программа в самом начале находится в памяти с 0000:7c00 байта и занимает 512 байт (два последних байта нужно определённые чтобы были), и далее после этих 512 байт следуют байты с кодами и данными (не важно что, но что-то для меня нужное), то после перехода в защищённый режим мне нужно будет просто прыгнуть по адресу 0000:7c00 + 512 чтобы исполнялись установленные там коды?

    Я вот не понимаю процесс заполнения памяти (тут я имею в виду именно про переход в защищённый режим). Я за 512 байт должен буду заполнить разные дескрипторы, таблицы и прочее. Потом я должен в какой-то регистр (не помню его названия) указать адрес где находится описание таблицы. А если я хочу чтобы у меня данные для глобальной таблицы хранились по адресу 0000:7c00 + 1024, а для локальной таблицы - 0000:7c00 + 4096, как я могу так память с промежутками забить? Или же нужно чтобы все эти описания шли последовательно друг к другу и только так? И получается что даже если после перехода мне будет доступно 2 гигабайта памяти, то у меня всё равно эти таблицы будут в памяти , скажем,0000:7c00 + 1024?
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.204
    во первых загрузочный сектор нужен для того, чтобы можно было продолжить загрузку с диска, а не инициализировать процессор (хотя некоторые извращенцы умудряются сделать еще и это). т.е. загрузившись по адресу 07С0:0000 (или эквивалентный 0000:7C00, но в данном случае сегмент почти в 2 раза меньше чем в первом) необходимо по любому доступному адресу загрузить файл с программой с диска и просто туда перейти (если программа не требует дополнительной настройки)
    после этого программа длинной уже более 1 сектора может спокойно инициализировать процессор и при ее компиляции уже на уровне компилятора будут рассчитаны относительные адреса, а с небольшими заморочками (или при введении таблицы перемещений, но это тоже можно отнести к небольшим заморочкам) и абсолютные.
    из реального (простите виртуального) режима также можно адресовать и более 64 Кб в сегменты. для этого можно, так скажем, смухлевать (переходим в защищенный режим и загружаем в селекторы сегментов дескрипторы с гранулярностью 4 Кб и размером в 65536 страниц, а при переходе обратно забываем их восстановить).
     
  6. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Я имею в виду что все настройки для работы процессора (глобальные таблицы дескрипторов, локальные таблицы дескрипторов и прочее...) в защищённом режиме, все эти таблицы придётся друг к другу вплотную описывать? Я имею в виду, могу ли я описание глобальной таблицы дескрипторов сделать начиная с адреса 07С1:0000, либо с адреса 07С2:0000, а если захочу с адреса 07D1:0000? Я не понимаю суть именно вставки данных в любой участок памяти.

    То есть мне нужно будет писать программу, которая будет сама в указанный участок памяти такие-то данные вставлять (MOV) и потом в регистр указания адреса глобальной таблицы дескрипторов просто указать адрес где я описывал глобальную таблицу дескрипторов?

    И тогда получается что перейду я в защищённый режим, сделаю память страничками и прочее..., но у меня всё равно все структуры основные уже только будут в первом мегабайте памяти, так (так как я их заполнял в реальном режиме, а он только 1 мегабайт может адресовать)?
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    адресация 16-битная, поэтому размер сегмента 65535, а много сегментов, со сдвигом это способ обхода этого ограничения без кардинальной переделки архитектуры процессора.
    таблицы можно располагать где понравится, сегменты тоже можно определить как с перекрыванием так и с пропусками.
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.204
    Y_Mur
    главное не забывать про выравнивания
    s3dworld
    А кто сказал, что уже в защищенном режиме вы не можете скопировать их куда-нибудь по выше (например во второй мегабайт) и просто перенастроить потом туда регистры процессора
    к тому же можно просто включить защищенный плоский режим и формировать таблицы страниц уже где понравится
    т.к. для описания 2 Гб страниц памяти понадобится 2 Мб+4 Кб, а это не влезет в 640 Кб доступных в реальном режиме
     
  9. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    s3dworld
    Только не полагайтесь на то, что память обязательно где-то должна быть: даже если она по определённым адресам точно есть, там могут располагаться критически важные данные БИОС. Например, нельзя использовать самые старшие адреса нижних 640 килобайт -- там БИОС что-нибудь да хранит (в моей практике там было занято от 1 до 7 Кбайт в зависимости от мамы). В адресах выше 1 мегабайта каши ещё больше. Так что используйте соответствующие функции БИОС, чтобы узнать, память по каким адресам доступна для свободного использования (см., например, http://ru.osdev.wikia.com/wiki/Определение_объёма_памяти).
     
  10. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    max7C4
    > т.к. для описания 2 Гб страниц памяти понадобится 2 Мб+4 Кб, а это не влезет в 640 Кб доступных в реальном режиме

    Не понял, мне что, 2 МБ только заполнения таблиц нужно будет?

    Ну а разве нужно много заполнять для переключения в защищённый режим, где вся память будет как одна страничка со всеми режимами доступа (чтение, выполнение, запись)?

    Понимаете, я пока не понимаю вообще все эти тонкости: шлюзы, ловушки, свои прерывания. Мне бы для начала что-то освоить по легче, скажем переключиться со всей общей памятью. Для этого какие структуры нужно будет заполнить?
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
  12. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Если тебе будет надо иметь доступ ко всем 2 ГБ памяти. Даже в реальных ОС без особой нужны столько страниц в одно адресное пространство не маппится.
    Кстати, существующие ОС сначала переходят в защищённый режим, а уже потом строят таблицы страниц, а не наоборот. Потому что в реальном режиме особо не разгуляешься. Для простого перехода в PM Тебе надо только 24 байт структур (GDT на 3 элемента - NULL, код и данные). При включённом страничном преобразовании тебе надо 4 КБ на каталог страниц и на каждые 4 МБ примаппеной памяти по 4 КБ. То есть 0,1 процент от объёма примаппеной памяти. Это вполне нормально. Для начала я посоветовал бы вам не использовать страничную адресацию, а когда дело дойдёт до страничной адресации не помешает написать простейший менеджер памяти, потому что без него будет очень не удобно, если вам захочется маппить страницы не только один раз на этапе загрузки, но и по мере работы.
     
  13. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Начал я читать статьи про защищённый режим (http://www.wasm.ru/article.php?article=pipm01) и вот на что наткнулся:

    Тут у меня два вопроса:

    Вопрос 1
    Если у меня всего 2 ГБ оперативной памяти, мне всё равно нужно будет указывать 4 ГБ или сколько захочу?

    Я понимаю что есть виртуальная память, что-то копируется на жёсткий (подкачка), но если я никакой подкачки для начала делать не хочу, то что де мне указывать?

    Вопрос 2
    Обязательно ли нужно делать два дескриптора?

    Нельзя ли код и данные в один сегмент засунуть и просто правильно составлять программу (чтобы она перепрыгивала данные)? Я не имею ввиду как логически правильно, а просто можно ли так.
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    1. Указывай сколько захочешь, но имхо лучше 4Гб :) кстати видеопамять может находится за обычным ОЗУ с некоторым "отступом" поэтому имхо лучше иметь возможность адресовать всё пространство. А когда доберёшся до страниц и сделаешь подкачку то адресное пространство точно лишним не будет ;)

    2. эти сегменты накладываются друг на друга т.е. одинаковые адреса ссылаются на одинаковое содержимое поэтому программа в любом случае не должна быть кашей из данных и кода :) Одним сегментом обойтись нельзя т.к. в сегмент кода нельзя писать, а сегмент данных нельзя исполнять.
     
  15. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Y_Mur
    Спасибо! Но если я укажу 4 ГБ, и не сделаю страничную организацию памяти, подкачку...то при обращении к несуществующему адресу будет вызвано исключение?

    А для чего вообще предназначены шлюзы?
     
  16. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    s3dworld
    Помимо собственно ОЗУ, в адресном пространстве памяти ещё много чего лежит, к чему может потребоваться доступ. Поэтому лучше отображать всё.
    Нельзя. Кривая интеловская архитектура не позволяет иметь к одному и тому же сегменту (фактически -- через один и тот же дескриптор) доступ одновременно на чтение, запись и выполнение. Именно поэтому приходится иметь два дескриптора: один для доступа к данным (чтение-запись), а другой -- для доступа к коду (чтение-исполнение).
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    s3dworld
    нет без страничной подкачки из несуществующей памяти все биты прочитаются устанвленными в 1 (хотя могут прочитаться 0 не помню) Исключения будут только при включенных страницах.
    Шлюзы понадобятся когда дойдёшь до прерываний.
     
  18. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    s3dworld
    Может быть намного хуже: в тех адресах лежат регистры разных устройств, APIC и т.д., и чтение из них может привести к непредсказуемым последствиям. Так что обращаться к памяти надо аккуратно.
     
  19. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Ага, уяснил для себя кое что важное: ОЗУ занимается всем чем можно.

    То есть раньше я думал что ОЗУ это именно то, что полностью принадлежит операционной системе и программам пользователя. А теперь оказывается что ОЗУ содержит много уже готового (так сказать уже за программиста туда производители коды вбили).

    Важно будет научиться правильно определять свободную память.

    В статье (http://www.wasm.ru/article.php?article=pipm02) написано:

    Во-первых: что-то я его на рисунке не разглядел, а во-вторых: не понял я зачем он нужен.
     
  20. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    s3dworld
    Не только. Не путайте ОЗУ (собственно оперативную память) и адресное пространство памяти. Адресное пространство разделяется между собственно ОЗУ, ПЗУ БИОС, видеопамятью и регистрами различных устройств: часть адресов принадлежит одному, часть -- другому, часть -- третьему...

    Для страниц, содержащих стек: он же вниз растёт, а не вверх. Но вообще можно и без этого обойтись. В общем, пока не заморачивайтесь.