Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

<< Zpět - ^ Nahoru - Další >>


>>> stránka zatím rozpracována a bude ještě měněna <<<

PROCESS - Proces

Soubory: INCLUDE\KERNEL\PROCESS.INC, KERNEL\PROCESS.ASM.

Procesem nazýváme skupinu výkonných vláken procesoru operujících ve stejné paměťové oblasti, sdílejících stejnou virtuální paměť a společné systémové prostředky. Procesy jsou organizovány hierarchicky do stromové struktury. Jeden proces může vlastnit více jiných procesů - potomků. Potomci procesu dědí od svého rodiče přístupová práva a systémové prostředky.

Datové struktury a makra


; ------------- Process descriptor

struc		PROCESS

		resb	RBROOT_size	; 0: RB-tree root of memory regions
PROC_TaskNum:	resd	1		; 14h: number of tasks in process
PROC_TaskList:	resb	LIST_size	; 18h: list of tasks in process
PROC_ProcLink:	resb	TREE_size	; 20h: tree link to other processes
PROC_VMMutex:	resb	MUT_size	; 30h: virtual memory mutex-lock
PROC_VMLock:	resb	SPINLOCK_size	; 4Ch: virtual memory spin-lock
PROC_UserProc:	resb	LIST_size	; 50h: user's process list
PROC_PGDir:	resd	1		; 58h: global page directory (0=kernel)
PROC_VMCache:	resd	1		; 5Ch: cache, last used region (0=none)
PROC_Pages:	resd	1		; 60h: counter of allocated pages
PROC_HeapStart:	resd	1		; 64h: start address of the heap
PROC_HeapEnd:	resd	1		; 68h: address behind end of the heap
PROC_User:	resd	1		; 6Ch: pointer to current user USER
PROC_UserID:	resd	1		; 70h: current user's ID
PROC_Flags:	resd	1		; 74h: process flags (see below)

endstruc				; size 78h = 120 bytes

PROC_RegNum:	EQU	RBR_Count	; number of regions (Read-Only!)

; ------------- Process flags

PROC_ADMIN	EQU	USER_ADMIN	; user has admin rights (=B0)

Struktura PROCESS je popisovač jednoho procesu. Na začátku struktury je struktura kořene RB-stromu paměťových regionů. Makro PROC_RegNum slouží ke zjištění počtu paměťových regionů v procesu. Jedná se o interní položku struktury RBROOT a proto nesmí být měněna. PROC_TaskNum je počet úloh (vláken), které patří k tomuto procesu. PROC_TaskList je seznam úloh v tomto procesu. PROC_ProcLink je větev stromového seznamu procesů v systému. PROC_VMMutex je mutexový zámek přístupu k virtuální paměti procesu. PROC_VMLock je meziprocesorový zámek k uzamknutí přístupu k virtuální paměti.

PROC_UserProc je položka seznamu procesů patřících jednomu uživateli. PROC_PGDir je ukazatel na globální popisovač adres PDE (pro jádro systému je tato položka vynulovaná, použije se globální systémový popisovač adres). PROC_VMCache je uschovaný ukazatel na naposledy použitý region. Položka slouží ke zrychlení vyhledávání regionů. Nula představuje neplatný ukazatel. PROC_Pages je čítač alokovaných stránek procesu a slouží k omezení prostředků procesu. PROC_HeapStart je adresa počátku haldy procesu. PROC_HeapEnd je adresa konce haldy procesu.

PROC_User je ukazatel na popisovač uživatele USER, kterému tento proces patří. PROC_UserID je identifikační číslo uživatele, kterému proces patří. PROC_Flags jsou příznaky procesu. Příznak PROC_ADMIN znamená, že uživatelem je administrátor a proces má tedy administrátorská (tedy neomezená) práva.


; ------------- Macro - Initialized process descriptor
; %1 = pointer to current user

%macro		PROCESSINI 1

		RBTREE			; RB-tree root of memory regions
		dd	0		; number of tasks in process
		LISTHEAD		; list of tasks in process
		TREEHEAD		; tree link to other processes
		MUTEX			; virtual memory mutex-lock
		SPINLOCK		; virtual memory spin-lock
		LISTHEAD		; user's process list
		dd	NULL		; page global directory (NULL=kernel)
		dd	NULL		; cache, last used region (NULL=none)
		dd	0		; counter of allocated pages
		dd	NULL		; start address of the heap
		dd	NULL		; address behind end of the heap
		dd	%1		; pointer to current user
		dd	0		; current user's ID
		dd	0		; process flags
%endmacro

Makro PROCESSINI slouží k vytvoření inicializované struktury PROCESS. Parametrem makra je ukazatel na aktuálního uživatele, kterému proces patří. Ostatní položky struktury jsou inicializovány programově.


; ------------- Macro - get current process descriptor (%1 = register)

%macro		CURRENT_PROC 1

		CURRENT	%1		; get current task
		mov	%1,[%1+TASK_Process] ; get current process
%endmacro

Makro CURRENT_PROC vyhledá popisovač aktivního procesu. Parametrem makra je jméno registru, ve kterém bude navrácen ukazatel na popisovač procesu PROCESS. Při vyhledání popisovače se využívá makro CURRENT, které navrátí ukazatel na aktuální úlohu. Ze struktury aktuální úlohy je načten ukazatel na proces, který je vlastníkem aktuální úlohy.


<< Zpět - ^ Nahoru - Další >>