SORU
2 Mart 2011, ÇARŞAMBA


Bir bilgisayar programı çalıştığında ne olur?

Genel teori biliyorum ama detayları almıyor.

Bir program, bir bilgisayarın ikincil bellekte bulunan biliyorum. Program yürütme başladığında tamamen RAM'E kopyalanır. Sonra işlemci bir seferde birkaç talimatları (otobüsün büyüklüğüne göre değişir) almak, kayıtları koyar ve onları çalıştırır.

Ben de bir bilgisayar programı iki tür bellek kullandığını biliyor: yığın ve de bilgisayar. ana bellek parçası olan yığın, Yığın dinamik olmayan bellek, Dinamik Bellek yığın için kullanılır (örneğin, her şeyi C new operatörü ile ilgili )

Anlamıyorum ne bu iki şey nasıl bağlanıyor. Hangi noktada talimatlarının yürütme için kullanılan yığını mı? Talimatları kayıt için yığın RAM, gidelim mi?

CEVAP
2 Mart 2011, ÇARŞAMBA


Gerçekten sistemine bağlıdır, ama virtual memory modern İşletim sistemleri süreci kendi görüntüleri yüklemek ve bu gibi bir şey: bellek ayrılamadı eğilimindedir

 --------- 
|  stack  |  function-local variables, return addresses, return values, etc.
|         |  often grows downward, commonly accessed via "push" and "pop" (but can be
|         |  accessed randomly, as well; disassemble a program to see)
 --------- 
| shared  |  mapped shared libraries (C libraries, math libs, etc.)
|  libs   |
 --------- 
|  hole   |  unused memory allocated between the heap and stack "chunks", spans the
|         |  difference between your max and min memory, minus the other totals
 --------- 
|  heap   |  dynamic, random-access storage, allocated with 'malloc' and the like.
 --------- 
|   bss   |  Uninitialized global variables; must be in read-write memory area
 --------- 
|  data   |  data segment, for globals and static variables that are initialized
|         |  (can further be split up into read-only and read-write areas, with
|         |  read-only areas being stored elsewhere in ROM on some systems)
 --------- 
|  text   |  program code, this is the actual executable code that is running.
 --------- 

Bu işlem sanal bellek sistemlerinde birçok ortak Adres. "Delik" toplam bellek, eksi alanı diğer tüm alanları kaplıyor boyutunu; bu öbek içine büyümek için alan büyük miktarda verir. Bu da "sanal", yani senin için haritalargerçekçeviri bir tablo ile bellek ve aslında gerçek bellek içinde herhangi bir yerde saklanabilir. Bu şekilde, başka bir işlemin bellek erişimini bir süreci korumak için, ve her işlem komple bir sistem üzerinde çalışıyor düşündürmek için yapılır.

Örneğin, stack ve heap pozisyonları bazı sistemlerde farklı bir düzen (Billy O'Neal's answer aşağıda Win32 hakkında daha fazla bilgi için bakınız) olabilir.

Diğer sistemler olabilirçokfarklı. DOS, örneğin, çalışan programlardan çok farklı baktığımda* *15, ve bellek tahsisi koştu:

 -----------  top of memory
| extended  | above the high memory area, and up to your total memory; needed drivers to
|           | be able to access it.
 -----------  0x110000
|  high     | just over 1MB->1MB 64KB, used by 286s and above.
 -----------  0x100000
|  upper    | upper memory area, from 640kb->1MB, had mapped memory for video devices, the
|           | DOS "transient" area, etc. some was often free, and could be used for drivers
 -----------  0xA0000
| USER PROC | user process address space, from the end of DOS up to 640KB
 ----------- 
|command.com| DOS command interpreter
 -----------  
|    DOS    | DOS permanent area, kept as small as possible, provided routines for display,
|  kernel   | *basic* hardware access, etc.
 -----------  0x600
| BIOS data | BIOS data area, contained simple hardware descriptions, etc.
 -----------  0x400
| interrupt | the interrupt vector table, starting from 0 and going to 1k, contained 
|  vector   | the addresses of routines called when interrupts occurred.  e.g.
|  table    | interrupt 0x21 checked the address at 0x21*4 and far-jumped to that 
|           | location to service the interrupt.
 -----------  0x0

DOS işletim sistemi belleğe doğrudan erişim izni, kullanıcı uzay programları genellikle doğrudan erişim ya da üzerine bir şey beğendiklerini ifade hangi koruma ile görebilirsiniz.

İşlem Adres, ancak programlar, benzer eğilimi, kod segment, data segment, yığın, yığın segment olarak tarif ediyorlardı sadece, vb., ve biraz farklı eşlenen oldu. Ama genel alanların çoğu hala oradaydı.

Üzerine yükleme programı ve gerekli shared libs içine bellek ve dağıtma parça programı içine doğru yerlere OS başlar yürütülen süreç her yerde kendi ana yöntemdir, ve programınızı alır oradan, yapma, sistem çağrıları gibi gerektiğinde ihtiyacı onları.

Farklı sistemler (gömülü, her neyse) olabilir çok farklı mimarileri gibi yığınsız sistemleri, Harvard mimarisi sistemleri (kod ve veri içinde tutulmak ayrı fiziksel bellek), sistemleri, aslında tutmak, SÜREKLİ olarak salt okunur bellek (başlangıçta set ile programcı), vb. Ama bu genel özü buydu.


Size " dedi

Ben de bir bilgisayar programı iki tür bellek kullandığını biliyor: yığın ve de bilgisayar. ana bellek parçası olan yığın,

"Yığın" ve "yığın" sadece soyut kavramlar yerine, (mutlaka) "" bellek. her türlü farklı fiziksel

stack sadece-son, ilk çıkar bir veri yapısıdır. X 86 mimarisi, aslında rastgele bir ucundan uzaklığı kullanılarak ele olabilir, ama en yaygın işlevleri ve öğeleri sırasıyla ekleyip PUSH POP. Genellikle fonksiyon-yerel değişkenler için kullanılır (sözde "otomatik depolama"), fonksiyon bağımsız değişkenleri, iade adresleri, vb. (daha aşağıda)

"heap" isteğe bağlı ayrılabilir ve rastgele gönderilen hafıza Bir parça için sadece bir lakap (yani, herhangi bir yere doğrudan erişim. Çalışma zamanı (C, new ** 8, malloc kullanma ve arkadaşları C, vb) tahsis veri yapıları için kullanılmaktadır.

Fiziksel bellek (RAM) bulunması ve sanal bellek ayırma ile eşleştirilir sürecine hem x 86 mimarisi, yığın ve öbek, yukarıda açıklandığı gibi adres alanı.

registers (hala 86), fiziksel olarak içinde bulunan işlemci (karşıt olarak RAM), ve, dolu tarafından işlemci, METİN alanı (ve de olabilir yüklü gelen başka bir hafıza ya da diğer yerlere göre CPU talimatları aslında idam). Aslında sadece çok küçük, çok hızlı çip üzerinde farklı birçok amaç için kullanılan bellek yerleri vardır.

Kayıt düzeni Son derece bağımlı mimarisi (aslında, kaydeder, komut kümesi, bellek tasarımı, tam olarak ne anlam olarak "mimarlık"), ve bu yüzden istemiyorum genişletmek üzerine, ama tavsiye almak bir derleme dil kursu anlamak onları daha iyi.


Soru:

Hangi noktada talimatlarının yürütme için kullanılan yığını mı? Talimatları kayıt için yığın RAM, gidelim mi?

Yığın (ve onları kullanan sistemler/dil) sık sık bu şekilde kullanılır:

int mul( int x, int y ) {
    return x * y;       // this stores the result of MULtiplying the two variables 
                        // from the stack into the return value address previously 
                        // allocated, then issues a RET, which resets the stack frame
                        // based on the arg list, and returns to the address set by
                        // the CALLer.
}

int main() {
    int x = 2, y = 3;   // these variables are stored on the stack
    mul( x, y );        // this pushes y onto the stack, then x, then a return address,
                        // allocates space on the stack for a return value, 
                        // then issues an assembly CALL instruction.
}

Böyle basit bir program yazma ve derleme (GCC eğer erişiminiz varsagcc -S foo.c) derleme ve bir göz atın o zaman. Meclis oldukça takip etmek kolaydır. Yığın işlevleri çağırmak için fonksiyon yerel değişkenler için kullanılan, onların argümanları ve dönüş değerleri saklamak görebilirsiniz. Böyle bir şey yapmanız da

f( g( h( i ) ) ); 

Bunların hepsi sırayla aradı. Kelimenin tam anlamıyla işlev çağrı yığını ve onların bağımsız bir yapı, yürütme, ve sonra geri aşağı (veya yukarı;) rüzgar gibi soyunmaya. Ancak, yukarıda da bahsedildiği gibi, yığın (x 86) aslında bulunduğu süreç bellek alanı (sanal bellek), ve bu yüzden olabilir manipüle doğrudan; değil ayrı bir adım sırasında yürütme (ya da en azından dik işlem).

BİLGİNİZE, yukarıda C calling convention da C tarafından kullanılır . /Sistemleri farklı sırada yığını ve bazı diller/platformlar üzerine tartışmalar itebilir diğer dilleri bile yığınları kullanmayın ve farklı şekillerde bunu.

Ayrıca not, bu C kodu yürütme gerçek çizgiler değil. Derleyici çalıştırılabilir makine dili talimatları içine dönüştürdü.Sonra (genellikle) CPU kayıtlarına CPU boru hattına METİN alanında, sonra kopyalanır ve oradan yürütüldü.[Bu yanlış oldu. Ben Voigt's correction aşağıya bakınız.]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • guau . .

    guau . .

    25 Ocak 2008
  • ICON

    ICON

    19 EKİM 2011