Въпросът ти е много интересен и изобщо не е субективен. Не мисля, че ще бъде затворено.
На първо място, бих предпочел да се позова на стека като използващ LIFO подход - Последен влязъл, първи излязъл. FILO е еквивалентен, но не е много обичаен, всъщност мисля, че никога не съм чувал за него.
- Къде точно се намира стекът в чипа?
Няма такова нещо като "чип", където се съхранява стека. Стекът се съхранява в паметта, когато издадете инструкция 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