что-нибудь конкретное об адресах (0x40000000, 0x80000000 и 0xBF000000) - PullRequest
4 голосов
/ 03 апреля 2012

Я наткнулся на пример файла gdbinit, в котором были следующие операторы.Может кто-нибудь, плз, дайте мне знать, что конкретно об адресах (0x40000000, 0x80000000 и 0xBF000000)?почему при следующей проверке они сообщают мне действительный или недействительный адрес?

define dd
if ( ($arg0 & 0x40000000) || ($arg0 & 0x08000000) || ($arg0 & 0xBF000000) )
set $data_addr=$arg0
ddump 0x10 $arg0
else
printf "Invalid address: %08X\n", $arg0
end
end

Далее, как при следующей проверке тех же адресов снова указывается, какой регистр выбрать для адреса данных?

define datawin
if ( ($esi & 0x40000000) || ($esi & 0x08000000) || ($esi & 0xBF000000) )
set $data_addr=$esi
else
if ( ($edi & 0x40000000) || ($edi & 0x08000000) || ($edi & 0xBF000000) )
set $data_addr=$edi
else
if ( ($eax & 0x40000000) || ($eax & 0x08000000) || ($eax & 0xBF000000) )
set $data_addr=$eax
else
set $data_addr=$esp
end

любая помощь будет принята с благодарностью.спасибо.

Ответы [ 4 ]

2 голосов
/ 03 апреля 2012

Большинство современных операционных систем, которые работают на процессоре, имеющем возможности MMU, предоставляют процессам модель виртуальной памяти, которая разделена на определенные области. Обычно более низкие адреса принадлежат процессу, а более высокие адреса принадлежат ОС. Между ними есть пространство стека. В вашем случае это 32-битная система. Первая часть проверяет адрес на достоверность (но эта проверка не гарантирует доступность данного адреса), вторая часть просто использует данный регистр ...

2 голосов
/ 03 апреля 2012

В большинстве плат В этом случае ОЗУ от 0x00000000 до 0x00ffffff отображается, а флеш-память от 0x40000000 до 0x407fffff.

Есть много проблем с этой конкретной страницей - ИМХО она в основном устарела (возможно, она была меньшеневерно для 80386).В частности: - размер EBDA и размер видео-ПЗУ и BIOS не являются фиксированными размерами.Некоторые компьютеры являются «безголовыми» и не имеют видео (или видео-ПЗУ).

  • область между видео-ПЗУ и BIOS никогда не содержала «ничего».Он всегда был зарезервирован для других «ПЗУ конкретных устройств» (BIOS SCSI, загрузочные ПЗУ Ethernet и т. Д.), А для некоторых систем эта область может содержать полезную ОЗУ (некоторые ОС, например Windows 95, фактически сканируют эту область и используют любую ОЗУ, найденную вit).

  • для более старых компьютеров (и, возможно, новейших компьютеров, включая некоторые новые компьютеры, если для него настроен BIOS) область между 15 МБ и 16 МБ является «дырой в памяти»это было (и может все еще использоваться) для старых устройств ISA для ввода-вывода с отображением в памяти.Эта область чаще всего использовалась картами ISA SVGA, но могла использоваться любой картой ISA (даже старой картой ISA, подключенной к новому компьютеру).

  • NVRAM и ACPI не поддерживаютиспользуйте память выше 0xFEC00000 и никогда не используйте.Вместо этого используется память в верхней части ОЗУ (например, чуть ниже 0x10000000 для компьютера с 256 МБ ОЗУ).

  • обычно есть область ниже 0xFEC00000, которая используется для PCI, отображенного в память/ AGP устройства (например, видео линейный буфер кадров).Размер этой области зависит от BIOS и материнской платы (часто она начинается с 0xC0000000 или 0xE0000000).Это означает, что для компьютера с 4 ГБ ОЗУ «32-разрядная» ОС сможет использовать только 3 ГБ или 3,5 ГБ.Большинство «хороших» материнских плат будут отображать запасную оперативную память объемом более 4 ГБ (ОС должна использовать PAE, PSE36 или длинный режим для доступа к ней).Дешевые материнские платы могут просто тратить эту оперативную память вместо этого.

  • область от 0xFEC00000 до нижней части BIOS (которая на самом деле чуть ниже 4 ГБ - вся или ее часть, кажется, ниже 1МБ из-за хитрости набора микросхем) в основном зарезервирован для локальных APIC и APIC ввода-вывода (если есть).

  • Объем ОЗУ может превышать 4 ГБ на более новых компьютерах.Это не так часто, но Vista еще не была официально выпущена.

  • для серверов все может быть еще сложнее.NUMA - это одна проблема (которая включает в себя простые системы AMD с двумя сокетами), которая может привести к настройке оперативной памяти в банках (например, 512 МБ при 0x00000000 и еще 512 МБ при 0x80000000 с большой дырой между ними).Также некоторые серверы поддерживают области оперативной памяти с «горячим подключением» (которые обычно выше «установленной оперативной памяти при загрузке», а также обычно выше 4 ГБ).

http://forum.osdev.org/viewtopic.php?t=11391

http://books.google.co.in/books?id=xnFdWfJAK9wC&pg=PT289&lpg=PT289&dq=on+hard+disk+addresses+0x40000000&source=bl&ots=GFQJQ5R_-Z&sig=VchcoPWMeIE4E-Vzom1lmUxxJSg&hl=en&sa=X&ei=jvx6T4CiL8amrAeVzbiEAg&sqi=2&ved=0CEsQ6AEwAQ#v=onepage&q=on%20hard%20disk%20addresses%200x40000000&f=false

Итак, я могу сказать, что это ограничения ОС Linux для памяти.Мы не можем получить базовый адрес от 0x00000000, потому что он сопоставлен с определенным пределом.Базовый адрес 0x40000000 обычно является началом кода ОС, и аналогичным образом я могу сказать, что базовый адрес 0xBF000000 является пределом кода ОС.

1 голос
/ 06 апреля 2012

Процесс картирования можно посмотреть:

$ pmap pid
$ pmap 3724

Книга:

«Понимание ядра Linux» 9.3. Регионы памяти; 16,2. Отображение памяти «Понимание диспетчера виртуальной памяти Linux» 4.4 Области памяти

Ссылки:

http://www.scs.ch/~frey/linux/memorymap.html
http://www.linuxdoc.org/HOWTO/KernelAnalysis-HOWTO-7.html
http://linuxdevcenter.com/pub/a/linux/2006/11/30/linux-out-of-memory.html
http://www.linux-tutorial.info/modules.php?name=MContent&pageid=260
http://www.syslinux.org/wiki/index.php/Memory_Map_(General)

Поскольку я не знаю о том, что вашему коду не хватает памяти в какой системе; и что вы используете, так точное определение трудно дать. В приведенном выше ответе я привел подробности примера отображения платы из «Программирование ядра Linux - Роберт Лав» и некоторые подробности о различных операционных системах (linux) и оборудовании, имеющих несколько ограничений. Так что трудно сказать, каков предел памяти.

1 голос
/ 03 апреля 2012

Это для Linux.В вашем заголовке указан неправильный адрес: это не 0x80000000, а 0x8000000.

Программы Linux обычно загружаются с 0x8210000 (iirc).Этот диапазон предназначен для самого кода.

Стек по умолчанию равен 0xBFFF ????.Это второй диапазон.

Третий диапазон - это, вероятно, начало записываемой части данных или места загрузки библиотек.

Хотя проверки выглядят плохо написанными, нет никаких проверок, что в итоге возвращает двоичный файл AND, поэтому «0xBF000000» вернет true для гораздо большего количества адресов, чем следует.

[Редактировать] Вторая часть вашего вопроса, если какой-либо из esi / edi / eax содержит число в этом регионе, он, вероятно, будет указывать где-то в вашем регионе данных.

...