Когато избутвате и изваждате данни в и извън стека, какво точно премествате?

Продължавам да получавам онова малко предупредително съобщение „Въпросът, който задавате, изглежда субективен и вероятно ще бъде затворен“. Но все пак ще продължа да питам, за да видя дали някой тук може да разреши част от объркването ми.

Това се отнася за основни компютърни архитектури, т.е. такива, които имат стекове, нито една по-специално.

С подхода FILO (първи влязъл, последен излязъл), както при Intel x86, използвате push и pop, но какво означава или определя какво е било избутано?

Например, искам да натисна "променлива", да кажем ... ние знаем, че всичко в чипа е само два волта двоични бита, логически управлявани схеми, гейтове, транзистори и т.н. Когато натисна, да речем, байт съдържащ адреса, означен в двоична система по следния начин: 1000 0101, 133 или 85 (в шестнадесетичен), стойност се премества в стека ... ето някои въпроси:

1.Къде точно се намира стекът в чипа?

2.Как конфигурацията на стека на чипа разрешава/деактивира блокове от данни, които влизат и излизат от него?

3. В многозадачна среда обикновено има множество стекове. Как или откъде идват допълнителните стекове?

Знам, че това вероятно не е по темата, но искам по-добра визия на самия стек от хардуерна страна. Не, не искам да виждам снимки на плочи, разбирам идеята, но искам да си представя как данните отиват към тях, къде точно е стекът, какво има в чипа и как е конфигуриран.

Може би Electronics.Stackexchange може да помогне?


person Last Life Hump    schedule 12.11.2013    source източник


Отговори (1)


Въпросът ти е много интересен и изобщо не е субективен. Не мисля, че ще бъде затворено.

На първо място, бих предпочел да се позова на стека като използващ LIFO подход - Последен влязъл, първи излязъл. FILO е еквивалентен, но не е много обичаен, всъщност мисля, че никога не съм чувал за него.

  1. Къде точно се намира стекът в чипа?

Няма такова нещо като "чип", където се съхранява стека. Стекът се съхранява в паметта, когато издадете инструкция push, вие натискате тази стойност в паметта. Процесорът не поддържа стек - има някои регистри, но push и pop винаги използват памет. И къде в паметта се намира стекът? Е, има регистър, регистърът на указателя на стека, който показва адреса на паметта на върха на стека. Асемблерът може да инициализира този адрес вместо вас или можете да го направите ръчно (зависи от средата, в която работите).

Ако наистина искате да се задълбочите в тази тема, помислете как работи процесорът: той не е повече от куп логически схеми с контролен блок, който декодира инструкция и активира или деактивира необходимите битове и портове. Когато напишете push в изходен файл на асемблера, асемблерът превежда това в куп битове, които представляват код на операцията и аргументите за инструкцията.

По-късно, по време на изпълнение, контролният блок на процесора ще декодира тази информация. Той разглежда кода на операцията и казва "Хей, това е инструкция за натискане. Хей, ти, памет, подготви се за запис". В крайна сметка той ще получи достъп до шината, която свързва процесора и паметта, ще изпрати двоични данни през тази шина, ще активира WRITE флаг и ще посочи стойността, съхранена в регистъра на указателя на стека, като целеви адрес. Дълбоко в себе си всичко, което прави, е, че активира серия от шини и битове, за да запише в позиция в паметта. Двоичните данни, които се записват, идват от аргумента, който сте предали на push. Ако това е регистър, се осъществява достъп до регистрационния файл на процесора, за да се прочете стойността, преди тя да бъде предадена на шината на паметта.

След запис в паметта указателят на стека просто се увеличава до следващата позиция в паметта. pop е обратното: той намалява указателя на стека и след това чете всичко, което се съхранява на тази позиция (това може да е различно, напр. в push можете да пишете и след това да увеличавате, или можете да увеличавате и след това да пишете, просто трябва да сте последователни в както push, така и pop).

Можете да внедрите стек в асемблиране относително бързо и аз ви съветвам да го направите - това е страхотно упражнение, което ще ви даде полезни знания.

2.Как конфигурацията на стека на чипа разрешава/забранява блокове от данни, които влизат и излизат от него?

Стекът не е нищо повече от специално място в паметта, което можете да следите, като използвате регистъра на указателя на стека. Увеличаването и намаляването на този регистър ще ви позволи да четете произволни позиции на стека. Ако промените този регистър на напълно различна позиция в паметта, сега имате друг стек.

push и pop не е магия, това е просто четене и запис в паметта и увеличаване или намаляване на указателя на стека. просто.

3. В многозадачна среда обикновено има множество стекове. Как или откъде идват допълнителните стекове?

Отново всичко е в паметта. В многозадачна среда всеки процес има свой собствен контекст. Преди даден процес да получи процесорно време, кодът на ядрото на операционната система ще възстанови контекста на процеса, така че самият процес дори не осъзнава какво се е случило. Контекстът на процеса включва състоянието на регистрите - което също включва указателя на стека. Така че, когато даден процес се върне обратно към процесора, неговият регистър на указателя на стека ще сочи към НЕГОВИЯ стек - неговата позиция в паметта, която се използва като стек, защото ядрото е съхранило тази информация и я е върнало там, за да може процесът да я използва сякаш нищо не се е случило междувременно.

Винаги помнете, на различен слой, че позициите в паметта се поставят от L1, L2 и L3 кешове, за да се ускори общият достъп.

И така текат битовете...

person Filipe Gonçalves    schedule 12.11.2013
comment
Уау, благодаря. Вие определено изчистихте объркването ми относно концепцията за стека в компютърните архитектури, заедно с това, че ме напълнихте със знания за многозадачност, превключване на контекста и планиране (за което се стремя да науча повече за програмиране). Много благодаря. - person Last Life Hump; 15.11.2013
comment
@LastLifeHump Винаги си добре дошъл. Това са много интересни и важни концепции. Ако харесвате този вид неща, погледнете Компютърна организация и дизайн - Хардуерно/софтуерният интерфейс от Дейвид А. Патерсън и Джон Л. Хенеси. Излезе 4-то издание. Тази книга е страхотна, ще научите как работят процесорите и как се изпълняват инструкциите. Горещо го препоръчвам. - person Filipe Gonçalves; 15.11.2013