Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Інститут комп’ютерних наук та інформаційних технологій
Кафедра автоматизованих систем управління
ОПЕРАЦІЙНІ СИСТЕМИ
ЗБІРНИК ЛАБОРАТОРНИХ РОБІТ
Львів - 2018
Лабораторна робота №1
Тема ( Загальне розуміння операційної системи.
Мета ( На прикладі роботи з OpenGL зрозуміти суть операційної системи.
ТЕОРЕТИЧНІ ПОЛОЖЕННЯ
Операційна система – це програмне забезпечення, яке встановлюється на електронне обладнання для забезпечення його функціонування. Наприклад, комп’ютер – це універсальний інструмент для обробки інформації. Тому і операційна система повинна реалізовувати універсальні функції – збереження файлів, запуск програм, розділення ресурсів комп’ютера між працюючими програмами. В ресурси, якими керує операційна система, входять: час процесора, оперативна пам’ять, дискова пам’ять, пристрої вводу даних, пристрої виводу даних. Розподіл вказаних ресурсів відбувається за допомогою системних функцій, які ви вивчали в курсі «системне програмування». Кожна програма має право взяти частинку ресурсів операційної системи (наприклад, виділити пам’ять) та використовувати їх на свій розсуд. Програму вибирає користувач в залежності від своїх потреб.
Операційна система може працювати як підсистема загальної системи. Наприклад, Windows починала свій розвиток як звичайна програма в середовищі DOS. В сучасних системах Windows можна запускати VM-Ware – віртуальну машину з будь-якою віртуальною операційною системою, в якій можна запускати цілком реальні задачі.
Сучасні смартфони також мають операційні системи, які дозволяють перетворювати їх на інші віртуальні пристрої. Ці віртуальні пристрої дозволяють: дивитись фільми по Інтернет, слухати музику, перетворювати звук на текст та навпаки, фотографувати з додаванням віртуальної реальності, знімати та розпізнавати відео, модифікувати та збагачувати звук, здійснювати відео зв’язок, визначати місцеположення, заміняти банківську картку, заміняти медичні прилади, бути проміжними серверами, заміняти дистанційний пульт, здійснювати віддалені платежі, тощо.
Прості пристрої мають спеціалізовані операційні системи. Наприклад, побутова пральна машина повинна одночасно керувати мотором, вимірювати температуру, контролювати з десяток давачів, а також тримати зв’язок з кнопками та екраном на панелі управління. Програма, яку записують в постійну пам’ять контролера такої пральної машини можна вважати спеціалізованою операційною системою реального часу.
Таким чином, можна зробити висновок, що операційна система завжди розширює можливості пристрою, на якому вона працює і завжди дає користувачу додаткові зручності в роботі.
Розглянемо універсальну підсистему трьохмірної графіки OpenGL, яка є стандартною компонентою для всіх платформ і на основі якої можна будувати віртуальні об’єкти реального світу.
Бібліотека функцій “Open Graphic Library” вперше була розроблена фірмою “Silicon Graphics” і увійшла у WINDOWS з 1990-х років. Ця бібліотека використовує прямі звернення до відео-драйверу за допомогою механізму DСI (Display Control Interface - DCIMAN32.DLL) і працює досить швидко.
Для того, щоб використовувати бібліотеку функцій OpenGL необхідно створити вікно (наприклад, за допомогою функції “CreateWindowExA”). Після цього необхідно визначити графічний контекст вікна (наприклад, за допомогою функції “GetDC”) і передати його у функцію “ChoosePixelFormat”, яка дозволяє підібрати найкращій режим відображення відео-карти (ці параметри передаються в другому параметрі цієї функції як адреса структури PIXELFORMATDESCRIPTOR). В результаті виконання цієї функції регістр EAX буде містити індекс відео режиму, який найбільше підходить користувачеві, а структура PIXELFORMATDESCRIPTOR поповниться новими даними. Отриманий індекс та нову структуру PIXELFORMATDESCRIPTOR треба передати у функцію SetPixelFormat, яка буде використовувати вказаний режим відео-карти при спілкуванні з драйвером. Після вказаних дій відео-драйвер буде коректно налаштований.
Наступним кроком буде створення структури графічного контексту OpenGL за допомогою функції wglCreateContext. Він потрібний для того, щоб відрізняти різні вікна OpenGL. Регістр EAX буде містити хендл цього контексту. Тепер треба вибрати один з графічних контекстів для роботи за допомогою функції wglMakeCurrent. Оскільки в нашій програмі лише одне вікно, то просто передаємо вміст регістру EAX в цю функцію. Після того, як ви таким чином вибрали вікно для роботи, всі команди OpenGL будуть спрямовані в нього.
Перш за все треба задати властивості 3х-вимірної сцени, яка буде відображена у вікні за допомогою функції glEnable. Параметр GL_DEPTH_TEST в цій функції визначає, що 3х-вимірні об’єкти можуть перетинатись. Якщо необхідно задати інші властивості, то потрібно знову викликати glEnable для кожної властивості. Далі іде стандартний виклик glViewport щоб встановити всю площу вікна для спостереження сцени (див. програму). Далі необхідно встановити властивості спостерігача (або проекції сцени на екран). Переключитись в режим проекції можна за допомогою виклику: “call glMatrixMode, GL_PROJECTION”. В режимі проекції можна задати параметри відображення за допомогою gluPerspective. Зауважте, що довжина кожного параметру для цієї функції – 8 байт (для зручності коментарів ці параметри записуються в стек в явному вигляді).
Стандарт OpenGL передбачає представлення всіх координат точок та кольорів в форматі дійсних чисел (real). Дійсне число можна представити довжиною в 4 байти (short real) або 8 байт (long real). Більшість функцій використовують перше представлення, але деякі – друге (наприклад, gluPerspective).
Після налагодження відображення сцени переходимо до її малювання. Переключитись в режим малювання можна за допомогою виклику glMatrixMode з параметром GL_MODELVIEW. Для зручності розгляду все малювання оформлено як окрема підпрограма. Малювання починається з очищення стану за допомогою функції glClear. Далі іде традиційне встановлення початкового стану за допомогою glLoadIdentity (див. підпрограму DrawGLScene).
Перед тим, як намалювати необхідну фігуру, необхідно відповідним чином змістити або повернути сцену. Переміщення виконується за допомогою функції glTranslatef з параметрами (X, (Y, (Z, де кожне значення означає переміщення вздовж відповідної осі. Поворот на певний кут ( здійснюється за допомогою функції glRotatef. Параметри наступні: ( ( кут повороту в градусах, X,Y,Z ( координати вектора навколо якого відбувається поворот. Наприклад: “glRotatef, r1, 0,p1,0” означає поворот навколо осі (OY) на кут r1. Всі параметри ( short real (4 байти). Нагадую, що (OX) ( іде зліва направо на екрані, (OY) ( уверх, а (OZ) ( від екрану до спостерігача.
Вказані функції діють на фігуру лише поза зоною операторних дужок {glBegin, glEnd}; glBegin означає початок малювання фігури до якої відноситься поворот або переміщення. Після закінчення малювання фігури “glEnd” можна знову виконати поворот або переміщення сцени за допомогою тих самих операторів і намалювати ще одну фігуру. Фігури можна малювати різними методами: відрізками, трикутниками, чотирикутниками або послідовностями відрізків, трикутників та чотирикутників. Відповідний режим малювання вибирається за допомогою одного з параметрів функції glBegin, які вказані у наступній таблиці.
Таблиця 9
Код
Назва параметру
Тип фігури
0
GL_POINTS
Окремі точки
1
GL_LINES
Окремі відрізки
2
GL_LINE_LOOP
Циклічно замкнені відрізки
3
GL_LINE_STRIP
Послідовність відрізків
4
GL_TRIANGLES
Окремі трикутники
5
GL_TRIANGLE_STRIP
Послідовність трикутників
6
GL_TRIANGLE_FAN
Трикутники, які мають спільну вершину
7
GL_QUADS
Окремі чотирикутники
8
GL_QUAD_STRIP
Послідовність чотирикутників
9
GL_POLYGON
Багатокутник
Кожна точка фігури має свій колір, який задається функцією “glColor3f, R,G,B” в форматі short real. Координати кожної точки в такому ж форматі задаються функцією glVertex3f, X,Y,Z. Після закінчення малювання сцени необхідно виконати glFinish і обміняти місцями відео-сторінки (за допомогою SwapBuffers), оскільки ми малювали в невидимій сторінці.
ПОРЯДОК ВИКОНАННЯ РОБОТИ
Запустити наступну програму:
.486
.model flat,STDCALL
extrn GetModuleHandleA:Proc, ExitProcess:Proc
extrn CreateWindowExA:Proc, RegisterClassA:Proc, GetDC:Proc
extrn DispatchMessageA:Proc, DefWindowProcA:Proc, LoadCursorA:Proc
extrn ChoosePixelFormat:Proc, SetPixelFormat:Proc, wglCreateContext:Proc
extrn wglMakeCurrent:Proc, glViewport:Proc, glMatrixMode:Proc
extrn glEnable:Proc, glLoadIdentity:Proc,gluPerspective:Proc,glClear:Proc
extrn SwapBuffers:PROC, PeekMessageA:PROC, glVertex3f:Proc, glColor3f:Proc
extrn glTranslatef:Proc, glRotatef:Proc, glBegin:Proc, glEnd:Proc,glFinish:Proc
WS_POPUP EQU 80000000h
WS_VISIBLE EQU 10000000h
WS_CLIPSIBLINGS EQU 04000000h
WS_CLIPCHILDREN EQU 02000000h
WM_KEYDOWN EQU 100h
PM_REMOVE EQU 1
GL_MODELVIEW EQU 1700h
GL_PROJECTION EQU 1701h
GL_DEPTH_TEST EQU 0B71h
GL_COLOR_BUFFER_BIT = 00004000h
GL_DEPTH_BUFFER_BIT = 00000100h
GL_TRIANGLE_FAN equ 00006h
;==========================================
.data
p8q dq 8.0 ; 8и-байтнi константи
p45q dq 45.0
p1q dq 1.0
p1 dd 1.0 ; 4х-байтнi константи
m1 dd -1.0
m4 dd -4.0
dt1 dd 0.09 ; крок повороту навколо OY
dt2 dd -0.07 ; крок повороту навколо OZ
r1 dd 0.0 ; кут повороту навколо OY
r2 dd 0.0 ; кут повороту навколо OZ
TEMP dq 0 ; робоча змiнна
WndClassName db 'ABBA',0;
WC dd 0023h,offset WndProc,0,0 ; структура WNDCLASS
hInstance dd 0,0
hCursor dd 0,1,0,offset WndClassName
hWnd dd 0 ; хендл вiкна
hDC dd 0 ; графiчний контекст вiкна
hRC dd 0 ; графiчний контекст OpenGL
msg dd 0
msMESSAGE dd 0
msWPARAM dd 0,0,0,0,0
width dd 500 ; розмiри вiкна
height dd 400
PIXELFORMATDESCRIPTOR:
nSize dw 28h
nVersion dw 2
dwFlags dd 25h ; прапорцi для використання OpenGL
iPixelType db 0
cColorBits db 24 ;16
cRedBits db 13 dup(0)
cDepthBits db 32 ;16
cStencilBits db 16 dup(0)
; R G B R G B R G B
COLORS dd 0.9, 0.1, 0.0, 0.2, 1.0, 0.0, 0.5, 0.1, 1.0
dd 1.0, 0.5, 0.5, 0.5, 1.0, 0.5, 0.5, 0.5, 1.0
dd 0.8, 0.5, 0.5, 1.0, 0.7, 0.2, 0.9, 0.5, 1.0
dd 0.3, 0.6, 0.7, 0.1, 0.9, 1.0, 0.7, 0.4, 0.95
ARRAY_OF_POINTS: ; координати фiгури
; X Y Z X Y Z X Y Z
dd 0.0, 0.0, 0.5, -1.0, 0.0, 0.0, -0.7,-0.7, 0.0
dd 0.0,-1.0, 0.0, 0.7,-0.7, 0.0, 0.7,-0.7, 1.5
dd 0.92,-0.38,0.5, 1.0, 0.0, 1.5, 1.0, 0.0, 0.0
dd 0.7, 0.7, 0.0, 0.0, 1.0, 0.0, -0.7, 0.7, 0.0
;================================================
.code
start: call GetModuleHandleA,0
mov hInstance,eax
call LoadCursorA,0,7f00h
mov hCursor,eax
call RegisterClassA, offset WC
call CreateWindowExA,0,eax,0,WS_CLIPSIBLINGS or WS_CLIPCHILDREN \
or WS_VISIBLE or WS_POPUP,100,100,width,height,0,0,hInstance,0
mov hWnd,eax
call GetDC, hWnd
mov hDC,eax
call ChoosePixelFormat, hDC, offset PIXELFORMATDESCRIPTOR
call SetPixelFormat, hDC,eax,offset PIXELFORMATDESCRIPTOR
call wglCreateContext, hDC ; створити графiчний контекст OpenGL
mov hRC,eax
call wglMakeCurrent, hDC,eax ; вибрати дане вiкно для роботи
;===========================================
call glEnable, GL_DEPTH_TEST ; об’єкти можуть перетинатись
call glViewport, 0,0,width,height ; встановити все вiкно для огляду
call glMatrixMode, GL_PROJECTION
call glLoadIdentity ; встановити початковий стан
fild width
fild height
fdivp
fstp TEMP ; TEMP = width / height
push qword ptr p8q ; вiдстань до кiнця сцени
push qword ptr p1q ; вiдстань до початку сцени
push qword ptr TEMP ; width/height
push qword ptr p45q ; кут огляду
call gluPerspective ; встановити параметри спостереження
call glMatrixMode, GL_MODELVIEW
;========================================
MSG_LOOP:
call DrawGLScene ; пiдпрограма користувача
call SwapBuffers,hDC ; обмiняти вiдео-сторiнки
call PeekMessageA, offset msg,0,0,0,PM_REMOVE
or eax,eax
jz MSG_LOOP
.if msMESSAGE == WM_KEYDOWN
cmp msWPARAM,1bh ; якщо код <ESC>, то STOP
jz STOP
.endif
call DispatchMessageA, offset msg
jmp MSG_LOOP
STOP: call ExitProcess,0
;========================================
DrawGLScene proc
call glClear, GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
call glLoadIdentity ; встановити початковий стан
call glTranslatef, 0,0,m4 ; змiщаємося по OZ
call glRotatef, r1,0,p1,0 ; повертаємо по OY
call glRotatef, r2,0,0,p1 ; повертаємо по OZ
call glTranslatef, m1,0,0 ; змiщаємося по OX
call glBegin, GL_TRIANGLE_FAN ; малюємо з’єднанi в одну точку трикутники
mov ecx,3*4 ; кiлькiсть точок в масивi
mov esi,offset COLORS
mov edi,offset ARRAY_OF_POINTS
L1: pushad
call glColor3f, dword ptr [esi],dword ptr [esi+4],dword ptr [esi+8]
call glVertex3f,dword ptr [edi],dword ptr [edi+4],dword ptr [edi+8]
popad
add esi,12 ; колiр кожної точки займає 12 байт
add edi,12 ; координати кожної точки займають 12 байт
loop L1
call glEnd ; закiнчили малювати трикутники
fld r1 ; змiна кута повороту по OY
fadd dt1
fstp r1
fld r2 ; змiна кута повороту по OZ
fadd dt2
fstp r2
call glFinish ; закiнчити малювати сцену
ret
DrawGLScene endp
;=================================================
WndProc proc uses ebx edi esi, hwnd : DWORD, wmsg : DWORD, wparam: DWORD, lparam:DWORD
call DefWindowProcA,hwnd,wmsg,wparam,lparam
ret
WndProc endp
end start
Поміняти з Таблиці 9 параметр функції glBegin і запустити програму з кожним з них.
Поміняти поворот таким чином, щоб фігура оберталася навколо вісі (OX), потім – (OY), потім – (OZ).
Додати в сцену ще одну таку ж саму фігуру, яка зсунута по вісі (OZ) на –0.5.
Додати в сцену ще одну таку ж саму фігуру, яка повернута навколо осі (OX) на кут 180(
Зробити так, щоб фігура, яка була додана в попередньому пункті оберталася відносно першої фігури навколо осі (OZ).
Намалювати прямокутниками перші 4 букви свого прізвища та першу букву імені. Для цього кожний прямокутник представити як відрізок на площині з доданою координатою Z. Наприклад, відрізок (0.1, 0.2), (0.3, 0.4) перетворюється на прямокутник (0.1, 0.2, 0.0), (0.3, 0.4, 0.0), (0.3, 0.4, 1.0), (0.1, 0.2, 1.0).
КОНТРОЛЬНІ ЗАПИТАННЯ
Записати послідовність підготовки робочого вікна для функцій OpenGL.
Як побудувати 3х-вимірну фігуру в OpenGL ?
Які параметри має функція gluPerspective і для чого вона потрібна ?
Які змінні відповідають за швидкість повороту фігури у просторі ?
Які повинні існувати матриці окрім матриці моделі ?
Як перейти від малювання трикутниками до малювання чотирикутниками ?
Чи зберігається класичне управління повідомленнями в підсистемі OpenGL ?
Форма звіту по роботі
Звіт по роботі являє собою папку або архів з працюючими завданнями, що відповідають персональному варіанту студента. Звіт зараховується викладачем, якщо варіант співпадає з виданим завданням і студент дає усні відповіді на контрольні запитання.