önemi

2016-07-24 26 views
5

Ben sbrk sistem çağrısının belgelerine bakarak ve this bulunmuştur: Başarı durumundaönemi

, sbrk() önceki programı mola verir. (Mola artırılmışsa, bu değer yeni ayrılmış belleğin başlangıcına işaret eder). Hata durumunda, (void *) -1 döndürülür ve errno, ENOMEM olarak ayarlanmıştır. Şimdi

,

  1. (void *) -1 önemi nedir

    ?

  2. Tam olarak adreslendiği adres nerede?

  3. nasıl (void *) -1 başarısına sbrk() tarafından iade edilebilir geçerli bir adres olmadığını garanti edilir (bu hiç yaparsa)?

cevap

5
(void *) -1 == (size_t) -1 

O 32 bitlik makinede 0xFFFFFFFF ve 64 bit makinede 0xFFFFFFFFFFFFFFFF başka adrese daha büyük olması gerekiyordu geçersiz adres.

+0

Eğer tamamen noob ses çıkarsam özür dilerim, ama '(void *) -1' 0xFFFFFFFF = – tomol

+3

@tomol'e eşittir, [2s complement] 'da (https: //www.cs) okuyun.cornell.edu/~tomf/notes/cps104/twoscomp.html) – Matt

+3

@tomol, diğer yönde düşünün, 0xFFFFFFFF + 1' ne kadar? '0'!! ... Değişken deneyimler bittikten sonra bitsiz limitler, ilginç şeyler olabilir ;-) – Myst

2
  1. (void *) -1 önemi nedir?

O sbrk() başarılı durumda dönen aciz olacağını bir gözcü değeri basitçe bu.

  1. o işaret kesin hafıza adresi nedir? (Hiç de yaparsa) geçerli bir adres olması beklenmemektedir ve belirli bir değer alakalı değil mi

.

  1. nasıl (void *) -1 başarısına sbrk() tarafından iade edilebilir geçerli bir adres olmadığını garanti nedir?

Belki dairesel akıl gibi görünüyor, ama sbrk() onun sözleşmesinin bir parçası olarak garanti çünkü daha büyük pilli. (Örneğin, sbrk() o eğer başarılı bu değeri dönecekti olmadığını kontrol edebilir;. Öylesine, bunun yerine hiçbir şey ve başarısızlık rapor eğer) en modern makinelerde Uygulamada

, (void*) -1, 0xFF...FF olacak olan mümkün olan en yüksek adres olurdu ve bu geçerli olma ihtimali olmayan bir şey.

+1

Ayrıca "0xFF..FF" geçerli bir adres olsa bile, 'sbrk' syscall olan sistemler söz konusu olduğunda, bu, kullanıcı modundayken erişilemeyen bir çekirdek uzayı adresidir. Teknik olarak 'sbrk', bir hata olduğunu belirtmek için çekirdek alandaki herhangi bir * adresi kullanıcı modu koduna döndürebilir. – datenwolf

İlgili konular