SORU
8 AĞUSTOS 2011, PAZARTESİ


Brk( ) sistem çağrısı mı?

Linux programcıları kılavuzuna göre: "() brk ve sbrk() işlemi veri kesimi son olarak tanımlayan program sonu, konumunu değiştirmek." Veri kesimi buraya ne anlama geliyor? Sadece veri kesimi veya veri, SÜREKLİ ve yığın kombine (wiki göre: "Bazen verileri, SÜREKLİ ve yığın alanları toplu olarak adlandırılır "". veri kesimi.

Sadece veri kesimi boyutunu değiştirmek için bir neden göremiyorum. Eğer veri, SÜREKLİ ve yığın topluca sonra ise yığın daha fazla yer alacak gibi mantıklı değil.

İkinci soruma getiriyor. Tüm makaleler şimdiye kadar okuduğum, yazar öbek yukarıya doğru çıkar diyor ve yığın aşağı doğru büyür. Ama açıklamıyorlar ne öbek öbek ve yığın arasındaki tüm alanı işgal ettiğinde ne olur?

enter image description here

CEVAP
9 AĞUSTOS 2011, Salı


Kısmi cevaplar ama tam bir cevap görüyorum. İşte yine deftere resim:

simplified image of virtual memory layout

"Ara"--Adres brk sbrktarafından manipüle üstündeki noktalı çizgiyığın. Belgeleri okudun açıklanır bu gibi end "veri kesimi" çünkü geleneksel (önceden paylaşılan kitaplıkları, önmmap) Unix veri kesimi oldu sürekli öbek; önce programı başlatmak, çekirdek ki yük "metin" ve "veri" bloklar halinde RAM başlangıç adresi sıfır (aslında biraz yukarıda adresi sıfır, böylece NULL işaretçi gerçekten yoktu noktaya bir şey) ve set mola adresi ucunda veri kesimi. malloc İlk Çağrı sonra sbrk mola yukarı taşımak için kullanın ve bir yığın oluşturunarasındaveri kesimi üst ve malloc şekilde görüldüğü gibi, yeni, daha yüksek bir mola adresi, ve daha sonraki kullanım öbek gerektiği gibi daha büyük yapmak için kullanmak istiyorsunuz.

Bu arada bellek üst başlar yığını ve aşağı büyür. Yığın gerek yok açık sistem çağrıları yapmak için daha büyük; ya da başlar gibi fazla RAM tahsis etmek gibi her şey var (bu geleneksel yaklaşım) ya da bir bölgenin ayrılmış adresleri aşağıda yığını, hangi çekirdek otomatik olarak ayırır RAM ne zaman fark girişimi yazmak (modern yaklaşım). Her iki şekilde de, olabilir veya olmayabilir bir "muhafız" adresi altındaki bölge yığını için kullanılan alan. Eğer bu bölge varsa (tüm modern sistemler bunu) kalıcı olarak eşlenmemiş;yayığın veya yığın içine büyümeye çalışır, bir bölümleme hatası alıyorum. Geleneksel olarak, olsa da, çekirdek yapılmış hiçbir girişim için zorunlu bir sınır; yığını olabilir büyümek içine öbek ya da öbek olabilir büyümek içine bir yığın, ve her iki şekilde de, onlar karalama üzerinden birbirlerine veri ve program olurdu kaza. Eğer çok şanslıysanız hemen kaza olur.

Bu diyagramda 512 GB nereden geliyor emin değilim. 64-bit çok basit bellek ile tutarsız olan sanal adres alanı, orada bir harita anlamına gelir. 64-bit adres alanı daha bu gibi görünüyor bir gerçek:

less simplified address space

Bu uzaktan ölçek ve olmamalı yorumlanan tam olarak nasıl herhangi bir işletim sistemi yok (daha sonra çizdim bunu keşfettim Linux aslında koyar yürütülebilir kadar yakın adresi sıfır düşündüğümden yaptım, ve paylaşılan kitaplıklar için şaşırtıcı bir şekilde yüksek adresleri). Bu diyagram siyah bölgeler -- herhangi bir erişim acil segfault ... neden olur ve onlar eşlenmemişdevgri alanları göreceli. Açık gri bölgeler program ve onun paylaşılan kitaplıkları (paylaşılan kitaplıkları onlarca olabilir); her bir varbağımsızmetin ve veri kesimi (ve "sürekli de küresel veri içeriyor ama yer alarak, yerine bit sıfır olarak başlatıldı disk üzerinde çalıştırılabilir ya da kütüphanede olan" segment). Öbek artık mutlaka çalıştırılabilir veri kesimi çizdim ... sürekli bu şekilde, ama Linux, en azından yok gibi görünüyor. Artık sanal adres alanının üst ve öbek arasındaki mesafe saptanmış ve yığın geçiş konusunda endişelenmenize gerek yok o kadar büyük bir yığın.

Sonunu hala yığın üst sınırı. Göstermedim ancak, siyah bir yerlerde, brk yerine mmap ile yapılan bellek ayırmalarını bağımsız onlarca olabilir. (OS çarpışır yok, onlar bu brk alanından uzak tutmaya çalışacağız.)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Outler

    Adam Outler

    19 EKİM 2006
  • Dellbear816

    Dellbear816

    4 Mart 2008
  • GenTechPC

    GenTechPC

    1 Temmuz 2007