Tuto èást TUOX-u v souèasné
dobì programuje Dalibor
Lukáš.
Specifikace
READ
Pøi volání této funkce je nutné nastavit
ve zprávì položku m_type = C_READ z callnr.h
Vstupní parametry:
int fs_fd (file descriptor)
char *fs_buffer (buffer v uživatelské oblasti)
int fs_nbytes (poèet bytù, které se mají
pøeèíst)
int fs_seg (typ segmentu uživatelské oblasti: T=text segment,
D=data segment)
Výstupní parametry:
int fs_bytes (poèet pøeètených bytù
nebo chybový kód)
fs_bytes > 0 .. volání probìhlo úspìšnì
jinak: EIO .. chyba pøi ètení z daného zaøízení
EAGAIN .. zaøízení je již obsluhováno
EBADF .. file-deskriptor není platný
EINVAL .. špatnì zadané argumenty
EFAULT .. fs_buffer je vnì adr. prostoru usr. procesu
WRITE
Pøi volání této funkce je nutné nastavit
ve zprávì položku m_type = C_WRITE z callnr.h
Vstupní parametry:
int fs_fd (file descriptor)
char *fs_buffer (buffer v uživatelské oblasti)
int fs_nbytes (poèet bytù, které se mají
zapsat)
int fs_seg (typ segmentu uživatelské oblasti: T=text segment,
D=data segment)
Výstupní parametry:
int fs_bytes (poèet zapsaných bytù)
fs_bytes > 0 .. volání probìhlo úspìšnì
jinak: EIO .. chyba pøi zápisu na dané zaøízení
EAGAIN .. zaøízení je již obsluhováno
EBADF .. file-deskriptor není platný
EINVAL .. špatnì zadané argumenty
EFAULT .. fs_buffer je vnì adr. prostoru usr. procesu
Seznam všech funkcí a jejich význam:
- Soubor read.c:
- int do_read(void) -
Provádí systémové volání READ.
Naplní návratový kód tohoto volání
návratovým kódem funkce read_write(..,READING,..).
- int do_write(void)
- Provádí systémové volání WRITE.
Naplní návratový kód tohoto volání
návratovým kódem funkce read_write(..,WRITING,..).
- int read_write(int fd, char *buffer, int nbytes,
int rw_flag, int seg) - Provádí
systémové volání READ nebo WRITE. Není-li
<fd> platný file-deskriptor, vrací EBADF. Pokud <rw_flag>
není ani READING ani WRITING, vrací EINVAL. Pokud pracujeme
se spec. znak. souborem, vrací výsledek funkce <dev_io>.
Chceme-li zapsat soubor delší, než je povoleno, vrací EFAULT.
Jinak s využitím funkce <rw_chunk> provede pøenos mezi
I/O a pamìť. prostorem uživ. procesu, obnoví se pozice v
souboru, velikost souboru, a pro WRITE i èasposlední
zmìny.
- int rw_chunk(struct inode *rip, off_t pos,
int nbytes, int rw_flag, char *buff, int seg, int usr)
- Pøeète èi zapíše 1 celý blok, nebo
nìjakou èást bloku. Pracujeme-li se spec. blok. souborem,
poèítá se pozice od poèátku adres. prostoru
daného zaøízení, tj. block_nr=pos/BLCK_SIZE.
- block_t read_map(struct inode *rip, off_t
pos) - Vrací èíslo bloku,
v nìmž má inode <rip> ukazatel <pos>. Není-li
takový blok, vrací se NO_BLOCK. Funkce prohledává
i nepøímé bloky 1. a 2. úrovnì.
- block_t write_map(struct inode *rip, off_t
pos) - Vrací èíslo bloku,
v nìmž má inode <rip> ukazatel <pos>. Je-li požadováno
alokovat soubor vìtší 64MB+266kB, vrací se NO_BLOCK.
Pokud blok neexistuje a je alokovatelný(pos < 64MB+266kB), funkce
jej alokuje pøíp. blokù 1. a 2. indirekce.
- int rw_user(int s, int u, char *vir, int bytes,
char *buff, int direction) - Pøenáší
data mezi adr. prostorem uživatele a blokem v CACHE file-systému.
Jestliže direction==TO_USER, funkce volá službu SYS_COPY, aby zkopírovala
do adr. prostoru procesu <u> data z adresy <buff> na adresu
<s:vir> (tzn. segment:offset) o velikosti <bytes>. Jestliže
direction==FROM_USER, kopíruje se ve smìru <s:vir>
-> <buff>. Funkce vrací výsledek tohoto volání.
- struct buf *new_block(struct inode *rip, off_t
position) - Alokuje nový blok, resp.
naète do CACHE již existující, a vynuluje jej. Pøi
alokaci nového bloku funkce mìní bitmapu zón
na daném zaøízení (write_map).
- struct buf *clear_block(struct buf *block)
- Vynuluje daný blok <block>
v CACHE a nastaví atribut DIRTY.