-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathppos_disk.h
58 lines (48 loc) · 2.13 KB
/
ppos_disk.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// PingPongOS - PingPong Operating System
// Prof. Carlos A. Maziero, DINF UFPR
// Versão 1.2 -- Julho de 2017
// interface do gerente de disco rígido (block device driver)
#ifndef __DISK_MGR__
#define __DISK_MGR__
#include "ppos.h"
#include "ppos-core-globals.h"
#include "disk.h"
#include <signal.h>
// estruturas de dados e rotinas de inicializacao e acesso
// a um dispositivo de entrada/saida orientado a blocos,
// tipicamente um disco rigido.
// estrura que representa um pedido de escrita ou leitura no disco
typedef struct disk_request_t
{
struct disk_request_t *prev, *next ; // ponteiros para usar em filas
task_t *task;
int write; // 0 = leitura, 1 = escrita
int block;
void *buffer;
} disk_request_t ;
// estrutura que representa um disco no sistema operacional
typedef struct
{
// completar com os campos necessarios
task_t dispatcher; // tarefa gerenciadora das requisições
int numblocks; // número total de blocos do disco físico
int blocksize; // tamanho dos blocos do disco físico
int lastBlock; // ultimo bloco acessado
int totalSeekTime; // total de blocos percorridos
task_t *taskQueue; // fila de tarefas suspensas pelo gerenciador de disco
disk_request_t *requestQueue; // fila de requisições
disk_request_t *currentRequest; // requisição atual em progresso
int signal; // 0: se a tarefa atual não foi completada 1: se o sinal que a tarefa está completa foi recebido
semaphore_t semaphore; // semáforo para acesso a estrutura do disco
struct sigaction action; // estrutura que define um tratador de sinal (deve ser global ou static)
} disk_t ;
// inicializacao do gerente de disco
// retorna -1 em erro ou 0 em sucesso
// numBlocks: tamanho do disco, em blocos
// blockSize: tamanho de cada bloco do disco, em bytes
int disk_mgr_init (int *numBlocks, int *blockSize) ;
// leitura de um bloco, do disco para o buffer
int disk_block_read (int block, void *buffer) ;
// escrita de um bloco, do buffer para o disco
int disk_block_write (int block, void *buffer) ;
#endif