# X86

### от Уикипедия, свободната енциклопедия

  Заглавието, дадено на тази статия, е изписано неточно поради технически ограничения. Вярното заглавие е: x86.

x86 е общото наименование на микропроцесорна архитектура, първоначално разработена и произвеждана от Intel. Тази архитектура в момента доминира пазара за настолни и преносими компютри, както и за малки и средни сървъри.

Архитектурата е наречена x86, защото първите процесори от тази фамилия са обозначавани с номера, завършващи на 86: 8086, 80186, 80286, 80386 (впоследствие i386) и 486 (i486). Водена от маркетингови съображения и ограничена от невъзможността да защити търговска марка върху число, Intel решава да именува следващите процесори от тази фамилия с имена вместо с числови обозначения (Pentium, Core). В крайна сметка обаче, името x86 остана като име на цялата фамилия.

Архитектурата на два пъти е била разширявана към по-голям размер на машинната дума. Първите процесори от тази фамилия са 16-битови. През 1985 г. Intel пуска 32-битовия процесор 386. Обикновенно обозначението x86 се използва за 32-битовата архитектура, като освен него се използва и IA-32 (Intel Architecture 32-bit). През 2003 г. AMD пусна на пазара процесора Athlon 64, който разшири архитектурата до 64 бита. 64-битовата x86 архитектура се обозначава с x86-64, като освен него се използват и други обозначения: AMD64 (от AMD), EM64T или IA-32e (от Intel) и x64 (от Microsoft).

Една от основните черти на x86 архитектурата е пълната софтуерна обратна съвместимост. Това означава, че всеки нов член на фамилията може да изпълнява програмите, които са били създадени за неговите предшественици. Тази съвместимост е една от предпоставките за огромния успех на x86 архитектурата.

## [редактиране] История

### [редактиране] Предистория

x86 архитектурата започва своето съществуване с разработката на процесора 8086 от Intel през 1978 г. 8086 е развитие на техния по-раннен успешен 8-битов процесор 8080. Широкото разпространение на архитектурата започва през 1981, когато IBM избира Intel 8088 (процесор, който е идентичен като програмен модел с 8086) за "сърцето" на своя персонален компютър IBM PC.

И други компании започват да произвеждат процесори, които са съвместими с 8086/8088. Повечето от тези компании рано или късно се оттеглат от тази област поради огромната конкуренция от страна на Intel, като в момента единствените останали производители са Intel, AMD и VIA (VIA е собственик на бившите IDT и Cyrix).

### [редактиране] Реален режим (real mode)

Основна статия: Real mode

Първите процесори от семейството x86 (8086, 8088 и 80186) са 16-битови и имат един и същ програмен модел, който се поддържа от всички следващи поколения x86 процесори. След появата на защитения режим (protected mode), този режим започва да носи наименованието реален режим (real mode).

Въпреки ограниченията на реалният режим, в момента на появата си това е била една от най-сложните и универсални процесорни архитектури.

В наши дни реалният режим се използва само при стартирането на операционната система, тъй като всеки x86 процесор веднага след включване на захранването автоматично влиза в реален режим. Това налага първите етапи от зареждането на операционната система да стават в този режим. Популарната в миналото операционна система DOS на Microsoft работи почти изцяло в реален режим.

### [редактиране] Инструкции за числа с плаваща запетая (x87 инструкции)

Основна статия: x87

Първоначално (до появата на 486), x86 архитектурата не разполага с инструкции за обработка на числа с плаваща запетая. Още от самото начало Intel предлага математическия копроцесор 8087, който работи съвместно с 8086/8088 и ускорява изчисленията с плаваща запетая.

Повечето производители на компилатори създават емулиращи програмни библиотеки, които позволяват на програмиста да използва един и същ програмен интерфейс независимо дали компютъра, на който се изпълняват програмите има математически копроцесор или няма такъв. С течение на времето се появяват копроцесорите 80187, 80287, 80387 и 80487. С въвеждането на процесора 486, математическия копроцесор става част от процесорното ядро, а инструкциите за обработка на числа с плаваща запетая (наричани още x87 инструкции) стават неразделна част от x86 архитектурата.

### [редактиране] Защитен режим (protected mode)

Основна статия: Protected mode

Защитеният режим се характеризира с апаратно предотвратяване на достъпа на дадена програма извън границите на заделената и памет. Първата версия на защитения режим се появи в 16-битовия процесор 80286. Въпреки, че някои от тогавашните операционни системи (най-вече OS/2 и Windows 3.0) включваха поддръжка за 16-битовият защитен режим, той не получи широко разпространение заради появата на по-универсания 32-битов защитен режим с пускането на процесора 80386. От този момент под защитен режим ще се подразбира 32-битовия защитен режим на 80386 и следващите x86 процесори.

В съвременните операционни системи се използва защитения режим на работа. Освен това сегментирането се използва много ограничено, като защитата и управлението на паметта стават основно с помоща на механизма на страницирането. Именно поради тази причина, в 64-битовото разширение на x86 архитектурата AMD64, сегментирането е "орязано" до минимум.

### [редактиране] MMX

Основна статия: MMX

През 1996 г. Intel въведе ново разширение на x86 архитектурата с пускането на процесора Pentium MMX. MMX означава Matrix Math Extensions (разширения за математически матрици), но по-късно съкращението започна да се дешифрира като Multi-Media Extensions (мултимедийни разширения).

MMX разширенията които позволяват да се изпълни една и съща математическа операция (например събиране, изваждане и т.н.) едновременно върху няколко цели числа, пакетирани в някои от MMX регистрите.

Въпреки широката рекламна кампания от страна на Intel, MMX инструкциите дълго време не бяха използвани в приложните програми, а когато такава поддръжка все пак се появи, резултатите не бяха особенно впечатляващи. Някои от причините за този скромен успех са:

- За да не се налагат промени в операционните система, MMX регистрите всъщност са преименуваните x87 регистри за работа с числа с плаваща запетая. Това не позволява да се използват едновременно MMX и x87 инструкции, а бавното превключване между двата режима допълнително влошава нещата.

- MMX инструкциите дълго време можеха да бъдат използвани само на асемблер. Поддръжката в програмните езици от високо ниво бе ограничена.

- MMX инструкциите оперират само върху цели числа. Повечето съвременни мултимедийни приложения изискват работа с числа с плаваща запетая.

Все пак, MMX инструкциите станаха част от x86 архитектурата и се поддържат от всички съвременни реализации на тази архитектура.

### [редактиране] 3DNow!

Основна статия: 3DNow!

През 1998 г. с пускането на пазара на процесора K6-2, AMD въведе нов набор от инструкции, наречен 3DNow!. 3DNow! инструкциите са SIMD инструкции, подобни на MMX, но боравещи и с числа с плаваща запетая. Малко по-късно Intel въведе подобен (но по-разширен и несъвместим с 3DNow!) набор от SIMD инструкции, наречени SSE.

В процесорите K6-2+, K6-III и първите Athlon, AMD добави още 19 инструкции за предварително зареждане на данни и др. подобни. Разширеният по този начин набор от инструкции получи името Enhanced 3DNow! (наричани още Extended 3DNow! и 3DNow+). С процесора Athlon XP, AMD въведе третото поколение SIMD инструкции, наречени 3DNow! Professional, като единствената съществена разлика бе поддръжката на SSE инструкциите на Intel.

Въпреки че 3DNow! инструкциите се появиха почти година преди SSE инструкциите на Intel, те не получиха широка подкрепа от разработчиците на софтуер, най-вече поради ниския пазарен дял на AMD. Въпреки че отстраняват най-големия недостатък на MMX (невъзможността за работа с числа с плаваща запетая), 3DNow! инструкциите отстъпват по възможности на SSE инструкциите, които използват нови 128-битови регистри и могат да оперират едновременно върху четири 32-битови или две 64-битови числа с плаваща запетая.

В крайна сметка 3DNow! инструкциите загубиха битката с SSE и в момента се поддръжат само от процесорите на AMD и VIA и от години не са били добавяни нови инструкции към тях. Като се добави факта, че AMD процесорите вече поддръжат и SSE, бъдещето на 3DNow! изглежда мрачно.

### [редактиране] SSE, SSE2, SSE3

През 1999 г. Intel пусна процесора Pentium III, поддържащ нови SIMD инструкции, наречени SSE (Streaming SIMD Extensions). Също като 3DNow! инструкциите, SSE позволяват паралелната обработка на повече от едно число с плаваща запетая. С въвеждането на SSE, Intel успя да отстрани най-големите слабости на MMX и последвалите ги 3DNow! инструкции.

SSE инструкциите получиха широко разпространение (във всеки случай много по-широко от MMX и 3DNow!) и в крайна сметка AMD добавиха поддръжка за SSE инструкциите в техния процесор Athlon XP и следващите го процесори.

С въвеждането на процесора Pentium 4, Intel добави множество нови инструкции към SSE, създавайки SSE2. SSE2 инструкциите се поддържат от процесорите Athlon 64 на AMD.

С появата на последната ревизия на Pentium 4, Intel въведоха нови допълнения към SSE, наречени SSE3. SSE3 инструкциите се поддръжат от последните ревизии Athlon 64 на AMD.

С течение на времето, SSE, SSE2 и SSE3 инструкциите се наложиха като дефакто стандартни SIMD инструкции във x86 архитектурата, за разлика от 3DNow! инструкциите, които се поддържат само от процесорите на AMD.

### [редактиране] x86-64

В продължение на почти 20 години (от пускането на пазара на процесора Intel 386 до 2003 г.) наборът от инструкции на x86-съвместимите процесори бе 32-битов. С течение на времето това започна да се превръща в тясно място, защото 32-битовия процесор не може да адресира повече от 4 GB (232 байта) памет, което се оказва недостатъчно за някои приложения. Intel временно облекчи проблема с модификации в начина на адресиране, но те не са нито елегантни, нито особено ефективни.

Гледната точка на Intel по това време беше, че x86 архитектурата вече е изживяла времето си и трябва да бъде замена с перспективната VLIW архитектура IA-64, разработвана от години съвместно с компанията HP. Въпреки теоретичните предимства на тази архитектура, нейната производителност при работа със съществуващите 32-битови приложения е разочароваща, а цената - главозамайваща.

В този момент AMD реши да разработи 64-битови разширения за x86 архитектурата, които бяха кръстени AMD64. Естествено, повечето компании не пожелаха да използват наименованието AMD64 от страх да не предизвикат Intel и в крайна сметка възприеха по-неутралните обозначения x86-64 и x64.

Въпреки коментарите на Intel (както се оказа в последствие - до голяма степен оправдани), че 64-битовите разширения не са необходими на болшинството от потребителите и няма да бъдат необходими поне още 4-5 години, големите компании Microsoft, Sun Microsystems и дори свободната операционна система Linux подкрепиха новата архитектура. Изправени пред тези факти, Intel бяха принудени да приемат като стандарт 64-битовите разширения на AMD, но, разбира се, не под името AMD64, а под името EM64T.

В наши дни поддръжката за x86-64 се превърна в стандарт за процесорите на AMD и Intel, но броят на приложните програми, които реално използват 64-битов код все още е много малък.

## [редактиране] Програмен модел

### [редактиране] Real mode

Основна статия: Real mode

В реален режим всеки x86 процесор има достъп до 14 16-битови регистъра. Осем от тях (AX, BX, CX, DX, SP, BP, SI и DI) са регистри с общо предназначение. Въпреки това, всеки от тях си има свои специфични функции (например достъпа до AX става най-бързо и с най-къса машинна инструкция, а CX се използва за брояч при цикли). Всеки от регистрите AX, BX, CX и DX може да бъде разглеждан и като 2 8-битови регистъра до които има независим достъп (напр. горните 8 бита на DX са 8-битов регистър с името DH, а долните 8-бита - 8-битов регистър с името DL).

Регистрите SP и BP се използват при работата със стека, като първия е указателят на стека, а втория обикновенно се използва от езиците на високо ниво за формирането на така наречения стек фрейм (stack frame) на процедурите. Регистрите SI и DI се използват при формирането на адреса при някои инструкции (най-вече при операции със стрингове).

Други 4 16-битови регистъра са сегментните регистри CS, DS, ES и SS, които се използват при формирането на адресите. Тъй като със 16-бита могат да се адресират само 64 KB (216 байта), физическият адрес се формира от 2 компонента - 16-битов адрес от регистър или от самата инструкция, който се събира с умноженото по 16 (т.е. изместено с 4 бита наляво) съдържание на някои от сегментните регистри. По този начин получения физически адрес е 20-битов, което означава, че максималният обем памет, който може да бъде адресиран в реален режим е 1 MB (220 байта). Кой точно сегментен регистър се използва при изчисляването на адреса зависи от вида на зарежданите данни: CS се използва за инструкциите, DS - за данните, SS - за стека, а ES - при някои инструкции за работа със стрингове. В повечето случаи е възможно подразбиращия се сегментен регистър да бъде променен с префикс на машинната инструкция.

Регистърът FLAGS съдържа еднобитови флагове, които отразяват текущото състояне на процесора и събития като препълване, пренос към по-старши разред, нулев резултат и т.н. Последният регистър е програмният брояч IP, който съдържа адреса на следващата инструкция, която трябва да бъде изпълнена от процесора.

Въпреки че в реалния режим има зачатъчна сегментация на адресното пространство, тя не разполага с никаква апаратна защита. Сегментите винаги са дълги по 64 KB и нищо не може да попречи да бъдат прехвърлени техните граници.

### [редактиране] Protected mode

Основна статия: Protected mode

32-битовият защитен режим дава достъп до същите регистри като реалния режим, но сега всички те за 32-битови вместо 16 битови (с изключение на видимата част на сегментните режистри). Долните 16 бита от всеки регистър са достъпни като 16-битови регистри под същите имена като в реален режим. Целите 32-бита на регистрите са достъпни под имена, които започват с E. 32-битовите регистри с общо предназначение са EAX, EBX, ECX, EDX, ESP, ЕBP, EDI и ESI, флаговия регистър е EFLAGS, а програмия брояч - EIP. Сегментните регистри си остават 16-битови (но адреса се формира по друг начин, който е обяснен по-долу), като към вече съществуващите CS, DS, SS и ES се прибавят два нови сегментни регистъра, наречени FS и GS.

При защитения режим, процесора се намира в едно от четирите нива на привилегированост, като ниво 0 е с най-високи привилегии, а ниво 3 - с най-ниски. Кода, който работи в дадено ниво, може да прави достъп до данни, които са разположени в същото или ниво с по-ниски привилегии, както и да вика подпрограми, разположени в същото или ниво с по-високи привилегии. Определени системни инструкции могат да се изпълняват само при ниво на привилегированост 0 (т.е. нивото с най-високи привилегии). Въпреки наличието на 4 нива, повечето съвременни операционни системи използват само 2 от нивата - ядрото на операционната система работи на ниво 0, а потребителските програми - на ниво 3.

При разработката на 80386, Intel решават да включат апаратна поддръжка за двете най-разпространени схеми за управление на паметта - сегментиране и странициране. Формираният от дадена инструкция 32-битов ефективен адрес представлява отместване в даден сегмент (област от паметта с начало и размери, които се определят от някой от сегментните регистри). Когато към ефективния адрес се добави началния адрес на сегмента, се получава 32-битов линеен адрес. Ако странициращия механизъм не е активиран, линейния адрес всъщност е и физическия адрес. Ако е активиран странициращия механизъм, линейния адрес се преобразува във физическки адрес по начин, който е описан по-долу.

Началният адрес, размера и някои други свойства на сегмента се определят от запис (наричан дескриптор на сегмента) в специална таблица в паметта. Може да има множество такива таблици, като във всеки един момент трябва да има поне 2 дефинирани таблици - глобалната дескрипторна таблица (GDT), която е една и съща за всички процеси; и локалната дескрипторна таблица (LDT), която може да е различна за всеки процес. Адресите на GDT и LDT се зареждат в специални 32-битови регистри. Сегментните регистри съдържат индекс на някои от дескрипторите в GDT или LDT. Чрез този индекс процесора зарежда цялата необходима информация за сегмента от съответната таблица.

Механизма за странициране на паметта е опционален (може да се изключва). Размера на страниците е фиксиран и може да е или 4 KB или 4 MB. Началните адреси и състоянието на страниците се записват в йерархична организация от таблици (каталози) на две нива, всяка от които съдържа информация за 1024 страници от паметта.

### [редактиране] x87 инструкции

Основна статия: x87

x87 инструкциите наброяват около 60 инструкции, всички започващи с буквата F, за да се различават от стандартните x86 инструкции. Например целочислената инструкция за събиране е ADD, а тази за числа с плаваща запетая - FADD. x87 инструкциите са съвместими със стандарта за изчисления с числа с плаваща запетая IEEE 754 (на практика този стандарт е създаден основно на базата на архитектурата на копроцесора Intel 8087). Обработваните числа включват 32-битови, 64-битови и 80-битови числа с плаваща запетая; 16-битови, 32-битови и 64-битови цели числа и пакетирани BCD (binary coded decimal - отстарял формат при който във всеки байт се комбинират 2 десетични цифри) числа.

x87 инструкциите оперират върху собствен набор от регистри (8 регистъра с имена от ST0 до ST7), които са организирани в стек. Има специални инструкции за прехвърляне на данни от регистрите с общо предназначение към регистровия стек на x87 инструкциите и обратно. Повечето x87 инстрикции не могат да оперират върху произволен x87 регистър, а само върху върха на регистровия стек. Тази организация не е толкова ограничаваща колкото изглежда на пръв поглед, тъй като повечето математически изчисления се изпълняват най-естествено с рекурсивен алгоритъм, работещ върху стек от данни.

### [редактиране] Мултимедийни и векторни инструкции

#### [редактиране] MMX

Основна статия: MMX

MMX разширенията представляват SIMD инструкции, които използват 8 целочислени 64-битови регистъра с имена MM0 до MM7. Всеки от тези регистри може да съдържа едно от следните неща:

- 1 64-битово цяло число
- 2 32-битови цели числа
- 4 16-битови цели числа
- 8 8-битови цели числа

MMX инструкциите позволяват да се изпълни една и съща математическа операция (например събиране, изваждане и т.н.) едновременно върху всички числа, пакетирани в някои от MMX регистрите.

#### [редактиране] 3DNow!

Основна статия: 3DNow!

3DNow! инструкциите работят върху същите регистри като MMX инструкциите. Във всеки от 64-битовите MMX регистри може да се разположат две 32-битови числа с плаваща запетая, което се обработват едновревенно от 3DNow! инструкциите. Първоначалният набор, въведен с процесорите K6-2, включва 21 инструкции за работа с числа с плаваща запетая и с цели числа, както и по-бързо превключване между MMX/3DNow! и x87 режимите на работа.

#### [редактиране] SSE, SSE2, SSE3

SSE съдържа 70 нови инструкции и 8 нови 128-битови регистъра с имена от XMM0 до XMM7. Всеки от тези регистри съдържа четири 32-битови числа с плаваща запетая, които се обработват едновременно от SSE инструкциите.

Основната промяна в SSE2 е възможността да се обработват 64-битови числа с плаваща запетая, както и 8/16/32-битови цели числа.

В SSE3 са добавени предимно специализирани DSP инструкции.

### [редактиране] x86-64

## [редактиране] Производители

Взето от „http://bg.wikipedia.org../../../x/8/6/X86.html“.

Категории: Компютърен хардуер | Процесорна архитектура x86

##### Views

- Статия
- Беседа
- Текуща версия

##### Търсене

##### На други езици

- Català
- Česky
- Dansk
- Deutsch
- English
- Español
- Suomi
- Français
- עברית
- Magyar
- Bahasa Indonesia
- Italiano
- 日本語
- 한국어
- Lietuvių
- Nederlands
- Norsk (bokmål)
- Polski
- Português
- Русский
- Slovenčina
- Svenska
- ไทย
- Українська
- 中文