Покажчики та теги
Коли розроблялася структура покажчика, способами захисту були обрані усунення асемблера MI, переклад деяких команд в розряд привілейованих і видалення з покажчиків повноважень. Як говорилося в "Захист від несанкціонованого доступу". всі ці посилення рівнів захисту привносились в AS / 400 з плином часу. Але навіть такий ступінь захищеності не дає стовідсоткової впевненості в тому, що вміст покажчика не зазнає несанкціонованим змінам.
В "Об'єкти" зазначалося, що асоційоване простір. що містить покажчики, займає окремий сегмент системного об'єкта. Спочатку в System / 38 ми хотіли використовувати два сегмента: один - для даних, а другий -для покажчиків. Але такий підхід знижував продуктивність системи. При використанні об'єкта було необхідно зчитувати з диска сторінки, як сегмента даних, так і сегмента покажчиків, що підвищувало накладні витрати. Крім того, два сегмента вимагали деякого збільшення розмірів пам'яті. Єдиним плюсом асоційованого сегмента покажчиків була надія, що він може захистити покажчики від модифікації користувачами. Але виявилося, що це не так.
Скоро з'ясувалося, що ми не можемо захистити асоційований сегмент покажчиків від змін. При тій мірі захисту, яка планувалися для System / 38 (рівень 30), користувач. мав право доступу до об'єкта, міг працювати з його вмістом за допомогою асемблера MI. Приміщення покажчиків в окрему частину об'єкта не надавало додаткового захисту. Довелося шукати інше рішення.
Апаратна захист покажчиків
Ми розуміли, що необхідна деяка форма апаратного захисту пам'яті для покажчиків. Багато з великих систем того часу, такі як System / 370, використовували для захисту пам'яті спеціальні апаратні розряди, які дозволяли або забороняли користувачеві доступ до деякого блоку байтів пам'яті. Біти захисту зазвичай поміщалися в окремому апаратному масиві пам'яті, де користувач не міг до них дістатися. При кожному зверненні до пам'яті цей масив перевірявся, щоб визначити, чи має користувач право на доступ до даного блоку пам'яті. Зазвичай такий захист встановлювалася на фізичний блок пам'яті розміром в одну сторінку.
Спочатку використовувати в апаратурі System / 38 такий тип захисту пам'яті не планувалося: ніхто не думав, що він знадобиться, адже захист проектованої системи виконувалася на рівні об'єктів. Однак, коли стало зрозуміло, що якась форма апаратної захисту все ж потрібна, ми розглянули можливість захисту блоку розміром в одну сторінку. Але, по-перше, це було дорого, а, крім того, такий підхід не цілком відповідав планам розробників. В ідеалі, нам бачилася захист для кожних 16 байтів пам'яті, так як покажчик займає саме стільки. Але щоб зробити систему продуктивної, хотілося мати можливість розміщувати покажчики де завгодно, але тоді окремий апаратний масив розрядів захисту для кожних 16 байтів пам'яті ставав неприйнятний за вартістю. Нарешті, знайшлося рішення: використовувати для захисту пам'яті додаткові розряди, призначені для коду корекції помилок ECC (error correcting code).
Іноді, в пам'яті комп'ютера виникають помилки изза перепадів напруги в електромережі або з інших причин. Для захисту від помилок в більшості пам'ятей використовуються коди виявлення помилок і коди виправлення помилок. Діють вони так: до кожного слова пам'яті додаються додаткові розряди. Слово пам'яті містить стільки розрядів, скільки може бути лічено за одну операцію. При зчитуванні даних з пам'яті ці додаткові розряди перевіряються, що б визначити, чи не сталася помилка.
Найпростіша форма виявлення помилок - додавання до слова пам'яті одного розряду парності. Його значення вибирається так, щоб число розрядів 1 в слові пам'яті, включаючи розряд парності, завжди було парних. Якщо в пам'яті відбувається помилка, що викликає зміна значення будь-якого з бітів з 1 на 0 або навпаки, то вона буде виявлена, коли при наступному зчитуванні слова виявиться, що число розрядів 1 непарній. Парність дозволяє визначити одиночну помилку, але не говорить, в якому розряді вона сталася. За допомогою такого механізму, зазвичай застосовується на ПК, можна визначити непарне число помилок в слові пам'яті. Але якщо число помилок парне, він не допоможе.
Більшість комп'ютерів, що використовуються для комерційних завдань, зокрема AS / 400, як для виявлення, так і для виправлення помилок застосовують додаткові розряди кодів корекції. Ці додаткові розряди можуть визначати все одноразові і багаторазові помилки, і навіть вказати, в якому саме розряді вони відбулися. Таким чином, апаратура може виправити помилку і продовжити роботу. Величина компенсації помилок очевидно для кожного, кому доводилося бачити на екрані ПК повідомлення "memory parity error". З таким зламаним ПК нічого не можна зробити до тих пір, поки несправний модуль пам'яті не замінений. З цієї причини багато старші моделі сучасних ПК використовують пам'яті ECC.
Оригінальна апаратура System / 38 мала 32разрядное (4байтовое) слово пам'яті. ECC вимагав додаткових 7 розрядів, тобто для кожного слова пам'яті було потрібно 39 розрядів. Технологія тоді дозволяла збільшувати розмір слова тільки приростами по 8 розрядів, тобто, фактично, слово пам'яті мало розмір 40 розрядів. Для кожного 4-байтового слова пам'яті передбачався додатковий розряд, який і повинен був здійснювати функції захисту пам'яті. Ми назвали його розрядом тега.
Покажчик в оригінальній System / 38 займав чотири послідовних 4-байтових слова пам'яті, кожне зі своїм розрядом тега. Ми вирішили, що для кожного слова пам'яті цей розряд буде дорівнює 1, якщо слово містить будь-яку з чотирьох частин покажчика; і 0 - якщо не містить. Для самого покажчика потрібен тільки один розряд, так що якщо все чотири розряду в чотирьох послідовних словах пам'яті встановлені в 1, то значення логічного тега покажчика дорівнює 1. Якщо будь-який з чотирьох розрядів дорівнював 0, то і логічний тег покажчика дорівнював 0.
Подальші версії AS / 400 мають 64-розрядний (8-байтовое) слово пам'яті. Таке слово вимагає 8 розрядів ЕСС; так що з урахуванням розряду тега, слова пам'яті AS / 400 упаковані по 73 розряду. Ми як і раніше розміщуємо покажчики на 16-байтових кордонах, і у кожного покажчика є один логічний розряд тега. Якщо в AS / 400 з 64-розрядних словом, два розряду тега в двох послідовних словах, що містять покажчик, обидва рівні 1, то і логічний тег покажчика дорівнює 1. Якщо ж будь-який з розрядів дорівнює нулю, то і покажчик має логічний тег 0. щоб залишатися в рамках прийнятої термінології, ми називаємо 64-розрядне слово пам'яті подвійним словом.
Всякий раз, коли в AS / 400 відбувається запис в пам'ять, апаратура управління пам'яттю будує ЕСС і зберігає його разом зі словом пам'яті. В процесі операції запису ця апаратура також відключає розряд тега в слові пам'яті (встановлює його в 0). Так що в результаті виконання будь-якої стандартної команди записи в пам'ять, розряди тега записаних слів завжди будуть скинуті в 0.
Режим активних тегів
В "Технологія PowerPC" ми говорили про розширення архітектури PowerPC. Одне з таких розширень - режим активних тегів. Коли процесор PowerPC працює в даному режимі, доступні додаткові команди, яких немає в режимі неактивних тегів. Всього для AS / 400 було додано 25 команд, доступних тільки в режимі активних тегів. Сюди входять команди множинної завантаження і збереження четверні слів в регістрах, а також команди, зворотні ім. Є також команди десяткової арифметики, системні функції виклику / повернення і команди виділення для перевірки значень розрядів в керуючих регістрах. Шість нових команд підтримують теги.
Деякі з цих спеціальних тегів команд використовуються для установки або перевірки значень розрядів тега. Одна з них, команда "Зберегти четверное слово" ( "stq"), зберігає в пам'яті 16 байтів даних з двох 64разрядних регістрів і включає два розряду тега. Інша - "Завантажити четверное слово" ( "lq"), завантажує 16 байтів пам'яті в два 64разрядних регістра і встановлює розряд в регістрі управління в 1, якщо обидва тегів розряду в лічених словах рівні 1 (в іншому випадку цей розряд встановлюється в 0). Ще одна команда дозволяє зчитувати теги з пам'яті в спеціальний регістр процесора. Використання цієї команди буде розглянуто в наступному розділі.
Тегів команди використовуються тільки в SLIC; вони не генеруються транслятором для програм MI. Це означає, що будь-яке збереження в пам'яті, сгенерированное для програми MI, завжди використовує стандартні команди і відключає розряди тега. Коли в процесі вирішення створюється покажчик, SLIC будує його в двох 64-розрядних регістрах і використовує команду "stq" для включення тегів регістрів в пам'яті. При всякій спробі використовувати покажчик програмою MI, SLIC завантажує його вміст командою "lq" в регістри і потім перевіряє, чи встановлені розряди тега. Якщо розряди тега скинуті, значить, хтось змінив покажчик, і він тепер є невірним.
Розряди тега AS / 400 не запобігають зміни покажчиків, а лише визначають, чи проводилися ці зміни. Такий підхід відрізняється від більшості схем захисту пам'яті. Зазвичай, захист пам'яті не допускає змін, і такий захист на рівні сторінок в AS / 400 є. Однак покажчики розпізнають лише вже відбулися модифікації, що в порівнянні з попередніми версіями системи скорочує обсяг апаратури, але як і раніше забезпечує потрібний рівень захисту.
Покажчики можна підробити. Теги гарантують, що покажчик створено ОС (SLIC), і що він не змінювався чим-небудь, крім SLIC. Недобросовісний користувач, спробувавши створити, скопіювати або змінити покажчик, не зможе включити розряди тега і отримає в результаті даремні 16 байт. Саме тому AS / 400 завжди працює в режимі активних тегів, незважаючи на те, що процесори PowerPC. використовувані в ній, можуть діяти і в режимі неактивних тегів.
Покажчики та теги на диску
Розробники System / 38 зіткнулися з і іншою проблемою. Припустимо, потрібно перейменовувати сторінки з пам'яті на диск. У пам'яті є додаткові розряди для ЕСС і тегів, а на диску немає. Там використовується інша форма коду корекції помилок, звана циклічним надлишковим контролем CRC (cyclic redundancy check), яка не додає додаткових розрядів до кожного слова пам'яті. Значить, потрібен спосіб збереження розрядів тега разом з покажчиками при переміщенні сторінки, що містить покажчики, на диск. Коротше кажучи, потрібно знайти додаткове місце на диску.
Магнітний диск являє собою набір площин, що мають по дві поверхні для запису. Поверхня кожного диска розділена на концентричні кола, називані доріжками. У свою чергу, доріжки розділені на сектори, які і містять інформацію. Розмір сектора для System / 38 і AS / 400 дорівнює 520 байтам. Кожен сектор містить 8-байтовий заголовок сектора і область даних в 512 байт. Розмір сектора був обраний так, щоб 512-байтовая сторінка System / 38 вміщувалася в нього.
В System / 38 було визначено кілька спеціальних команд IMPI для роботи з тегами. Одна з таких команд- "Витягти теги" - використовувалася для збору тегів зі сторінки пам'яті. При записи сторінки на диск, теги також записувалися на диск. Інша команда IMPI - "Вставити теги" - застосовувалася для приміщення тегів назад в пам'ять після зчитування сторінки з диска.
Розробники System / 38, проявивши незвичайну кмітливість, знайшли для тегів місце всередині сторінки. Справа в тому, що деякий простір в покажчику не використовується. Якщо на сторінці є хоча б один покажчик, то є й певна незайнятого простору, в якому можна зберігати біти тега. Якщо покажчиків на сторінці немає, то все біти тега для неї рівні 0, тому і зберігати їх нема чого. Тема сектора в System / 38 містив інформацію про те, чи є на сторінці теги, і якщо є, то де саме.
До появи RISC-процесорів ми продовжували використовувати на AS / 400 і розмір сторінки, дорівнює 512 байт, і тільки що описаний метод зберігання бітів тега. Але вже кілька років нас мучило бажання збільшити розмір сторінки.
У нових моделях був збережений розмір сектора на диску в 520 байт. Четирехкілобайтовая сторінка тепер зберігається в восьми послідовних секторах. При наявності восьми 8-байтових заголовків на кожній сторінці в 4 КБ більше ніж достатньо місця для зберігання 256 тегів бітів.
Для вилучення тегів з пам'яті до архітектури процесора PowerPC був доданий спеціальний регістр тегів. Коли процесор виконує спеціальну тегів команду, "Множинна завантаження подвійних слів" ( "lmd"), в 16 регістрів може бути лічено з пам'яті до 16 подвійних слів (вісім четверні слів). При виконанні команди в регістрі тега зберігається вісім тегів регістрів четверні слів пам'яті. Зверніть увагу, що в регістрі тега зберігаються 8 логічних бітів тега, а не 16 фізичних, як в пам'яті. Згадаймо, що четверное слово це два 64-розрядних (8-байтових) слова пам'яті; отже, в четверний слові два фізичних біта тега, так що в восьми четверні словах - 16 фізичних бітів тега. За допомогою команди "lmd" біти тегів сторінки можуть бути зібрані для подальшого запису на диску разом з даними. Ця команда також доступна тільки в режимі активних тегів.