Каково значение памяти в 0000:7c00 для последовательности загрузки?
Почему bios читает в загрузочной записи раздела в 0000:7c00? Что особенного в этом адресе? что делает ":" при обращении к адресу?
5 ответов
":" - это пережиток дней сегментированной памяти, когда ПК работали в реальном режиме и могли обрабатывать только 64 Кб одновременно. Число слева от ":" - это ваш сегмент, число справа - это ваш адрес.
Команда отладки windows принимает эту нотацию, если вы хотите покопаться в памяти самостоятельно:
C:\Users\Seth> debug
-d0000:7c00
0000:7C00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C10 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C40 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C50 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C60 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C70 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
Что касается этого конкретного адреса, это просто адрес, который был выбран для загрузки MBR, см. http://www.ata-atapi.com/hiwmbr.html
"Если MBR найден, он считывается в память в ячейке 0000:7c00, а INT 19 переходит в ячейку памяти 0000:7c00"
Простой ответ заключается в том, что 7C00h составляет 1 КБ (512 байт для загрузочного сектора плюс дополнительные 512 байт для возможного использования загрузочного сектора) от нижней части исходной установленной памяти 32 КБ.
Счастливый ответ заключается в том, что org 7C00h
стал синонимом загрузочного сектора - программирования загрузчика.
В оригинальном IBM PC считалось немыслимым иметь более 32 КБ ОЗУ. В терминах сегментированной адресации это 0000:8000, где 8000 шестнадцатеричное число равно 32768 десятичному. В то время мода заключалась в том, что BIOS POST завершался загрузкой загрузочного сектора дискеты в A: или основной загрузочной записи жесткого диска в C: в ячейку на 512 байт ниже верхней части памяти, что означает вычитание 0200 hex из 8000 гексов, чтобы получить 7C00. Таким образом, последовательность загрузки загрузила первый правильный 512-байтовый первый сектор, а затем установила указатель инструкции на 0000:7C00 для его выполнения. Раньше я писал код для этих первых секторов для загрузки операционной системы.
Прочитайте эту статью:
http://en.wikibooks.org/wiki/X86_Assembly/Bootloaders
Исходя из приведенного выше URL, BIOS (который фактически является аппаратным обеспечением ПК) сделает переход к памяти в 0000:7c00, чтобы продолжить выполнение в 16-битном режиме.
И процитировать сверху:
Загрузчик работает при определенных условиях, которые программист должен оценить, чтобы создать успешный загрузчик. Следующее относится к загрузчикам, инициированным BIOS компьютера:
- Первый сектор диска содержит его загрузчик.
- Один сектор занимает 512 байт - последние два байта должны быть 0xAA55 (т. Е. 0x55, а затем 0xAA), иначе BIOS будет рассматривать диск как не загружаемый.
- Если все в порядке, указанный первый сектор будет размещен по адресу ОЗУ 0000:7C00, и роль BIOS закончена, поскольку он передает управление 0000:7C00. (Т.е. это JMP по этому адресу)
Итак, при загрузке, если вы хотите, чтобы процессор начал выполнять ваш код, он должен быть расположен в памяти в 0000:7c00. И эта часть кода загружается из первого сектора жесткого диска - также делается аппаратно. И это только первый сектор, который загружается, остальные остальные части кода затем должны быть загружены этим начальным "загрузчиком".
Больше информации о первом секторе жесткого диска и дизайне 7c00:
http://www.ata-atapi.com/hiwdos.html
http://www.ata-atapi.com/hiwmbr.html
Пожалуйста, не путайте с режимом запуска ЦП - первая инструкция, которую он получит и выполнит, находится по физическому адресу 0xfffffff0 (см. Стр. 9-5):
и на этом этапе он выполняет энергонезависимый (то есть вы не можете легко перепрограммировать его и, следовательно, не входит в обязанности загрузчика) код BIOS.
Почему 7C00? На это, вероятно, лучше всего ответит программист BIOS / разработчик аппаратного обеспечения для первоначального / оригинального IBM PC BIOS.
Если вам удастся найти копию Технического справочного руководства по персональному компьютеру IBM, оно может содержать некоторые подсказки.