Adam Kotynia, Łukasz Kowalczyk

Podobne dokumenty
Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

ZASADY PROGRAMOWANIA KOMPUTERÓW

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Architektura komputerów

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Programowanie niskopoziomowe

Architektura komputerów. Asembler procesorów rodziny x86

Sprzęt i architektura komputerów

PROGRAMY REZYDENTNE Terminate and State Resident, TSR

Programowanie niskopoziomowe

Programowanie w języku C++

CPU. Architektura FLAGS Bit: dr Paweł Kowalczyk; DPTNS, KFCS UŁ. SI 16 bit. 16 bit. 16 bit.

DYNAMICZNE PRZYDZIELANIE PAMIECI

PROGRAMOWANIE NISKOPOZIOMOWE. Systemy liczbowe. Pamięć PN.01. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

Wskaźniki. Informatyka

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

PROGRAMOWANIE NISKOPOZIOMOWE

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Procesor Intel 8086 model programisty. Arkadiusz Chrobot

Lab 9 Podstawy Programowania

Sterowanie pracą programu

Sprzęt i architektura komputerów

J. Duntemann Zrozumieć Assembler Leo J. Scanlon Assembler 8086/8088/80286 S. Kruk Programowanie w Języku Assembler

Podstawy programowania komputerów

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

KURS C/C++ WYKŁAD 6. Wskaźniki

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

Programowanie Niskopoziomowe

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Podstawy programowania w języku C++

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

Procesor Intel 8086 model programisty. Arkadiusz Chrobot

Ćwiczenie 3. Konwersja liczb binarnych

Wykład 1: Wskaźniki i zmienne dynamiczne

INSTRUKCJE Instrukcje przeniesienia: Instrukcje konwersji: Arytmetyczne instrukcje:

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Jak Windows zarządza pamięcią?

Programowanie Niskopoziomowe

Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu.

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Podstawy programowania 2. Temat: Wprowadzenie do wskaźników. Przygotował: mgr inż. Tomasz Michno

Programowanie Niskopoziomowe

Podstawy programowania w języku C++

Metody Realizacji Języków Programowania

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

4. Procesy pojęcia podstawowe

Procesory rodziny x86. Dariusz Chaberski

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

Programowanie mikrokontrolera 8051

Programowanie Niskopoziomowe

002 Opcode Strony projektu:

STRUKTURA I ORGANIZACJA STOSU (FILO- First In Last Out) Rejestry stosu: SS i SP (Stack Segment i Stack Pointer)

Zarządzanie pamięcią

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

SYSTEMY OPERACYJNE WYKLAD 4 - zarządzanie pamięcią

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Mikroinformatyka. Wielozadaniowość

Architektura komputerów

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Stałe, tablice dynamiczne i wielowymiarowe

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

Cel wykładu. Przedstawienie działania exploitów u podstaw na przykładzie stack overflow.

organizacja procesora 8086

CODE::BLOCKS & VALGRIND OPRACOWAŁ MICHAŁ BETHKE

1.1 Definicja procesu

4. Procesy pojęcia podstawowe

Organizacja typowego mikroprocesora

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

WOJSKOWA AKADEMIA TECHNICZNA

Języki i metodyka programowania. Wskaźniki i tablice.

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Jerzy Nawrocki, Wprowadzenie do informatyki

Programowanie komputera

petla:... ; etykieta określa adres w pamięci kodu (docelowe miejsce skoku) DJNZ R7, petla

4. Procesy pojęcia podstawowe

Ćwiczenie nr 6. Programowanie mieszane

Programowanie obiektowe W3

Architektura komputerów

PROGRAMOWANIE NISKOPOZIOMOWE. Adresowanie pośrednie rejestrowe. Stos PN.04. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Architektura systemów komputerowych Laboratorium 7 Symulator SMS32 Stos, Tablice, Procedury

Wskaźniki w C. Anna Gogolińska

Architektura komputerów

Programowanie w asemblerze Środowiska 64-bitowe

Wersja dokumentacji1.01. TeleToken API

Architektura Systemów Komputerowych

Architektura komputerów. Komputer Procesor Mikroprocesor koncepcja Johna von Neumanna

Zasady programowania Dokumentacja

JAK DZIAŁAJĄ FUNKCJE PODZIAŁ PAMIĘCI

Assembler w C++ Syntaksa AT&T oraz Intela

Powyższe wyrażenie alokuje 200 lub 400 w zależności od rozmiaru int w danym systemie. Wskaźnik wskazuje na adres pierwszego bajtu pamięci.

Zuzanna Hartleb i Artur Angiel

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Transkrypt:

Adam Kotynia, Łukasz Kowalczyk

Dynamiczna alokacja pamięci Alokacja pamięci oraz dezalokacja pamięci jest to odpowiednio przydział i zwolnienie ciągłego obszaru pamięci. Po uruchomieniu, proces (program) otrzymuje od systemu operacyjnego jedną lub więcej pul dostępnej pamięci możliwej do dowolnego wykorzystania. W zależności od przyjętej konstrukcji i zastosowania obszar nazywany jest stertą lub stosem. W trakcie działania program może zażądać od systemu operacyjnego większej ilości pamięci (alokacja) lub też zwolnić niepotrzebny obszar (dezalokacja). Wewnętrznie programy samodzielnie zarządzają przydzieloną im pamięcią niskopoziomowe języki programowania dostarczają interfejs programistyczny od zarządzania stertą, który oferuje wyłącznie możliwość zarezerwowania pewnego obszaru (alokacja) i późniejszego jego zwalniania (dezalokacja). Wiele wysokopoziomowych języków programowania automatycznie przeprowadza procedurę dezalokacji bez udziału programisty.

Dla przykładu w języku C do ręcznej dynamicznej alokacji i dezalokacji pamięci służą funkcje biblioteki standardowej malloc i free. W języku C++ służą do tego specjalne słowa kluczowe (operatory) new oraz delete. Systemy operacyjne automatycznie zwalniają pamięć przydzieloną procesom, gdy te zakończą działanie bez uprzedniej dezalokacji otrzymanej pamięci. Na poziomie aplikacji pominięcie dezalokacji doprowadza do wycieku pamięci. Co w przypadku aplikacji działającej długi czas (np. serwery) jest uważane za poważny błąd jako, iż z biegiem czasu proces taki będzie potrzebował coraz więcej pamięci, co może doprowadzić nawet do jego zawieszenia, unicestwienia. Znacznego spowolnienia działania całego systemu. Alokacja nie powiedzie się, gdy nie istnieje wolny ciągły obszar pamięci o wymaganym rozmiarze.

Wykorzystanie kopca może wpływać na fragmentację pamięci. Zbyt duża ilość takich dziur powoduje marnowanie pamięci. Dlatego też współczesne systemy same śledzą takie sytuacje i odpowiednio zarządzają tymi sektorami.

Jeśli chodzi o zastosowanie dynamicznej alokacji pamięci to już w średnio zaawansowanych programach pojawia się potrzeba dynamicznego rezerwowania pamięci. Na przykład, użytkownik podaje nam rozmiar tablicy a my musimy taką tablicę utworzyć i na niej operować (nie znając wcześniej nawet maksymalnego jej rozmiaru). Rozwiązaniem takich problemów jest właśnie dynamiczna alokacja pamięci.

DOS Alokacja - AH=48h przerwania 21h BX - liczba paragrafów do zaalokowania (1 paragraf = 16 bajtów). AX - numer segmentu z zarezerwowaną dla nas pamięcią. Programy typu.com z założenia zajmują całą dostępną pamięć, więc aby coś zaalokować, należy najpierw trochę pamięci zwolnić. Zwalnianie pamięci - funkcja 49h ES - numer segmentu do zwolnienia. Jak widać, teoria nie jest skomplikowana. Przejdźmy więc może do przykładu. Zaalokowanie 160 bajtów, wyzerowanie i zwolnienie.

section.text..start: mov ah, 49h mov es, [ds:2ch] ; ES=segment naszych zmiennych środowiskowych int 21h ; zwalniamy mov ax, seg info mov ds, ax ; DS = nasz segment danych (w razie czego) mov ah, 48h ; rezerwuj pamięć mov bx, 10 ; 10 paragrafów int 21h jc problem ; CF=1 oznacza błąd (skok jeśli Carry Flag równe 1) mov es, ax ; ES = przydzielony segment mov ah, 9 mov dx, info int 21h ; wyświetl pierwszy napis mov cx, 160 ; tyle bajtów wyzerujemy xor di, di ; poczynając od adresu 0 w nowym segmencie xor al, al ; AL = 0 cld ; kierunek: do przodu rep stosb ; zerujemy obszar mov ah, 49h int 21h ; zwalniamy pamięć jc problem mov ah, 9 mov dx, info2 int 21h problem: mov ax, 4c00h int 21h koniec: section.data info db "Udana alokacja pamieci.",10,13,"$" info2 db "Udane zwolnienie pamieci.",10,13,"$" ; program typu.exe musi mieć zadeklarowany stos section stack stack resb 400h

Zwalnianie pamięci w programach typu.com polega na zmianie rozmiaru segmentu kodu. Wykonuje się to funkcją AH=4Ah przerwania 21h, w ES podając segment, którego rozmiar chcemy zmienić (nasz segment kodu - CS), a w BX - nowy rozmiar w paragrafach. Typowy kod wygląda więc tak: mov ax, cs mov es, ax ; będziemy zmieniać rozmiar segmentu kodu mov bx, koniec ; BX = rozmiar segmentu kodu shr bx, 4 ; BX /= 16 - rozmiar w paragrafach inc bx ; +1, żeby nie obciąć naszego programu mov ah, 4ah ; funkcja zmiany rozmiaru int 21h

Linux Alokacja - sys_brk (ustalającą najwyższy dostępny adres w sekcji danych). Przyjmuje ona jeden argument: EBX = 0, jeśli chcemy otrzymać aktualny najwyższy dostępny dla nas adres w sekcji danych. Tę wartość powiększymy potem o żądany rozmiar pamięci. EBX różny od 0, jeśli chcemy ustawić nowy najwyższy adres w sekcji danych. Adres musi być rozsądny co do wartości i taki, by rezerwowana pamięć nie wchodziła na biblioteki załadowane dynamicznie podczas samego uruchamiania programu. Jeśli coś się nie udało, sys_brk zwróci -1 (i ustawi odpowiednio zmienną errno) lub też zwróci ujemny kod błędu. Oczywiście, argument funkcji może być większy (alokacja) lub mniejszy (zwalnianie pamięci) od wartości zwróconej przez sys_brk przy EBX=0. Jak widać, teoria nie jest skomplikowana. Przejdźmy więc może do przykładu. Ten krótki programik ma za zadanie zaalokować 16kB pamięci (specjalnie tak dużo, żeby przekroczyć 4kB - rozmiar jednej strony pamięci - i udowodnić, że pamięć rzeczywiście została przydzielona) i wyzerować ją (normalnie zapisywanie po nieprzydzielonej pamięci skończy się zamknięciem programu przez system).

section global _start.text _start: mov eax, 45 ; sys_brk xor ebx, ebx int 80h add eax, 16384 ; tyle chcemy zarezerwować mov ebx, eax mov eax, 45 ; sys_brk int 80h cmp eax, 0 jl.problem ; (jump if less) jeśli błąd, to wychodzimy i nic się nie wyświetli.problem: section.data mov edi, eax ; EDI = najwyższy dostępny adres sub edi, 4 ; EDI wskazuje na ostatni dostępny DWORD mov ecx, 4096 ; tyle DWORDów zaalokowaliśmy xor eax, eax ; będziemy zapisywać zera std ; idziemy wspak rep stosd ; zapisujemy cały zarezerwowany obszar cld ; przywracamy flagę DF do normalnego stanu mov eax, 4 mov ebx, 1 mov ecx, info mov edx, info_dl int 80h ; wyświetlenie napisu mov eax, 1 xor ebx, ebx int 80h info db "Udana alokacja pamieci.", 10 info_dl equ $ - info

Koniec