]>
wirehaze git hosting - ppos.git/blob - ppos/hardware/disk.h
1 // PingPongOS - PingPong Operating System
2 // Prof. Carlos A. Maziero, DINF UFPR
3 // Versão 2.0 -- Junho de 2025
5 // ATENÇÃO: ESTE ARQUIVO NÃO DEVE SER ALTERADO;
6 // ALTERAÇÕES SERÃO DESCARTADAS NA CORREÇÃO.
8 // Interface do disco virtual, que simula um disco rígido (descrição abaixo).
10 // Atenção: deve ser usado o flag de ligação -lrt, para ligar com a
11 // biblioteca POSIX de tempo real, pois o disco simulado usa timers POSIX.
13 // verifica sistema operacional
15 #error "Disk emulator library is designed specifically for Linux OS."
21 // estados internos do disco
22 #define DISK_STATUS_UNKNOWN 0 // disco não iniciado
23 #define DISK_STATUS_IDLE 1 // disco livre
24 #define DISK_STATUS_READ 2 // disco ocupado fazendo leitura
25 #define DISK_STATUS_WRITE 3 // disco ocupado fazendo escrita
27 // operações oferecidas pelo disco
28 #define DISK_CMD_INIT 0 // inicia o disco
29 #define DISK_CMD_READ 1 // leitura de bloco do disco
30 #define DISK_CMD_WRITE 2 // escrita de bloco do disco
31 #define DISK_CMD_STATUS 3 // consulta status do disco
32 #define DISK_CMD_DISKSIZE 4 // consulta tamanho do disco em blocos
33 #define DISK_CMD_BLOCKSIZE 5 // consulta tamanho de bloco em bytes
34 #define DISK_CMD_DELAYMIN 6 // consulta tempo resposta mínimo (ms)
35 #define DISK_CMD_DELAYMAX 7 // consulta tempo resposta máximo (ms)
37 // solicita uma operação ao disco virtual
38 int hw_disk_cmd(int cmd
, int block
, void *buffer
);
41 Este código simula a operação e interface de um disco rígido de computador,
42 que permite a leitura e escrita sequencial de blocos de dados, usando a
43 interface descrita acima. O conteúdo do disco simulado é armazenado em um
44 arquivo no sistema operacional subjacente, sendo portanto preservado de
45 uma execução para outra.
47 O disco opera sequencialmente (realiza somente uma operação por vez) e a
48 maioria das operações é síncrona, retornando o resultado ao concluir.
49 Todavia, as operações de leitura e escrita de blocos de dados são atendidas
50 de forma assíncrona, ou seja: o disco responde à solicitação imediatamente,
51 mas a operação de E/S em si demora um pouco mais; quando ela for completada,
52 o disco irá informar isso através de uma interrupção (IRQ). Essa interrupção
53 deve então ser tratada pelo driver de disco, para acordar a tarefa que
54 solicitou a operação de E/S.
56 Enquanto o disco estiver ocupado em uma leitura/escrita, o status do disco
57 será DISK_STATUS_READ ou DISK_STATUS_WRITE; solicitações de leitura ou
58 escrita com o disco ocupado retornarão com erro.
62 inicia um disco (operação síncrona)
63 int disk_cmd (DISK_CMD_INIT, 0, char *disk_image) ;
64 disk_image: caminho do arquivo que contém a imagem do disco
66 result = 0: disco corretamente iniciado
68 consulta status do disco (operação síncrona)
69 int disk_cmd (DISK_CMD_STATUS, 0, 0) ;
70 result = 0: erro (disco não iniciado ou inexistente)
71 result = DISK_STATUS_IDLE: disco livre
72 result = DISK_STATUS_READ: disco ocupado realizando leitura
73 result = DISK_STATUS_WRITE: disco ocupado realizando escrita
75 consulta tamanho do disco (operação síncrona)
76 int disk_cmd (DISK_CMD_DISKSIZE, 0, 0) ;
78 result >= 0: tamanho do disco (em blocos)
80 consulta tamanho de cada bloco (operação síncrona)
81 int disk_cmd (DISK_CMD_BLOCKSIZE, 0, 0) ;
83 result >= 0: tamanho de cada bloco (em bytes)
85 consulta tempo de resposta mínimo (operação síncrona)
86 int disk_cmd (DISK_CMD_DELAYMIN, 0, 0) ;
88 result >= 0: tempo de resposta mínimo do disco (em ms)
90 consulta tempo de resposta máximo (operação síncrona)
91 int disk_cmd (DISK_CMD_DELAYMAX, 0, 0) ;
93 result >= 0: tempo de resposta máximo do disco (em ms)
95 agenda a leitura de um bloco de disco (operação assíncrona)
96 int disk_cmd (DISK_CMD_READ, int block, void *buffer) ;
97 block: número do bloco a ser lido
98 buffer: endereço do buffer para os dados lidos
100 result = 0: ok (leitura agendada, IRQ_DISK será gerada ao completar)
102 agenda a escrita de um bloco de disco (operação assíncrona)
103 int disk_cmd (DISK_CMD_WRITE, int block, void *buffer) ;
104 block: número do bloco a ser escrito
105 buffer: endereço do buffer com os dados a escrever
107 result = 0: ok (escrita agendada, IRQ_DISK será gerada ao completar)