Предмет вивчення інформатики. Логічна структура пам'яті. Кожен осередок пам'яті має свій унікальний, т

вхідні, вихідні проміжні дані оброблювані процесором.

Структура оперативної пам'яті

Оперативна пам'ять складається з осередків, у кожному з яких може бути одиниця інформації – машинне слово. Кожна комірка має дві характеристики: адресу та вміст. Через регістр адреси мікропроцесора можна звернутися до будь-якого осередку пам'яті.

Сегментна модель пам'яті

Колись давно, на зорі народження комп'ютерної техніки, Оперативна пам'ять була дуже маленькою і для її адресації використовувалися 2 байти (так зване «слово»). Такий підхід дозволяв адресувати 64 Кб пам'яті, і адресація була лінійною - для вказівки адреси використовувалося одне-єдине число. Згодом, з удосконаленням техніки, виробники зрозуміли, що є можливість підтримувати великі обсяги пам'яті, але для цього потрібно зробити розмір адреси більшим. Для сумісності із вже написаним програмним забезпеченням було вирішено зробити так: адресація тепер двокомпонентна (сегмент та зміщення), кожна з яких 16-бітна, а старі програми як використовували одну 16-бітну компоненту і нічого не знають про сегменти, так і продовжують працювати


Змін.
Аркуш
№ докум.
Підпис
Дата
Аркуш
ППП ПІ 23.00.00 ТО
Логічне будоваоперативної пам'яті

Адресний простір – це набір адрес, які можуть формувати процесор. Навіщо? Гарне питання. Справа в тому, що кожен осередок пам'яті має адресу. І щоб вважати (або записати) інформацію, що зберігається в ній, потрібно до неї звернеться на її адресу. Адреси поділяються на віртуальні (логічні) та фізичні. Фізичні адреси – це реальні адреси реальних осередків пам'яті. Програмам глибоко паралельно до таких адрес, оскільки вони оперують символьними іменами, які потім транслятором перетворюються на віртуальні адреси. Потім віртуальні адреси перетворюються на фізичні.



Логічні адреси подаються у шістнадцятковій формі та складаються з двох частин. Логічно оперативна пам'ять поділена на сегменти. Так ось перша частина логічної адреси – початок сегмента, а друга – зміщення від цього початку (сегмент, усунення)

Логічне будова поділяється на 5 зон:

1. Conventional memory – основна пам'ять;

Починається з адреси 00000 (0000:0000) та до 90000 (9000:0000). Це займає 640 Кбайт. У цю область завантажується в першу чергу таблиця векторів переривань, починаючи з 00000 і займає 1 Кбайт, далі йдуть дані з BIOS (лічильник таймера, буфер клавіатури і т. д.), а потім вже 16 розрядні програми DOS (для них 640 Кбайт – бар'єр, за який можуть вискочити лише 32 розрядні програми). На дані BIOS'а відводиться 768 байт.
2. UMA (Upper Memory Area) – верхня пам'ять;

Починається з адреси А0000 до FFFFF. Займає вона 384 Кбайт. Сюди вантажиться інформація, пов'язана з апаратною частиною комп'ютера. UMA можна поділити на 3 частини по 128 Кбайт. Перша частина (від А0000 до BFFFF) призначена для відеопам'яті. У наступну частину (від C0000 до DFFFF) завантажуються програми BIOSадаптерів. Остання частина (від E0000 до FFFFF) зарезервована для системний BIOS. Справа в тому, що останні 128 Кбайт не повністю використовуються. Найчастіше під BIOS задіяні лише останні 64 Кбайт. Вільна частина UMB керується драйвером EMM386.EXE і використовується для потреб операційної системи.
3. HMA (High Memory Area) – область верхньої пам'яті;

Змін.
Аркуш
№ докум.
Підпис
Дата
Аркуш
ППП ПІ 23.00.00 ТО
Історія появи області HMA тягнеться аж до 80286 процесора, а точніше до помилки у його схемі. Я вже казав, що процесори 8086 і 8087 мали 20-розрядну адресну шину, працювали в реальному режиміі могли максимально звернутися за адресою FFFFF (FFFF: 000F). А ось 80286 процесор мав уже 24-розрядну шину адреси, працював у реальному та захищеному режимах і міг адресувати до 16 Мбайт пам'яті.
4. XMS (eXtended Memory Specification) – додаткова пам'ять;

Щоб працювати в XMS використовуючи DOS, для процесорів було розроблено ще один режим – віртуальний. DOS не може переплюнути бар'єр 640 Кбайт, віртуальний режимдозволяє розбити додаткову пам'ятьна частини по

1 Мбайт. У кожну частину вантажиться по програмі DOSі там вони варяться в реальному режимі, але вже не заважаючи один одному виконаються одночасно. 32 розрядним додаткам на бар'єр 640 Кбайт все одно. XMS відповідає за переклад режимів процесора драйвер EMM386.EXE, а організацію самої області – HIMEM.SYS. Подивитися, що відбувається у Вас у XMS можна за допомогою SysInfo з набору Norton Utilities.
5. EMS (Expanded Memory Specification) – розширена пам'ять;

Знаходиться ця область у верхній пам'яті і займає близько 64 Кбайт. Використовувалася вона лише в старих комп'ютерах з оперативною пам'яттю до

1 Мбайт. З огляду на свою специфікацію це досить повільна область. Справа в тому, що розширена пам'ять – це один із багатьох комутованих сегментів. Після того, як сегмент заповниться, відбувається зміна використаного сегмента новим. Але працювати можна тільки з одним сегментом, а це, Ви самі повинні розуміти, не зовсім добре, зручно та швидко. Як правило, перший сегмент EMS знаходиться за адресою D000.

Логічне будова оперативної пам'яті у графічному вигляді.

Змін.
Аркуш
№ докум.
Підпис
Дата
Аркуш
ППП ПІ 23.00.00 ТО

4. DRAM – Dynamic Random Access Memory

DRAM- це дуже старий тип мікросхем оперативної пам'яті, який зараз давно не застосовується. По іншому DRAM– це динамічна пам'ятьз довільним порядком вибірки. Мінімальною одиницеюінформації при зберіганні або передачі даних на комп'ютері є біт. Кожен біт може бути у двох станах: увімкнений (так, 1) або вимкнений (ні, 0). Будь-який обсяг інформації зрештою складається з включених і вимкнених бітів. Таким чином, щоб зберегти або передати якийсь обсяг даних, необхідно зберегти або передати кожен біт, незалежно від його стану, цих даних.


Для зберігання бітів інформації в оперативній пам'яті є осередки. Осередки складаються з конденсаторів і транзисторів. Ось зразкова і спрощена схема осередку DRAM:

Кожна комірка здатна зберігати лише один біт. Якщо конденсатор осередку заряджений, це означає, що біт включений, якщо розряджений – вимкнений. Якщо потрібно запам'ятати один байт даних, то знадобиться 8 осередків (1 байт = 8 біт). Осередки розташовані в матрицях і кожна з них має свою адресу, що складається з номера рядка та номера стовпця.

Змін.
Аркуш
№ докум.
Підпис
Дата
Аркуш
ППП ПІ 23.00.00 ТО

Тепер розглянемо як відбувається читання. Спочатку всі входи подається сигнал RAS (Row Address Strobe) – це адресу рядка. Після цього всі дані з цього рядка записуються в буфер. Потім на регістр подається сигнал CAS (Column Address Strobe) - це сигнал шпальти і відбувається вибір біта з відповідною адресою. Цей біт і подається на вихід. Але під час зчитування дані в осередках ліченого рядка руйнуються і їх необхідно перезаписати взявши з буфера.

Тепер запис. Подається сигнал WR (Write) та інформація надходить на шину стовпця не з регістру, а з інформаційного входупам'яті через комутатор, визначений адресоюстовпця. Таким чином, проходження даних при записі визначається комбінацією сигналів адреси стовпця та рядка та дозволу запису даних на згадку. При записі дані з регістру рядка на вихід не надходять.

Слід врахувати те, що матриці з осередками розташовані таким чином:

Змін.
Аркуш
№ докум.
Підпис
Дата
Аркуш
ППП ПІ 23.00.00 ТО

Це означає, що за один раз буде раховано не один біт, а кілька. Якщо паралельно розташовано 8 матриць, то відразу рахується один байт. Це називається розрядністю. Кількість ліній, якими будуть передаватися дані від (чи) паралельних матриць, визначається розрядністю шини вводу/вывода мікросхеми.
Говорячи про роботу DRAM, необхідно враховувати один момент. Все полягає в тому, що конденсатори не можуть довго зберігати заряд і він врешті-решт «стікає», Тому конденсатори необхідно перезаряджати. Операція перезаряджання називається Refresh або регенерацією. Відбувається ця операція приблизно кожні 2 мс і часом займає до 10% (а то й більше) робочого часу процесора.

Найважливішою характеристикою DRAM є швидкодія, а простіше говорячи тривалість циклу + час затримки + час доступу, де тривалість циклу - час, витрачений на передачу даних, час затримки - початкова установкаадреси рядка та стовпця, а час доступу – час пошуку самої комірки. Вимірюється ця фігня в наносекундах (одна мільярдна частка секунди). Сучасні мікросхеми пам'яті мають швидкодію нижче 10 мс.

Оперативною пам'яттю керує контролер, який знаходиться у чіпсеті материнської плати, А точніше в тій його частині, яка називається North Bridge.


Змін.
Аркуш
№ докум.
Підпис
Дата
Аркуш
ППП ПІ 23.00.00 ТО

А тепер зрозумівши, як працює оперативна пам'ять, розберемося, навіщо ж вона взагалі потрібна. Після процесора, оперативну пам'ять можна вважати швидкодіючим пристроєм. Тому основний обмін даними відбувається між цими двома девайсами. Вся інформація у персональному комп'ютерізберігається на твердому диску. При включенні комп'ютера в ОЗУ (оперативне запам'ятовуючий пристрій) з гвинта записуються драйвера, спеціальні програмита елементи операційної системи. Потім туди будуть записані програми – програми, які Ви запускатимете. При закритті цих програм вони будуть стерті із ОЗУ. Дані, записані в оперативній пам'яті, передаються CPU (Central Processing Unit), там обробляються і записуються назад. І так постійно: дали команду процесору взяти біти за такими адресами, як їх там обробити і повернути на місце або записати на нове - він так і зробив.

Все це добре, допоки осередків ОЗУ вистачає. А якщо немає? Тоді в роботу входить файл підкачування. Цей файл розташований на жорсткому диску і записується туди все, що не влазить в осередки оперативної пам'яті. Оскільки швидкодія гвинта значно нижча за ОЗУ, то робота файлу підкачки сильно уповільнює роботу системи. Крім цього, це знижує довговічність самого жорсткого диска.

Збільшення обсягу пам'яті не призводить до збільшення її швидкодії. Зміна об'єму пам'яті не вплине на її роботу. А от якщо розглядати роботу системи, то справа інша. У тому випадку, якщо Вам вистачає обсяг оперативної пам'яті, то збільшення обсягу не призведе до збільшення швидкості роботи системи. Якщо ж осередків ОЗУ не вистачає, то збільшення їх кількості (простіше кажучи, додавання нової або заміні старої на нову з великим обсягом лінійки пам'яті) призведе до прискорення роботи системи.

Змін.
Аркуш
№ докум.
Підпис
Дата
Аркуш
ППП ПІ 23.00.00 ТО

Змін.
Аркуш
№ докум.
Підпис
Дата
Аркуш
ППП ПІ 23.00.00 ТО
Інтернет ресурси

http://nikesina.ucoz.ru/

http://www.whatis.ru/

http://wiki.mvtom.ru/

http://www.teryra.com/

http://smartronix.ru/

http://allrefs.net/

http://sonikelf.ru/

http://beginpc.ru/

Список літератури

Практичний посібник системного адміністратора. (2012)

Ендрю Таненбаум, Тодд Остін - Архітектура комп'ютера (2013)

Осередок пам'яті Пам'ять комп'ютера складається з окремих «часток» бітів, об'єднаних у групи (регістри) по 8 біт (байт). 1 байт - елементарна одиниця пам'яті. Кожен байт має свою помер (адресу), і вміст двійковий код. Коли процесор обробляє інформацію, він знаходить за адресою пам'яті потрібний осередокчитає з вмісту, виконує необхідні діїі записує результат в іншу комірку пам'яті. Осередок пам'яті група послідовних байтів внутрішньої пам'яті. Машинне слово вміст комірки пам'яті Розрядність комірки пам'яті та розмір машинного словау бітах рівні розрядності процесора






Швидкодіюче ЗУ, реалізоване у вигляді електронної схеми. ОЗУ доступне для читання та для запису інформації. Саме в ОЗУ зберігається виконувана в поточний моментпрограма та необхідні для неї дані, в ОЗУ дані можна редагувати, видаляти, додавати. Це пам'ять тимчасового зберігання. ОЗУ зберігає інформацію лише протягом сеансу роботи з ЕОМ – після виключення ЕОМ з мережі, дані, що зберігаються у ОЗУ, втрачаються безповоротно. ОЗП енергозалежний пристрій. Місткість сучасних моделейколивається від 512 до 1024 Мбайт. ОЗУ – оперативне ЗУ (RAM – random access memory – пам'ять із довільним доступом).


ПЗП - постійне ЗП (ROM - read only memory - пам'ять тільки для читання). У багатьох ЕОМ ПЗУ реалізується окремою мікросхемою, в якій при виготовленні поміщаються основні команди, що здійснюють початкову взаємодію апаратного та програмного забезпечення. Цей вид пам'яті доступний лише читання. Після вимкнення ЕОМ інформація зберігається. ПЗП – енергонезалежний пристрій. У ПЗУ знаходиться частина операційної системи BIOS(Basic Input-Output System).


КЕШ-пам'ять – проміжна пам'ять між ОЗП та ПЗУ «Сache» - схованка, склад (англ. слово). Використовується для збільшення швидкодії комп'ютера. "Секретність" КЕШу полягає в тому, що він невидимий для користувача і дані, що зберігаються там, недоступні для прикладного програмного забезпечення. Використання цього виду внутрішньої пам'яті скорочує кількість звернень до жорсткому диску. Відсутність кеш-пам'яті може суттєво (20-30%) знизити загальну продуктивністькомп'ютера.


Енергонезалежна пам'ять (CMOS-пам'ять, Complementary Metal-Oxid-Semicondactor) Різні параметриконфігурації комп'ютера, наприклад кількість та тип дискових накопичувачів, тип відеоадаптера, наявність співпроцесора та деякі інші дані, зберігаються в так званій CMOS-пам'яті. Мікросхема CMOS-пам'яті також містить прості електронний годинник. Завдяки ним у будь-який момент можна дізнатися поточну датута час. Щоб при відключенні живлення комп'ютера вміст CMOS-пам'яті не прався, і годинник продовжував відраховувати час, мікросхема CMOS-пам'яті живиться від спеціальної маленької батареї або акумулятора, які також знаходяться на системній платі



Адресація операндів у командах програми може бути:

l безпосередньої;

l непрямої;

l асоціативної;

l неявною.

Безпосередня адресація полягає у вказівці в команді самого значення операнда, а чи не його адреси.

Пряма адресація полягає у вказівці в команді безпосередньо абсолютної або виконавчої адреси операнда. Пряма адресація регістру полягає у вказівці його імені.

Непряма адресація має на увазі вказівку в команді регістра або адреси осередку пам'яті, в яких знаходяться абсолютна, виконавча адреса операнда або їх складові.

Асоціативна адресація - вказівка ​​в команді не адреси, а ідентифікує змістовної ознаки операнда, що підлягає вибірці (застосовується в асоціативних пристроях, що запам'ятовують).

Неявна адресація - адреси операнда в команді не вказано, але мається на увазі код операції.

Адресація осередків основної пам'яті ПК має два важливі різновиди: відносну та стекову.

Відносна адресація

Абсолютна (A інд) адреса формується як сума адрес виконавчої (Aісп) та сегментної (A сегм):

A абс = A сегм + A вик.

A сегм - 20-бітова початкова адреса сегмента , який є збільшеним у 16 ​​разів (зрушеним на 4 біти вліво) 16-бітовою адресою сегмента A" сегм, що зберігається в одному з 16-бітових сегментних регістрів. Початкова адреса сегмента в такому варіанті завжди кратний 16 байтам, і він може бути повністю ідентифікований значенням A" сегм (сегмент завжди складається з цілого числа параграфів, а параграф дорівнює 16, тобто:

A сегм = 16 · A "сегм = A" сегм 0000.

16-бітова виконавча адреса може в ПК являти собою суму 3-х адрес:

A ісп = A зміщ [+A баз ][+A інд ]

l A зміщ - 16-бітова адреса зміщення щодо початку сегмента (або щодо бази, якщо є A баз);



l A баз - 16-бітова адреса зміщення бази адреси операнда щодо початку сегмента;

l A інд - адреса індексу (або просто індекс) - додаткова складова адреси операнда, що часто використовується при програмуванні циклічних процесівз масивами та таблицями. Індекс має бути безпосередньо заданий у відповідному регістрі МПП.

При адресації даних можуть використовуватися всі складові адреси:

A абс даних = A сегм + A вик = A сегм + A зміщ [+A баз ][+A інд ]

A сегм = 16 A" сегм, A" сегм береться з регістру DS за замовчуванням або з регістру ES, якщо це зазначено у програмі. A баз та A інд беруться, відповідно, з регістрів BX та індексних (SI або DI), а A зміщ у явному чи неявному вигляді вказуються у програмі.

При адресації команд програми можуть використовуватись лише дві складові адреси:

A абс команд = A сегм + A ісп = A сегм + A зміщ

A" сегм береться з регістру CS, а A зміщ - з регістра IP.

Стекова адресація

У стекової пам'яті(Стек) доступ до осередків пам'яті не довільний, а за принципом «останній записаний операнд першим зчитується» (FILO).

A абс стека = A сегм + + A зміщ

16-бітова адреса сегмента A" сегм береться з регістру SS, зміщення щодо початку сегмента стека автоматично зчитуються з регістрів BP (зсув бази стека - A баз) і SP (зміщення активного осередкустека, в яку записується або з якої зчитується інформація, - "вершини стеку" щодо бази - A зміщ).

У захищеному (багатопрограмному) режимі роботи мікропроцесора початкові адреси сегментів зберігаються в таблицях дескрипторів і мають довжину 24 або 32 біти (залежно від типу МП) У сегментних регістрах у цьому режимі зберігаються селектори, що містять адресні посилання на відповідні таблиці дескрипторів.

Запитання для самоперевірки

1. Сформулюйте основні властивості алгоритму.

2. Розгляньте способи запису алгоритму.

3. Наведіть та поясніть типовий склад машинних команд.

4. Розгляньте можливі структури машинних команд.

5. Поясніть призначення системного та прикладного програмного забезпечення.

6. Назвіть основні режими роботи комп'ютерів та дайте їм коротку характеристику.

7. Що таке переривання роботи програми та яке їх призначення?

8. Назвіть та поясніть типи переривань.

9. Розгляньте послідовність дій машини під час переривання.

10. Назвіть види та особливості адресації осередків пам'яті на ПК.

11. Напишіть формулу для розрахунку абсолютної адреси даних.

12. Які регістри мікропроцесорної пам'яті застосовуються для адресації даних?

13. Напишіть формулу для розрахунку абсолютної адреси команди програми.

14. Які регістри мікропроцесорної пам'яті застосовуються для адресації команд програми?

15. Напишіть формулу розрахунку адреси стека.

16. Які регістри мікропроцесорної пам'яті застосовуються для адресації осередків стекової пам'яті?


Глава 19. Елементи програмування мовою Асемблер

Після вивчення глави студент повинен знати:

· -Призначення та галузі використання мови Асемблера;

· -Основні компоненти мови;

· -Основні команди, директиви, модифікатори;

· -Адресацію регістрів МПП та осередків пам'яті в асемблері;

· -Програмування процедур виведення інформації на дисплей та введення інформації з клавіатури;

· -структуру асемблерної програми;

· -Процедури формування програми формату EXE;

· -Призначення, команди та варіанти використання відладчика програм Debug.

Користувач комп'ютера, як і прикладний програміст, програми складає, як правило, на машинно-незалежному алгоритмічній мові високого рівня(Basic, Pascal, FORTRAN, C, PROLOG та ін.), однак мати уявлення про основи програмування та на машинно-орієнтованих мовах грамотному користувачеві дуже корисно для:

l кращого розуміння архітектури ПК та більш грамотного використання комп'ютерів; для розробки більш раціональних структур алгоритмів та програм вирішення прикладних завдань;

l можливості перегляду та коригування виконуваних програмз розширеннями EXEі COM, компільованих з будь-яких мов високого рівня, у разі втрати вихідних програм(викликавши зазначені програмиу відладчик програм DEBUGі деасембліровавши їх, можна отримати їх відображення мовою Асемблера);

l складання програм вирішення найбільш відповідальних завдань ( машинна програма, підготовлена ​​машинно-орієнтованою мовою, зазвичай ефективніше (коротше і швидше на 30–60%) програм, отриманих в результаті трансляції з мов високого рівня) та для реалізації процедур, що включаються до основної програми у вигляді окремих фрагментів у тому випадку, якщо вони не можуть бути реалізовані ні використовуваною мовою високого рівня.

Основні компоненти мови асемблер

Алфавіт мови

Алфавіт мови складають символи ASCII:

l літери від А до Z (або від а до z, малі та прописні літерив асемблері не різняться);

l цифри від 0 до 9;

l спеціальні символи: @, $, ?, ., _,–, +, *, ", ", ; ,: та ін.

З букв, цифр та символів: @, $, ?, .,_ формуються:

l прості повідомлення: імена (ідентифікатори) процедур (підпрограм), змінних, директив, команд (мітки), значення констант та змінних;

l складові повідомлення: команди (оператори);

l директиви (псевдооператори);

l модифікатори (операції).

Імена міток, змінних, ідентифікаторів можуть бути довжиною до 31 символу і починатися повинні не з цифри.

Константи (числа та рядки)

Тільки цілі числа

Розрізняють:

l двійкові числа; закінчуються літерою;

l десяткові числа; без спеціального закінчення чи закінчуються літерою D;

l шістнадцяткові числа; закінчуються літерою М.

Для позначення цифр 10, 11, 12, 13, 14, 15 шістнадцятковій системічислення використовуються відповідно літери A, B, C, D, E, F; але починатися шістнадцяткові числа повинні обов'язково з цифри, наприклад: вираз F19Н - не число, а ідентифікатор, правильно число треба записати так: 0F19Н.

Запис від'ємних чисел:

l десяткові числа записуються звичайним чином, просто зі знаком: -32, -32D;

l двійкові числа записуються лише у додатковому модифікованому коді: –32D ® 11.100000B, –19D ® 11.01101B;

l шістнадцяткові числа записуються тільки в додатковому коді:

l –32D виглядає як 1.E0H, –119D – як 1.89H.

Рядки (літерали)

Рядки символів: включають будь-які літери, цифри і символи, але полягають у лапки: "ПК IBM PC з мікропроцесором Pentium D".

Команди (оператори)

Формат команди:

[Мітка [:]] КОП [Операнд] [,Операнд] [;Коментар].

Між елементами команди вставлені прогалини. Тут і далі елементи, укладені квадратні дужки, необов'язкові.

КОП (Код Оператора) - мнемокод команди (складається з 2-6 літер). Можливо до 256 різних кодів (в асемблері IBM PC їх кількість змінюється залежно від типу МП).

Операнд – явно задану адресу(прямий чи непрямий); ім'я мітки, змінної; саме значення змінної; асоціативна ознака. Кількість необхідних у команді операндів асемблер дізнається за КОП. У більшості двоадресних команд є операнди приймача (dst - destination) і джерела (src - source); джерело не змінює свого змісту, у приймачі 1-е число, що у операції, замінюється результатом.

Пояснимо різницю між осередками пам'яті, портами та регістрами.
Осередки пам'яті служать лише зберігання інформації – спочатку її записують у комірку, та був можуть прочитати, і навіть записати іншу інформацію.
Порти введення-виводу , як правило, служать для перетворення двійкової інформаціїв будь-які фізичні сигналиі назад. Наприклад, порт даних паралельного інтерфейсуформує електричні сигналина розніманні, до якого зазвичай підключають принтер. Порт стану того ж інтерфейсу електричні сигнали, що надходять від принтера, відображає у вигляді набору біт, який можна вважати процесором.
Реєстр -досить широке поняття, яке найчастіше використовується як синонім порту.
Кожен байт (осередок пам'яті, порт) має власний унікальний фізична адреса . Ця адреса встановлюється на системній шині процесором, коли він ініціює звернення до цієї комірки або порту. У сімействі х86 та PC-сумісні комп'ютерипростори адреси осередків пам'яті та портів вводу-виводу розділені. Це передбачено з обох боків: процесори дозволяють, а комп'ютери використовують цей поділ. Нинішні процесори мають розрядність фізичної адреси пам'яті 32 і навіть 36 біт, що дозволяє адресувати до 4 і 64 Гбайт відповідно. Простір введення-виводу використовує лише молодші 16 біт адреси, що дозволяє адресувати до 65384 однобайтних регістрів. Адреси «історичних» системних пристроїв PC не змінилися від народження – це данина сумісності, яка без поділу просторів навряд чи проіснувала стільки років. Простори пам'яті і портів вводу-виводу нерівнозначні як за обсягом, а й у способах обращения. Способів адресації до осередку пам'яті в х86 безліч, у той час як для адресації введення-виведення їх існує лише два. До пам'яті можлива (і широко використовується) віртуальна адресація, коли для програміста, програми і навіть користувача створюється ілюзія гігантського розміру оперативної пам'яті. До портів введення-виводу звертаються лише за реальними адресами, щоправда, і тут можлива віртуалізація, але вже чисто програмними засобамиопераційна система. І, нарешті, найважливіша відмінність просторів пам'яті і портів вводу-виводу: процесор може зчитувати інструкції до виконання лише з простору пам'яті. Звичайно, через порт введення можна вважати фрагмент програмного коду(що і відбувається, наприклад, при зчитуванні даних з диска), але для того, щоб цей код виконати, його необхідно записати в пам'ять.
Реєстри різних пристроївможуть бути приписані як простору портів вводу-виводу, так і простору пам'яті. Під портом пристрою, як правило, мають на увазі регістр, пов'язаний з цим пристроєм і приписаний до простору портів вводу-виводу. Точність наведеної вище термінології, звичайно ж, відносна. Так, наприклад, осередки відеопам'яті (теж пам'ять!) служать в основному задля зберігання інформації, а керування світінням елементів екрана.

За останній тижденьдвічі пояснював людям як організована робота з пам'яттю в х86, щоб не пояснювати втретє написав цю статтю.

І так, щоб зрозуміти організацію пам'яті від вас знадобиться деяких базових понять, таких як регістри, стек тощо. Я спробую пояснити і це на пальцях, але дуже коротко тому що це не тема для цієї статті. Тож почнемо.

Як відомо програміст, коли пише програми працює не з фізичною адресою, а лише з логічним. І то якщо він програмує на асемблері. У тому ж Сі комірки пам'яті від програміста вже приховані покажчиками, для його ж зручності, але якщо грубо говорити покажчик це інше уявлення логічної адреси пам'яті, а в Java і покажчиків немає, зовсім погана мова. Однак грамотному програмісту не завадять знання про те, як організована пам'ять хоча б на загальному рівні. Мене взагалі дуже засмучують програмісти, які не знають, як працює машина, зазвичай це програмісти Javaта інші php-хлопці, з кваліфікацією нижче за плінтус.

Так добре, вистачить про сумне, переходимо до справи.
Розглянемо адресний простір програмного режиму 32 бітного процесора(для 64 біт все за аналогією)
Адресний простір цього режиму складатиметься з 2^32 осередків пам'яті пронумерованих від 0 до 2^32-1.
Програміст працює з цією пам'яттю, якщо йому потрібно визначити змінну, він просто каже осередок пам'яті з адресою таким буде містити такий тип даних, при цьому сам програміст може і не знати який номер у цього осередку він просто напише щось на зразок :
int data = 10;
комп'ютер зрозуміє це так: потрібно взяти якусь комірку з номером стопіцот і помістити в неї ціле число 10. При тому про адресу комірки 18894 ви і не дізнаєтесь, він від вас буде прихований.

Все б добре, але виникає питання, а як комп'ютер шукає цей осередок пам'яті, адже пам'ять у нас може бути різна:
3 рівень кешу
2 рівень кешу
1 рівень кешу
основна пам'ять
жорсткий диск

Це все різні пам'яті, але комп'ютер легко знаходить у якій лежить наша змінна int data.
Це питання вирішується операційною системоюразом із процесором.
Вся подальша стаття буде присвячена розбору цього методу.

Архітектура х86 підтримує стек.

Стек це безперервна область оперативної пам'яті організована за принципом стопки тарілок, ви не можете брати тарілки із середини стопки, можете тільки брати верхню та класти тарілку ви також можете тільки на верх стопки.
У процесорі для роботи зі стеком організовані спеціальні машинні коди, асемблерні мнемоніки яких виглядають так:

Push operand
поміщає операнд у стек

Pop operand
вилучає з вершини стека значення і поміщає його у свій операнд

Стек у пам'яті росте зверху вниз, це означає, що при додаванні значення до нього адреса вершини стека зменшується, а коли ви витягуєте з нього, то адреса вершини стека збільшується.

Тепер коротко розглянемо що таке регістри.
Це осередки пам'яті у самому процесорі. Це найшвидший і найдорожчий тип пам'яті, коли процесор здійснює якісь операції зі значенням чи пам'яттю, він бере ці значення безпосередньо з регістрів.
У процесорі є кілька наборів логік, кожна з яких має свої машинні коди та свої набори регістрів.
Basic program registers (Основні програмні регістри) Ці регістри використовуються всіма програмами з їх допомогою виконується обробка цілих даних.
Floating Point Unit registers (FPU) Ці регістри працюють з даними представленими у форматі з плаваючою точкою.
Ще є MMX та XMM registers ці регістри використовуються тоді, коли вам треба виконати одну інструкцію над великою кількістюоперандів.

Розглянемо докладніше основні програмні регістри. До них відносяться вісім 32 бітних регістрів. загального призначення: EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESP
Для того щоб помістити в регістр дані, або для вилучення з регістру в комірку пам'яті дані використовується команда mov:

Mov eax, 10
завантажує число 10 в регістр eax.

Mov data, ebx
копіює число, що міститься в регістрі ebx в клітинку пам'яті data.

Регістр ESP містить адресу вершини стека.
Крім регістрів загального призначення, до основних програмних регістрів відносять шість 16бітних сегментних регістрів: CS, DS, SS, ES, FS, GS, EFLAGS, EIP
EFLAGS показує біти, звані прапори, які відбивають стан процесора чи характеризують хід виконання попередніх команд.
Регістр EIP містить адресу наступної команди, яка буде виконуватися процесором.
Я не розписуватиму регістри FPU, оскільки вони нам не знадобляться. Отже, наш невеликий відступ про регістри і стек закінчився переходимо назад до організації пам'яті.

Як ви пам'ятаєте метою статті є розповідь про перетворення логічної пам'яті на фізичну, насправді є ще проміжний етап і повний ланцюжок виглядає так:

Логічна адреса --> Лінійна (віртуальна)--> Фізична
Весь лінійний адресний простір розбитий на сегменти. Адресний простір кожного процесу має по Крайній мірітри сегменти:
Сегмент коду.(містить команди з нашої програми, які виконаються.)
Сегмент даних.(Містить дані, тобто змінні)
Сегмент стеку,про який я писав вище.


Лінійна адреса обчислюється за такою формулою:
лінійна адреса = Базова адреса сегмента (на малюнку це початок сегмента) + усунення
Сегмент коду
Базова адреса сегмента коду береться з регістру CS. Значення зсуву для сегмента коду береться з регістру EIP, в якому зберігається адреса інструкції, після виконання якої значення EIP збільшується на розмір цієї команди. Якщо команда займає 4 байти, то значення EIP збільшується на 4 байти і вказуватиме вже на наступну інструкцію. Все це робиться автоматично, без участі програміста.
Сегментів коду може бути дещо в нашій пам'яті. У нашому випадку він один.
Сегмент даних
Дані завантажуються в регістри DS, ES, FS, GS
Це означає, що сегментів даних може бути до 4х. На нашому малюнку він один.
Усунення всередині сегмента даних задається як операнд команди. По дефолту використовується сегмент який вказує регістр DS. Для того, щоб увійти в інший сегмент, треба це безпосередньо вказати в команді префікса заміни сегмента.
Сегмент стеку
Використовуваний сегмент стека визначається значенням регістра SS.
Зміщення всередині цього сегмента представлене регістром ESP, який вказує на вершину стека, як ви пам'ятаєте.
Сегменти в пам'яті можуть один одного перекривати, мало того базова адресавсіх сегментів може збігатися, наприклад, у нулі. Такий вироджений випадок називається лінійним уявленням пам'яті. У сучасних системах, пам'ять зазвичай так організована.

Тепер розглянемо визначення базових адрес сегмента, я писав, що вони містяться в регістрах SS, DS, CS, але це не зовсім так, в них міститься якийсь 16 бітний селектор, який вказує на якийсь дескриптор сегментів, в якому вже зберігається необхідна адреса.


Так виглядає селектор, у тринадцяти його бітах міститься індекс дескриптора у таблиці дескрипторів. Не хитро буде вважати що 2^13 = 8192 це максимальна кількістьдескрипторів у таблиці.
Взагалі дескрипторних таблиць буває два види GDT і LDT. Перша називається глобальна таблиця дескрипторів, вона в системі завжди тільки одна, її початкова адреса, точніше адреса її нульового дескриптора зберігається в 48 бітному системному регістрі GDTR. І з моменту старту системи не змінюється та у свопі не бере участі.
А ось значення дескрипторів можуть змінюватися. Якщо у селекторі біт TI дорівнює нулютоді процесор просто йде в GDT шукає по індексу потрібний дескриптор за допомогою якого здійснює доступ до цього сегменту.
Поки все просто було, але якщо TI дорівнює 1, тоді це означає, що використовуватиметься LDT. Таблиць цих багато, але використовуватись у Наразібуде та селектор якої завантажений у системний регістр LDTR, який, на відміну від GDTR, може змінюватися.
Індекс селектора вказує на дескриптор, який вказує не на базову адресу сегмента, але в пам'ять у якому зберігається локальна таблиця дескрипторів, точніше її нульовий елемент. Ну а далі так само як і з GDT. Таким чином, під час роботи локальні таблиці можуть створюватися і знищуватися при необхідності. LDT не можуть містити дескриптори інших LDT.
Отже ми знаємо як процесор добирається до дескриптора, а що міститься в цьому дескрипторі подивимося на картинці:

Дескриптори складається із 8 байт.
Біти з 15-39 і 56-63 містять лінійну базову адресу описуваним даним дескриптором сегмента. Нагадаю нашу формулу для знаходження лінійної адреси:

лінійна адреса = базова адреса + усунення
За допомогою такої нехитрої операції процесор може звертатися за потрібною адресоюлінійної пам'яті.
Розглянемо інші біти дескриптора, дуже важливим є Segment Limit або межа, він має 20бітне значення від 0-15 та 48-51 біт. Межа задає розмір сегмента. Для сегментів даних та коду доступними є всі адреси, які розташовані в інтервалі:
[база; база+межа)
Залежно від 55 G-біту (грануляріті), межа може вимірюватися в байтах при нульовому значенні біта і тоді максимальна межа складе 1 мб, або в значенні 1, межа вимірюється сторінками, кожна з яких дорівнює 4кб. і максимальний розміртакого сегмента буде 4Гб.
Для сегмента стека межа буде в інтервалі:
(база + межа; вершина]
До речі, цікаво чому база і межа так рвано розташовуються в дескрипторі. Справа в тому, що процесори х86 розвивалися еволюційно і в часи 286х дескриптори були по 8 біт всього, при цьому старші 2 байти були зарезервовані, ну а в наступних моделях процесорів зі збільшенням розрядності дескриптори теж зросли, але для збереження зворотної сумісностідовелося залишити структуру як є.
Значення адреси «вершина» залежить від 54-го D біта, якщо він дорівнює 0, тоді вершина дорівнює 0xFFF(64кб-1), якщо D біт дорівнює 1, тоді вершина дорівнює 0xFFFFFFFF (4Гб-1)
З 41-43 біт кодується тип сегмента.
000 - сегмент даних, тільки зчитування
001 - сегмент даних, зчитування та запис
010 - сегмент стеку, тільки зчитування
011 - сегмент стеку, зчитування та запис
100 - сегмент коду, лише виконання
101-сегмент коду, зчитування та виконання
110 - підлеглий сегмент коду, лише виконання
111 - підлеглий сегмент коду, тільки виконання та зчитування

44 S біт якщо дорівнює 1, тоді дескриптор описує реальний сегмент оперативної пам'яті, інакше значення S біта дорівнює 0.

Найважливішим бітом є 47-й P-біт присутності. Якщо біт дорівнює 1 означає, що сегмент або локальна таблиця дескрипторів завантажена в оперативку, якщо цей біт дорівнює 0, тоді це означає, що даного сегмента в оперативній пам'яті немає, він знаходиться на жорсткому диску, трапляється переривання, особливий випадок роботи процесора запускається обробник особливого випадку, Який завантажує потрібний сегмент з жорсткого диска на згадку, якщо P біт дорівнює 0, тоді всі поля дескриптора втрачають сенс, і стають вільними для збереження в них службової інформації. Після завершення роботи оброблювача, P біт встановлюється значення 1, і проводиться повторне звернення до дескриптора, сегмент якого вже в пам'яті.

На цьому закінчується перетворення логічної адреси на лінійну, і я думаю на цьому варто перерватися. Наступного разу я розповім другу частину перетворення з лінійного на фізичний.
А так само думаю варто трохи поговорити про передачу аргументів функції, і про розміщення змінних у пам'яті, щоб був якийсь зв'язок із реальністю, тому розміщення змінних у пам'яті це вже безпосередньо, то з чим вам доводиться стикатися у роботі, а не просто якісь теоретичні вигадки для системного програміста. Але без розуміння, як влаштована пам'ять неможливо зрозуміти як ці самі змінні зберігаються у пам'яті.
Загалом сподіваюсь було цікаво і до нових зустрічей.