Бұс қатесі: Памятьке қол жеткізу қатесінің түсіндірмесі
Bus error
Бұс қатесі – процессордың жадқа қателікті қол жеткізуінен туындайтын аппараттық қате. SIGBUS сигналымен хабарланады, көбінесе бағдарламалық қателерден болады.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Компьютерлік есептеулерде, шина қатесі – аппараттық құралдың тудырған қатесі, операциялық жүйеге (ОЖ) процестің процессор физикалық түрде адрестемейтін жадқа қол жеткізуге тырысатынын хабарлайды: адрестік шина үшін жарамсыз мекенжай, осыдан аталған. Қазіргі заманғы архитектураларда, олар сегментациялық қателерге қарағанда сирек кездеседі, олар негізінен жадқа қол жеткізудің бұзылуынан туындайды: логикалық мекенжай немесе рұқсаттардағы мәселелер. POSIX стандартымен үйлесімді платформаларда, шина қатесі көбінесе қатеге себеп болған процеске SIGBUS сигналының жіберілуіне әкеледі. SIGBUS компьютер анықтаған кез келген жалпы құрылғы ақаулығынан да туындауы мүмкін, бірақ шина қатесі компьютерлік жабдықтың физикалық бұзылуын сирек білдіреді – көбінесе бұл бағдарламалық құралдағы қатеден туындайды. Шина қатесі кейбір басқа беттік қателер үшін де туындауы мүмкін; төменде қараңыз.
In computing, a bus error is a fault raised by hardware, notifying an operating system (OS) that a process is trying to access memory that the CPU cannot physically address: an invalid address for the address bus, hence the name. In modern use on most architectures these are much rarer than segmentation faults, which occur primarily due to memory access violations: problems in the logical address or permissions. On POSIX compliant platforms, bus errors usually result in the SIGBUS signal being sent to the process that caused the error. SIGBUS can also be caused by any general device fault that the computer detects, though a bus error rarely means that the computer hardware is physically broken—it is normally caused by a bug in software. Bus errors may also be raised for certain other paging errors; see below.
Адресі жоқ
Бағдарламалық қамтамасыз ету процессорға белгілі бір физикалық жад адресін оқуға немесе жазуға нұсқайды. Осыған сәйкес, процессор осы физикалық адресті өзінің адрес шинасына қойып, процессорға қосылған барлық басқа аппараттық құрылmalарға, егер олар осы нақты адресқа жауап берсе, нәтижелермен жауап беруді сұрайды. Егер ешбір аппараттық құрылма жауап бермесе, процессор қателік тудырып, сұралған физикалық адрес компьютерлік жүйеде танылмайтынын көрсетеді. Бұл тек физикалық жад адрестерін қамтиды екенін ескеріңіз. Белгісіз виртуалды жад адресіне қол жеткізуге тырысу, көбінесе шина қатесі емес, сегментациялық қате болып саналады, бірақ егер жад басқару блогы (MMU) жеке болса, процессор аражігін ажырата алмайды.
Software instructs the CPU to read or write a specific physical memory address. Accordingly, the CPU sets this physical address on its address bus and requests all other hardware connected to the CPU to respond with the results, if they answer for this specific address. If no other hardware responds, the CPU raises an exception, stating that the requested physical address is unrecognized by the whole computer system. Note that this only covers physical memory addresses. Trying to access an undefined virtual memory address is generally considered to be a segmentation fault rather than a bus error, though if the MMU is separate, the processor cannot tell the difference.
Қатарсыз қол жеткізу
Көптеген CPU-лар байттық адрестеуді қолданады, онда әрбір бірегей жад адресі 8 биттік байтты көрсетеді. Көптеген CPU-лар әр жад адресінен жеке байттарға қол жеткізе алады, бірақ олар әдетте үлкен блоктарға (16 бит, 32 бит, 64 бит және т.б.) осы блоктар белгілі бір шекараға «тураланбағанда» (x86 платформасы ерекше жағдай) қол жеткізе алмайды. Мысалы, егер көп байттық кіру 16 биттік туралануды талап етсе, 0, 2, 4, 6 және т.б. адрестер (байттармен көрсетілген) тураланған және осылайша қолжетімді деп есептеледі, ал 1, 3, 5 және т.б. адрестер тураланбаған деп есептеледі. Сол сияқты, егер көп байттық кіру 32 биттік туралануды талап етсе, 0, 4, 8, 12 және т.б. адрестер тураланған және осылайша қолжетімді деп саналады, ал олардың арасындағы барлық адрестер тураланбаған деп саналады. Тураланбаған адрестен байттан үлкен блокқа қол жеткізуге тырысу автобус қатесіне әкелуі мүмкін. Кейбір жүйелер қолданылатын архитектураға байланысты осы екі нұсқаудың аралас түрлерін қолдануы мүмкін. Мысалы, IBM System/360 мейнфрейміне негізделген, соның ішінде IBM System z, Fujitsu B8000, RCA Spectra және UNIVAC Series 90 аппараттық құралдары үшін нұсқаулар 16 биттік шекарада болуы керек, яғни орындалу адрестері жұп байттан басталуы керек. Тақ адреске өтуге тырысу спецификациялық қатеге әкеледі. Дегенмен, деректерді жадтағы кез келген адрестен алуға болады, және олар нұсқауға байланысты бір байт немесе одан да ұзын болуы мүмкін. CPU әдетте деректер шинасының толық енімен деректерге қол жеткізеді. Байт адрестерін алу үшін олар деректер шинасының толық енімен жадқа кіреді, содан кейін жеке байтты адрестеу үшін масканы қолданып, ығыстырады. Жүйелер бұл тиімсіз алгоритмге төзімді, өйткені ол көптеген бағдарламалық қамтамасыздар үшін, әсіресе жолдарды өңдеу үшін маңызды мүмкіндік болып табылады. Байттардан айырмашылығы, үлкен блоктар екі тураланған адресті қамтуы мүмкін, сондықтан деректер шинасынан бірнеше рет дерек алу қажет болады. CPU мұны қолдауы мүмкін, бірақ бұл мүмкіндік машиналық код деңгейінде сирек қажет болады, сондықтан CPU жасаушылары оны іске асырудан аулақ болады және оның орнына тураланбаған жадқа қол жеткізу кезінде автобус қатесін шығарады.
Most CPUs are byte addressable, where each unique memory address refers to an 8 bit byte. Most CPUs can access individual bytes from each memory address, but they generally cannot access larger units (16 bits, 32 bits, 64 bits and so on) without these units being "aligned" to a specific boundary (the x86 platform being a notable exception). For example, if multi byte accesses must be 16 bit aligned, addresses (given in bytes) at 0, 2, 4, 6, and so on would be considered aligned and therefore accessible, while addresses 1, 3, 5, and so on would be considered unaligned. Similarly, if multi byte accesses must be 32 bit aligned, addresses 0, 4, 8, 12, and so on would be considered aligned and therefore accessible, and all addresses in between would be considered unaligned. Attempting to access a unit larger than a byte at an unaligned address can cause a bus error. Some systems may have a hybrid of these depending on the architecture being used. For example, for hardware based on the IBM System/360 mainframe, including the IBM System z, Fujitsu B8000, RCA Spectra, and UNIVAC Series 90, instructions must be on a 16 bit boundary, that is, execution addresses must start on an even byte. Attempts to branch to an odd address results in a specification exception. Data, however, may be retrieved from any address in memory, and may be one byte or longer depending on the instruction. CPUs generally access data at the full width of their data bus at all times. To address bytes, they access memory at the full width of their data bus, then mask and shift to address the individual byte. Systems tolerate this inefficient algorithm, as it is an essential feature for most software, especially string processing. Unlike bytes, larger units can span two aligned addresses and would thus require more than one fetch on the data bus. It is possible for CPUs to support this, but this functionality is rarely required directly at the machine code level, thus CPU designers normally avoid implementing it and instead issue bus errors for unaligned memory access.
Беттеу қателері
FreeBSD, Linux және Solaris виртуалды жад беттерін қосып алу мүмкін болмаған кезде, мысалы, олар жойылғандықтан (мысалы, жадқа бейнеленген файлға қол жеткізу немесе бағдарлама жұмыс істеп тұрғанда қысқартылған екілік файлды орындау), сенімді емес дереккөз: date=June 2016, немесе жаңадан құрылған жадқа бейнеленген файл физикалық жадқа бөліне алмағанда, мысалы, диск толып кеткенде, шина қатесін (bus error) хабарлай алады.
FreeBSD, Linux and Solaris can signal a bus error when virtual memory pages cannot be paged in, e. g. because it has disappeared (e. g. accessing a memory mapped file or executing a binary image which has been truncated while the program was running),Unreliable source: date=June 2016 or because a just created memory mapped file cannot be physically allocated, because the disk is full.