Strona korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Plików Cookies.


31.12.2020

Cykl webinarów

weinnovators.club
30.12.2020

Integracja z Teams

Veeam Backup
30.12.2020

Namierzanie zagrożeń

Flowmon Networks i Fortinet
30.12.2020

Wsparcie dla przedsiębiorstw

VMware Cloud on AWS
29.12.2020

Nowe NAS-y Thunderbolt 3

QNAP QuTS TVS-h1288X i TVS-h1688X
29.12.2020

Modele kompaktowe

VPL-PHZ60 i VPL-PHZ50
28.12.2020

Dedykowane przemysłowi

Seria TJ
28.12.2020

Nowa generacja

Router QHora-301W

Projektowanie procesorów odpornych na luki sprzętowe

Data publikacji: 26-11-2020 Autor: Marcin Bieńkowski

Jeśli chodzi o bezpieczeństwo systemów komputerowych, to rok 2018 bezsprzecznie upłynął pod znakiem luk sprzętowych w procesorach, czyli podatności Spectre i Meltdown. Od tego czasu minęły już dwa lata. Przyjrzyjmy się zatem, jaka jest obecnie sytuacja dotycząca sprzętowego bezpieczeństwa procesorów. Czy producenci układów scalonych zdołali nas zabezpieczyć przed podobnymi atakami?

 

anim przejdziemy jednak do omówienia obecnej sytuacji dotyczącej hardware’owego bezpieczeństwa procesorów, przyjrzyjmy się, jakie luki sprzętowe stały za podatnościami Meltdown i Spectre oraz co spowodowało, że mogły one się w ogóle pojawić. Objęły one bowiem procesory praktycznie wszystkich producentów, w tym Intela, częściowo AMD i licencjobiorców architektury ARM, oraz układy, które dostępne były na rynku od ponad 20 lat! Meltdown i Spectre mogły zostać ujawnione, ponieważ nowoczesne procesory przystosowane są do wykonywania szeregu operacji i instrukcji poza kolejnością. Jest to bardzo wygodna funkcja, która w znaczącym stopniu przyspiesza przetwarzanie kodu, ale w niektórych przypadkach procesor może przetwarzać złośliwy kod, który nie powinien być w ogóle wykonywany. Mówiąc w skrócie i w dużym uproszczeniu – kod taki najpierw jest wykonywany przez procesor, a dopiero później okazuje się, że operacji nie można zakończyć lub kończy się z błędem dającym dostęp do danych. Właśnie dlatego, że instrukcje są wykonywane poza kolejnością, a nie po kolei.


> ARCHITEKTURA POTOKOWA

 

Podstawowymi cechami współczesnej architektury procesorów, które umożliwiają im wykonywanie rozkazów poza kolejnością, jaka wynikałaby z liniowego kodu wykonywanego programu, są potokowość, wielopotokowość oraz ściśle z nią związana superskalarność. Jak wiadomo, każdy program komputerowy składa się z ciągu następujących po sobie instrukcji oraz zbioru danych, na których przeprowadza się szereg operacji. Wykonanie każdej, nawet najprostszej instrukcji wymaga od procesora co najmniej trzech taktów zegara – pobrania, zdekodowania i wykonania. Oznacza to, że dwie jednostki wykonawcze w każdym wykonywanym przez procesor kroku nie są w żadnym stopniu obciążone pracą. Przy dekodowaniu pracę będzie wykonywał jedynie moduł dekodujący, a moduł pobierający instrukcje oraz jednostka wykonawcza będą robiły puste przebiegi. Co więcej, dodanie do siebie dwóch liczb to już dziewięć cykli zegara, z czego aż sześć to dla poszczególnych jednostek puste, w ogóle nieobciążone pracą cykle. Najprostszą i najbardziej efektywną metodą na wyeliminowanie pustych cykli jednostek wykonawczych procesora jest wykonywanie zadań „na zakładkę”. Część jednostek wykonuje po prostu zadania należące do dalszych, a część do wcześniejszych kroków programu. Dzięki temu wszystkie jednostki mogą być obciążone pracą w każdym cyklu zegara, a taki sposób działania procesora nazywa się przetwarzaniem potokowym (ang. pipelining). Dzięki temu procesor potokowy w sprzyjających warunkach jest w stanie wykonać jedną instrukcję, np. wspomniane dodanie dwóch liczb, w jednym cyklu zegara. Przetwarzanie potokowe nie zawsze przebiega jednak tak sprawnie. Wystarczy, że część operacji zostanie wstrzymana ze względu na wykorzystywanie przez kolejne instrukcje programu tych samych rejestrów czy jednostek wykonawczych procesora, a procesor nie będzie w stanie wykonać jednej instrukcji w jednym takcie zegara. Problem ten rozwiązuje się przez wydłużenie do pewnego stopnia długości potoku wykonawczego. Na przykład w procesorach z architekturą Intel Ice Lake, w zależności od zaangażowanych w proces przetwarzania jednostek wykonawczych, jest on 14- lub 19-etapowy, a w układach AMD Ryzen 3000 (mikroarchitektura Zen 2) składa się on zawsze z 19 faz. Dzięki zwiększeniu liczby faz w potoku wykonawczym zmniejsza się ryzyko wystąpienia sytuacji, w której operacje muszą zostać wstrzymane ze względu na to, że któraś z jednostek wykonawczych będzie zajęta lub nie ma jeszcze dla niej wygenerowanych potrzebnych danych. Istotnym ograniczeniem dotyczącym zwiększania liczby faz w potoku wykonawczym
jest struktura programów zgodnych z architekturą x86. Chodzi tu przede wszystkim o rozgałęzienia programów i instrukcje warunkowe, które – w zależności od wyników działania poprzednich operacji – są wykonywane lub pomijane przez procesor podczas realizacji programu. Wykonanie instrukcji skoku lub instrukcji warunkowej sprawia, że cała następująca po niej zawartość znajdująca się w potoku wykonawczym jest już nieaktualna i trzeba opróżnić i ponownie napełnić potok rozkazami, od miejsca, do którego wykonany został skok.

 

[...]

 

Autor jest niezależnym dziennikarzem zajmującym się propagowaniem nauki i techniki.

Artykuł pochodzi z miesięcznika: IT Professional

Pełna treść artykułu jest dostępna w papierowym wydaniu pisma.

.

Transmisje online zapewnia: StreamOnline

All rights reserved © 2019 Presscom / Miesięcznik "IT Professional"