Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 326

Загрузчик. 07С0 - адрес в памяти - это смещение в байтах?

10.10.2023, 11:54. Показов 1634. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код BIOS загружает 512 байт сектора MBR в память по адресу 07С0h.
В десятичной системе счисления 07с0 - это 1984.

Правильно ли я понимаю разметку памяти в нулевом сегменте ?

0 <- - - - - - - - - - - - Memory - - - - - - - - -> N
|...1984 байта|...512 байт кода загрузчика|...|

Короче говоря, мне нужно знать сколько конкретно байт в памяти находится до границы 07c0, за которой идут 512 байт из MBR
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2023, 11:54
Ответы с готовыми решениями:

Почему в Read у FileStream offset это смещение в байтах?
Почему в Read у FileStream offset это смещение в байтах, а не в других единицах, например в индекса? Добавлено через 2 минуты Какие...

Пусть знаковое целое хранится в 2 байтах и начальный адрес массива находится в ячейке памяти 1002000
Пусть знаковое целое хранится в 2 байтах и начальный адрес массива находится в ячейке памяти 1002000: a) Описать массив array типа signed...

Какой объем (в байтах) имеет оперативная память компьютера, если FF – шестнадцатеричный адрес последнего байта оперативной памяти?
Какой объем (в байтах) имеет оперативная память компьютера, если FF – шестнадцатеричный адрес последнего байта оперативной памяти? ...

15
634 / 398 / 72
Регистрация: 29.03.2013
Сообщений: 832
10.10.2023, 12:28
Цитата Сообщение от Teamur Посмотреть сообщение
Код BIOS загружает 512 байт сектора MBR в память по адресу 07С0h.
Немного не так. Адрес загрузки - 0000:7С00. Т.е. 31КБ.
1
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 326
10.10.2023, 16:24  [ТС]
Argogo, это 62 сектора от начала памяти, тк 31744/512=62 ?
0
634 / 398 / 72
Регистрация: 29.03.2013
Сообщений: 832
10.10.2023, 17:41
Цитата Сообщение от Teamur Посмотреть сообщение
это 62 сектора от начала памяти, тк 31744/512=62 ?
Ага. Что-то смущает?
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6784 / 2027 / 235
Регистрация: 14.12.2014
Сообщений: 4,257
Записей в блоге: 12
10.10.2023, 18:56
Память не считается секторами и никакой связи с секторами не имеет.
BIOS просто читает MBR по физическому адресу 7C00. Это может быть пара сегмент-смещение 7C0h:0 или 0:7C00h, что одно и то же, по сути.
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 326
11.10.2023, 08:48  [ТС]
Jin X, Argogo, а можно ли после загрузки ядра, зачистить всё до 7c00 и использовать на своё усмотрение, тогда будет доступна абсолютно вся память, нап если оперативки 512 МБ, то доступно будет ровно 512 МБ.

А то получается какой-то обман, ЭВМ, что-то в памяти разбивает на сегменты и тп без моего ведома, а я в надежде увидеть доступной всю память, получаю ограничения, красота )))

Вот всё что до 7с00 - оно резервируется что-ли?

Так же читал, что есть какие-то зазоры в 16 бит между сегментами.

Можно ли просто при загрузке сделать так, как будто никаких сегментов вообще не существует, чтобы была просто Память (плоская линейная память), а я уже сам разобью на нужные фрагменты.

Какие-то сегменты данных, кода и тп, если можно просто указать адрес, где что-то хранится и обрабатывать через SI,SP, DI,DP диапазоны байтов

А если данные из сегментов перекроются, нап избыток кода затерёт данные в сегменте данных?

Какие-то трюки с записью в DS, нап
Assembler
1
2
mov ax, 07C0h
mov ds, ax ; запись через посредника, тк напрямую не пишется
Можно ли вообще обойтись без сегментных регистров и вручную оперировать адресами и данными?

И ещё вопрос - можно ли задать размер страницы равным размеру сегмента в 64 КБ вместо 4 КБ или сделать равным нап 512 байт как сектор дискеты ?
0
634 / 398 / 72
Регистрация: 29.03.2013
Сообщений: 832
11.10.2023, 10:53
Цитата Сообщение от Teamur Посмотреть сообщение
Вот всё что до 7с00 - оно резервируется что-ли?
Тут можно что-то посмотреть.


Цитата Сообщение от Teamur Посмотреть сообщение
Можно ли просто при загрузке сделать так, как будто никаких сегментов вообще не существует, чтобы была просто Память (плоская линейная память), а я уже сам разобью на нужные фрагменты.
Для этого можно использовать защищённый режим работы CPU (по ссылке - для 32-битных CPU; для 64-битных свои особенности) либо "нереальный режим"(для доступа к данным; для кода такое, если я правильно понимаю, не получится).


Цитата Сообщение от Teamur Посмотреть сообщение
Можно ли вообще обойтись без сегментных регистров и вручную оперировать адресами и данными?
Я не слышал про такое.
3
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
12.10.2023, 08:40
Цитата Сообщение от Teamur Посмотреть сообщение
можно ли задать размер страницы равным размеру сегмента в 64 КБ вместо 4 КБ или сделать равным нап 512 байт как сектор дискеты ?
Можно, если спаяете свой процессор, или если снаружи припаяете свою аппаратуру трансляции адресов.
Доступные варианты организации виртуального адресного пространства определяются аппаратурой. Но Вы можете сделать свои "логические страницы", объединив заданные архитектурой аппаратной платформы, скажем, 4КБ (или 8КБ) страницы в удобные вам 64 КБ (или 128 КБ) блоки. И выделять страницы прикладным программам только порциями, кратными размеру "логической страницы".

Цитата Сообщение от Teamur Посмотреть сообщение
Можно ли вообще обойтись без сегментных регистров и вручную оперировать адресами и данными?
Можно сразу запустить свое UEFI приложение в 64-разрядном ( или 32-разрядном на пожилых машинах ) режиме и не заставлять firmware читать MBR.
Если у Вас ретрокомпьютер без UEFI, можно сначала загрузить UEFI с дискеты, а потом из оболочки UEFI выполнить свою программу.

При разработке прикладных программ для linux или windows на x64 можно обойтись без сегментных регистров.

Цитата Сообщение от Teamur Посмотреть сообщение
Вот всё что до 7с00 - оно резервируется что-ли?
Это (первые 32 KB) RAM, которая должна быть установлена на IBM PC, чтобы IBM PC ROM BIOS могла выполнить IPL с дискеты. Так режили инженеры IBM. Наличие RAM выше 800016 (т.е. больше 32 KB) нужно было проверять перед использованием.
Так же читал, что есть какие-то зазоры в 16 бит между сегментами.
Там написано, как эти зазоры увидеть своими глазами?

Какие-то трюки с записью в DS,
можно напрямую поместить в DS значение, которое есть в одном из доступных сегментов:
Code
1
2
3
4
5
 
 0000                           .code
 0000  8E 1E 0000 R                     mov ds, boot_seg
 0000                           .data
 0000 07C0                              boot_seg dw 31 * 1024 / 16
Инструкций, которые помещают в сегментный регистр значение, заданное в самой инструкции, в x86 нет.
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6784 / 2027 / 235
Регистрация: 14.12.2014
Сообщений: 4,257
Записей в блоге: 12
12.10.2023, 13:27
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Цитата Сообщение от Teamur Посмотреть сообщение
можно ли после загрузки ядра, зачистить всё до 7c00 и использовать на своё усмотрение
Всё нельзя, т.к. первый килобайт (по умолчанию) используется для хранения векторов прерывания.
Далее идёт область данных BIOS.
Лучше зачищать после 0:7E00h (7C00h + 512) и до A000:0 (не включая его).

Цитата Сообщение от Teamur Посмотреть сообщение
можно ли задать размер страницы равным размеру сегмента в 64 КБ вместо 4 КБ или сделать равным нап 512 байт как сектор дискеты ?
Есть страницы по 4КБ, 2МБ (512 шт по 4КБ ) и 1ГБ. Других вариантов нет.

Цитата Сообщение от Teamur Посмотреть сообщение
Так же читал, что есть какие-то зазоры в 16 бит между сегментами.
Нет никаких зазоров. Есть описатели блоков памяти по 16 байт при резервировании памяти через функции DOS. И есть зарезервированные биты адреса при адресации в x64.

Цитата Сообщение от Teamur Посмотреть сообщение
Можно ли просто при загрузке сделать так, как будто никаких сегментов вообще не существует, чтобы была просто Память (плоская линейная память), а я уже сам разобью на нужные фрагменты.
Варианты уже обозначили выше (Protected Mode, Unreal Mode). Второй вариант можно сделать в несколько десятков байтов и поместить в сектор. В этом случае просто закидываете в какой-нибудь сегментный регистр 0 и адресуете через 32-битный регистр относительно этого сегмента.
Но! Если у вас 4ГБ памяти и больше, это не значит, что можно получить доступ ко первым 4ГБ памяти таким образом. Есть множество адресов, которые используются для отображения видеопамяти, ПЗУ, APIC, областей для "общения" с различными устройствами и т.д.
4
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 326
13.10.2023, 12:52  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
Есть множество адресов, которые используются для отображения видеопамяти, ПЗУ, APIC, областей для "общения" с различными устройствами
Означает ли это, что перед загрузкой ядра ОС,
БИОС что-то пишет по этим адресам и я, зачистив память первой строкой кода ядра, вот так:
Цитата Сообщение от Jin X Посмотреть сообщение
Лучше зачищать после 0:7E00h (7C00h + 512) и до A000:0 (не включая его)
всё сломаю и уже не смогу получить доступ к ПЗУ, сетевому адаптеру и другому оборудованию ?

Получается ли так, что перед выполнением кода ядра, Память выше 7C00h уже что-то содержит без моего ведома и все биты не равны 0
-> грязный лист, память, так сказать ?
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6784 / 2027 / 235
Регистрация: 14.12.2014
Сообщений: 4,257
Записей в блоге: 12
13.10.2023, 20:59
Teamur, в некоторые области у вас не получится ничего записать. При записи в другие вы можете что-то сломать. И это не только после 0x7C00, но и до (например, при записи в таблицу векторов прерываний или в BDA – BIOS Data Area).
Пишите в физические адреса 0x7E00...0x7FFFF (480.5 КБ) и 0x100000...0xEFFFFF (14 МБ), там наиболее безопасно.
Если нужно больше, тогда советую смотреть на доступную память через функцию E820. Всё, что помечено как "тип 1" можно юзать как хочется. В остальные области лучше не лезть.
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6784 / 2027 / 235
Регистрация: 14.12.2014
Сообщений: 4,257
Записей в блоге: 12
14.10.2023, 14:22
В принципе, если уж очень хочется, можно и адреса 0x500...0x7BFF использовать и даже 0x80000...0x9FFFF, т.е. по сути 0x500...0x9FFFF (638.75 КБ). Хотя во вторую часть вот тут не рекомендуют лезть, но на практике обычно эта область либо отсутствует, либо занимает буквально пару килобайт перед 0xA0000 (получить её сегмент можно через ah=C1h/int 15h; или прочитать слово из 0x40E).
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 326
15.10.2023, 10:04  [ТС]
Цитата Сообщение от Jin X Посмотреть сообщение
по сути 0x500...0x9FFFF (638.75 КБ)
действительно, а почему бы и нет, это же замечательно.

Там можно разместить какие-то особые данные, служебные програмки, нужные ОС.

Если можно использовать, надо использовать все ресурсы.

В 638 килобайт можно и сетевой стек уместить.

А если в дальнейшем, я собираюсь загружаться уже с жесткого диска, загрузчик нужно скопировать на него, и область выше 07C0 можно зачистить или BIOS всегда лезет по этому адресу, даже если загрузчик на жестком диске?

Как вообще BIOS узнает, что загрузчик теперь на жестком диске, а не по адресу 07c0?
0
634 / 398 / 72
Регистрация: 29.03.2013
Сообщений: 832
15.10.2023, 11:01
Цитата Сообщение от Teamur Посмотреть сообщение
Как вообще BIOS узнает, что загрузчик теперь на жестком диске, а не по адресу 07c0?
Изначально нет никакого загрузчика по адресу 0:7C00. Он туда считывается с загрузочного носителя (с того, который в настройках BIOS выбран для загрузки первым. Будь то дискета, жесткий диск, USB-флэшка или ещё что-нибудь), затем делаются некоторые проверки, и если они проходят, то управление передаётся считанному коду, если нет - происходит попытка загрузки со следующего устройства указанного в BIOS.
2
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 326
15.10.2023, 12:03  [ТС]
Argogo, я планирую сделать ОС, которая будет стоять на сервере. Хостинг поддерживает установку с образов (img, iso). На хостинге Qemu-KVM. Собираюсь использовать img-образ ( дискета )

Представляю процесс таким:
1) BIOS копирует код загрузчика из дискеты в память по 7c00
2) Загрузчик считывает код ядра из второго сектора дискеты
3) Код ядра запускает драйвер NVMe (жесткий диск), копирует на него код загрузчика, ядро и перезагружает систему
4) BIOS находит загрузчик на NVMe и затем что делает? - выполняет или копирует в память (7c00) ?
5) Ядро запускает NVMe драйвер, VirtioNET драйвер, стек UDP и слушает
6) Я дома какой-нибудь программой отправляю UDP-запросы на сервер
7) Сервер отвечает, я радуюсь

Меня прежде всего сейчас интересуют процессы, связанные с нахождением оборудования, переключением состояния системы, состояние памяти, регистров, чтобы ничего не перекрывалось и не перетиралось без моего ведома, чтобы я мог гарантировано размещать данные в памяти, в регистрах без опасений.

Знать какие инструкции и куда кладут результат. Что они делают за кулисами, помимо основного действия
Например, условно, я кладу важные данные в регистр EAX, использую какую-нибудь инструкцию, где нет ссылок на EAX, а потом проверяю EAX, а там мои данные перетерлись - вот сюрприз - поэтому мне нужно знать какие команды пишут в EAX результат, где и что меняется.

Я пишу веб-приложение, в котором можно будет видеть данные в регистрах, в памяти, на накопителях.

В него также входит редактор кода.
Разрабатываю свой Ассемблер, компилятор, изучаю кодирование инструкций (только начал) на бинарном уровне

Через какое-то время надо будет создать отдельную тему, тк эта - уже не подходит )))

Собираюсь уместить свой сервер в 1 сегмент - 64 КБ
Миниатюры
Загрузчик. 07С0 - адрес в памяти - это смещение в байтах?  
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
16.10.2023, 09:47
Цитата Сообщение от Teamur Посмотреть сообщение
Хостинг поддерживает установку с образов (img, iso). На хостинге Qemu-KVM. Собираюсь использовать img-образ ( дискета )
Загрузочный legacy ISO может быть в несколько раз меньше, чем образ дискеты.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.10.2023, 09:47
Помогаю со студенческими работами здесь

Если элемент массива - четный, то вывести его адрес памяти, если нечетный, то адрес памяти следующего и предыдущего
1. Создать массив, состоящих из 10 случайных целых чисел. 2. Создать следующий алгоритм. Если элемент массива - четное число, то...

Как заменить загрузчик Windows Boot Manager на загрузчик Grub 2 FileManager или загрузчик Grub4Dos ?
С чего-бы начать...я уже заменил WBM на Grub 2 FM,т.е. поменял сам загрузчик...на всех разделах,кроме одного...который на 16мб и без...

Размер памяти в байтах
Подскажите, пожалуйста, как узнать колл-во байт между двумя указателями? Т.е. к примеру: int *a = new int; int *b = new int; int...

Определить объем памяти в байтах указанной структуры
Обчислить объем памяти в байтах занимают следующие элементы данных: struct t { int D:2; int C:6; int F:5; float G; ...

Задача: Укажите минимальный объем памяти (в байтах)
Укажите минимальный объем памяти (в байтах), достаточный для хранения любого растрового изображения размером 32x32 пикселя, если известно,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
Настройка MTProxy
Loafer 11.06.2025
Дополнительная информация к инструкции по настройке MTProxy: Перед сборкой проекта необходимо добавить флаг -fcommon в конец переменной CFLAGS в Makefile. Через crontab -e добавить задачу: 0 3. . .
Изучаем Docker: что это, как использовать и как это работает
Mr. Docker 10.06.2025
Суть Docker проста - это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнер, если говорить образно, это запечатанная коробка, в которой находится ваше приложение вместе. . .
Тип Record в C#
stackOverflow 10.06.2025
Многие годы я разрабатывал приложения на C#, используя классы для всего подряд - и мне это казалось естественным. Но со временем, особенно в крупных проектах, я стал замечать, что простые классы. . .
Разработка плагина для Minecraft
Javaican 09.06.2025
За годы существования Minecraft сформировалась сложная экосистема серверов. Оригинальный (ванильный) сервер не поддерживает плагины, поэтому сообщество разработало множество альтернатив. CraftBukkit. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »