как различать память (кучу) и стек-адреса

мой вопрос: когда у меня есть что-то вроде этого:

lea rax, rbp - 8

// Возможно, это int в моем стеке, потому что в моем коде есть локальная переменная "int". Как процессор узнает, где находятся данные, когда я делаю это:

mov qword [rax], 14

Я имею в виду, это просто адрес... Что, если бы я зарезервировал память по адресу 2^64 - x?

Разве ваша выделенная память не может иметь такой адрес?

Или что, если стек вырос до тех пор, пока его адреса не сравняются с выделенной вам памятью?

Такое бывает?

Ассемблер не знает, что такое число в rax, поэтому это не может быть MOVstack и MOVheap, как в случае с ближним и дальним JMP.


person Banyoghurt    schedule 13.11.2012    source источник
comment
стек и куча — это понятия, которые стоят выше набора инструкций. набор инструкций считывает и записывает адреса памяти в указанные регистры, адреса что-то значат для программы, но ничего не значат для оборудования. вы можете использовать указатель стека для чтения кучи и gpr для чтения стека, аппаратное обеспечение не заботится об этом.   -  person old_timer    schedule 14.11.2012
comment
Спасибо, именно эти глупости не дают вам спать всю ночь...   -  person Banyoghurt    schedule 14.11.2012


Ответы (1)


Как процессор узнает, где находятся данные, когда я делаю это mov qword [rax], 14

Зачем процессору знать, находятся ли данные в стеке или в куче? оба находятся в одном месте, в оперативной памяти.

Я имею в виду, это просто адрес... Что, если бы я зарезервировал память по адресу 2^64?

Вы не сможете зарезервировать там память, если адрес больше вашего адресного пространства.

Или что, если стек увеличился до тех пор, пока его адреса не сравнялись с выделенной вам памятью? Такое бывает?

Да, такое случается, это называется stackoverflow :) и, скорее всего, приведет к ошибке сегментации.

Ассемблер не знает, что такое число в rax, поэтому это не может быть MOVstack и MOVheap.

Насколько мне известно, нет отдельных инструкций для доступа к стеку или куче, как я уже сказал, и стек, и куча существуют в оперативной памяти. Все, о чем заботится ЦП, — это адрес для записи или чтения, однако на некоторых архитектурах, которые не имеют ввода-вывода с отображением в память, существуют специальные инструкции для доступа к регистрам ввода-вывода, большинство архитектур видят ввод-вывод. O как просто еще один адрес памяти.

Вам следует прочитать книгу об архитектуре компьютера, я рекомендую эту Computer Organization и дизайн, 4-е изд. Паттерсона.

person iabdalkader    schedule 13.11.2012
comment
ЦП не имеет прямого доступа к ОЗУ, или нет? Я думал, что все прошло через MTU, я думал о виртуальном адресном пространстве, но опять же, я не сказал этого в вопросе... Но значит ли это, что размер стека ограничен? - person Banyoghurt; 14.11.2012
comment
@user1821933 user1821933 это зависит от архитектуры, он может получить доступ к оперативной памяти напрямую или через кеш, он может использовать прямой доступ или DMA. - person iabdalkader; 14.11.2012
comment
@user1821933 user1821933 вы, вероятно, имеете в виду MMU, не у каждого ЦП он есть, у некоторых даже нет кешей или им нужна внешняя память (MCU), в этом случае ЦП может передавать данные из памяти напрямую или через DMA, в любом случае, стек против памяти. куча вещь неактуальная, да и размер стека ограничен, оперативка конечна :) - person iabdalkader; 14.11.2012
comment
память имеет слои, глубоко внутри процессора есть интерфейс оперативной памяти, затем вы получаете mmus, кэши, контроллеры памяти, периферийные устройства и т. д., которые распределяют доступ к процессору. на уровне инструкций (в этой архитектуре) доступ к памяти является доступом к памяти. используйте указанный адрес и выполните чтение или запись, используя указанный размер, и поместите или получите значение, где указано. - person old_timer; 14.11.2012
comment
на уровне инструкций адрес оперативной памяти не обязательно должен иметь смысл, вы можете легко сказать процессору получить доступ к адресу, который не имеет периферийного устройства или памяти, отображенной на ассемблере, ассемблер должен принять этот адрес и правильно закодировать инструкцию, процессор должен правильно инициировать инструкция, что происходит оттуда, влияет ли ошибка непосредственно на выполнение или происходит после выполнения этой инструкции, зависит от архитектуры. - person old_timer; 14.11.2012
comment
важно расставить вещи по своим местам. .data, .text и т. д., стек и куча, знаковое и беззнаковое сложение и вычитание, символы и байты — все это концепции программирования, которые не имеют прямого отношения к оборудованию. есть указатели стека и инструкции указателя стека, но это не имеет ничего общего с фактической памятью или тем, кто произвольно определил, что один байт должен быть в стеке, другой байт должен быть в куче, а другой - .text и т. д. также отдельно процессор и его набор инструкций от его периферийных устройств, включая mmu и т. д. - person old_timer; 14.11.2012