Otobüs hatası - Bus error

Gelen bilgi işlem , bir otobüs hatası bir olan fay bir bildirimde donanım tarafından kaldırdı işletim sistemini bir süreç erişmeye çalışıyor ki (OS) bellek o işlemci için geçersiz bir adres: fiziksel adresi olamaz adres yolu , dolayısıyla adını. En mimarileri modern kullanımda bu çok daha nadirdir Segment arızaları sorunlar: nedeniyle bellek erişimi ihlallerine öncelikle ortaya, mantıksal adrese veya izinleri.

On POSIX uyumlu platformlar, otobüs hatalar genellikle hataya neden işlemine gitmesinin SIGBUS sinyali ile sonuçlanır. Bir otobüs hatası nadiren anlamına gelir gerçi SIGBUS ayrıca, bilgisayar algılar herhangi genel cihaz arıza neden olabilir bilgisayar donanım fiziksel olarak kırık-it olan, normalde bir kaynaklanır hata içinde yazılım . Otobüs hataları da diğer bazı çağrı hatalar için kaldırılabilir; aşağıya bakınız.

Nedenler

Yol hatalarının en az üç ana nedeni vardır:

Varolmayan adresi

Yazılım okumak veya belirli bir fiziksel yazmak için CPU talimat bellek adresini . Buna göre, işlemci onun bu fiziksel adres setleri adres yolu ve onlar bu özel adresi için cevap verirsen, sonuçlarla cevap CPU'ya bağlı tüm diğer donanım ister. Başka bir donanım yanıt verirse, CPU bir yükseltir istisna talep fiziksel adres bütün bilgisayar sistemi tarafından tanınmadı belirten. Bu sadece kapakları unutmayın fiziksel bellek adreslerini. Tanımlanmamış erişmeye çalışırken sanal bellek adresi genellikle eğer olsa, bir segmentasyon hatası yerine bir otobüs hatası olarak kabul edilir MMU'nun ayrıdır, işlemci farkı söyleyemem.

hizalanmamış erişim

En CPU olan bayt adreslenebilir her bir benzersiz bir bellek adresi bir 8-bit belirtir burada, bayt . Bu birimler "olmadan (böylece 16 bit, 32 bit, 64 bit ve) En CPU'lar her bellek adresinden bireysel bayt erişebilir, ancak bunlar genellikle daha büyük birimler erişemez hizalanmış (belirli bir sınıra" x86 platformu önemli bir istisnadır olmak ).

Örneğin, çoklu-bit kere 16 bit hizalı, adresleri olmalıdır (bayt olarak verilmiştir) sırasıyla 0, 2, 4, 6, ve böylece, hizalanmış ve dolayısıyla erişilebilir düşünülebilir ise adres 1, 3, 5, ve böylece unaligned düşünülebilir. Benzer şekilde, çok baytlık kere 32-bit hizalı olması gerekir, adresleri 0, 4, 8, 12, ve böylece hizalanmış olarak kabul edilir ve bu nedenle, erişilebilir ve arada kalan tüm adres hizalanmamış düşünülebilir. Bir hizalanmamış adresteki bir bayt daha büyük bir birim erişmeye çalışan bir otobüs hataya neden olabilir.

Bazı sistemler, bu kullanılan mimarisine bağlı olarak bir melez sahip olabilir. Örneğin, donanımın göre IBM System / 360 da dahil olmak üzere ana bilgisayar, IBM System z Fujitsu B8000, RCA Spectra ve UNIVAC Series 90 , talimatlar, yani, uygulama adresleri başlamalıdır 16 bitlik bir sınır olması gerekir hatta bayt. Bir şartname hariç garip bir adres sonuçlarına dallara girişimleri. Veriler, ancak, talimat bağlı olarak daha uzun bellekte herhangi bir adrese veri alınabilir ve bir bayt olabilir veya.

CPU'lar genellikle tam genişlikte verilere erişmek veri yolu her zaman. Bayt ele almak, bunlar daha sonra maske ve bireysel byte ele vardiya, kendi veri otobüsün tam genişlikte belleğe erişim. Çoğu yazılım, özellikle için gerekli bir özelliktir olarak Sistemleri, bu verimsiz bir algoritma tahammül dize işleme. Bayt farklı olarak, daha büyük birimler hizalanmış iki adresleri yayılabilir ve bir veri nakil birimi üzerinde getirme daha böylece daha fazla gerektirir. Bu CPU'lar bunu desteklemek için mümkündür, ancak bu işlevsellik nadiren doğrudan gereklidir makine kodu böylece işlemci tasarımcıları normalde uygulamadan kaçınmak ve bunun yerine unaligned bellek erişimi için veri yolu hataları sorunu, seviyeye.

Çağrı hataları

FreeBSD , Linux ve Solaris sanal bellek sayfalarını edilemez zaman bir otobüs hatası sinyali verebilir disk belleği kayboldu çünkü (örneğin bir erişen, örneğin bellek eşlemeli dosya veya yürütme ikili görüntü program çalışırken kesildi) ya çünkü adil oluşturulan bellek eşlemeli dosya disk dolu olduğundan fiziksel, tahsis edilemez.

Sigara Mevcut bölümü (86)

Açık x86 olarak bilinen eski bir bellek yönetim mekanizması var segmentasyon . Uygulama yükler segmenti (POSIX uyumlu işletim sistemleri altında sadece bir ile yapılabilir olmayan mevcut segmentin seçici ile kayıt varsa montaj dili ), özel durum oluşturulur. Bazı işletim sistemleri takas için değil, Linux altında bu SIGBUS oluşturduğu kullandı.

Örnek

Bu yazılı unaligned bellek erişimi örneği olduğu C programlama dili ile AT & T montaj sözdizimi .

#include <stdlib.h>

int main(int argc, char **argv) 
{
    int *iptr;
    char *cptr;
    
#if defined(__GNUC__)
# if defined(__i386__)
    /* Enable Alignment Checking on x86 */
    __asm__("pushf\norl $0x40000,(%esp)\npopf");
# elif defined(__x86_64__) 
     /* Enable Alignment Checking on x86_64 */
    __asm__("pushf\norl $0x40000,(%rsp)\npopf");
# endif
#endif

    /* malloc() always provides aligned memory */
    cptr = malloc(sizeof(int) + 1);
    
    /* Increment the pointer by one, making it misaligned */
    iptr = (int *) ++cptr;

    /* Dereference it as an int pointer, causing an unaligned access */
    *iptr = 42;

    /*
       Following accesses will also result in sigbus error.
       short *sptr;
       int    i;

       sptr = (short *)&i;
       // For all odd value increments, it will result in sigbus.
       sptr = (short *)(((char *)sptr) + 1);
       *sptr = 100;
    
    */

    return 0;
}

Derleme ve örneğe çalışan POSIX üzerinde uyumlu işletim sistemi x86 hatası gösterir:

$ gcc -ansi sigbus.c -o sigbus
$ ./sigbus 
Bus error
$ gdb ./sigbus
(gdb) r
Program received signal SIGBUS, Bus error.
0x080483ba in main ()
(gdb) x/i $pc
0x80483ba <main+54>:    mov    DWORD PTR [eax],0x2a
(gdb) p/x $eax
$1 = 0x804a009
(gdb) p/t $eax & (sizeof(int) - 1)
$2 = 1

GDB ayıklayıcı göstermektedir hemen değer 0x2a depolanan yerde muhafaza edilecekse EAX kayıt kullanarak, X86 Assembly dilini . Bu bir örnektir dolaylı kayıt adresleme.

Yazdırma düşük değerli bitlerini adresi değil göstermektedir kelime sınırından hizalanmış ( "dword" x86 terminolojiyi kullanarak).

Referanslar