X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=02.vfs%2F02.vfs.xml;h=e5bda1c8c612dec4ae128d01270f788531b0f603;hb=809779dea04b4be4819cd5edcf8f0250f48b0c9f;hp=a1085c6615fc247d80fdc4a0d68044d1efd75d4f;hpb=cbe2f80257c71547341e58f32b22031e194d2342;p=cascardo%2Fkernel%2Fold_slides%2F.git diff --git a/02.vfs/02.vfs.xml b/02.vfs/02.vfs.xml index a1085c6..e5bda1c 100644 --- a/02.vfs/02.vfs.xml +++ b/02.vfs/02.vfs.xml @@ -4,227 +4,97 @@ -Linux Device Drivers +Virtual File System ThadeuCascardo -Introdução +Introduction -Dispositivos em sistemas POSIX são arquivos no diretório /dev. Como quaisquer -outros arquivos no POSIX, eles podem ser abertos, fechados, lidos, escritos, -posicionados, controlados, entre outros. +The virtual file system is the hub for almost all operations in a Linux-based +system. It allows IPC with pipes, access to devices, including storage through +regular files and organization with directories. + + +Everything is a file -Exemplos de arquivos de dispositivos: +In Unix, there's a say: "everything is a file, if it's not a file, it's a +process". Well, most things are really files, and that's why the VFS is at the +center of the system, including for device drivers. + - - - -/dev/sda - Um dispositivo de bloco SCSI - - - + +Special files, procfs and others -/dev/ttyS0 - Um dispositivo terminal serial +When handling with special files (character and block device nodes), procfs +files and others, we'll use some common structures. These include the +struct file\_operations, struct file +and struct inode. - - - -Chamandas de Entrada e Saída em POSIX - -Sistemas POSIX possuem algumas chamadas padrões para E/S. Já que dispositivos -são arquivos, essas mesmas chamadas são utilizadas para trabalhar com -dispositivos. Vamos trabalhar com as seguintes chamadas: - +File Operations - + open - - + + +release + + read - - + + write - - -close - - -lseek - - + + ioctl - + + +llseek + + +poll + + +mmap + + +many others + -open - -A chamada de systema open abre um arquivo. Quando estivermos trabalhando com -dispositivo, é quando alguma inicialização deve ser feita. Alguns dispositivos -só podem ser abertos por um processo de cada vez. - - -int open (char * filename, int flags); - - -flags podem ser O\_RDONLY, O\_WRONLY, O\_RDWR e muitas outras, algumas menos -importantes para dispositivos. - - -Exemplo: - - -fd = open ("/dev/ttyS0", O\_RDWR); - - - - -close - -A chamada de sistema close fecha um arquivo aberto. - - -int close (int fd); - - -Exemplo: - - -close (fd); - - - - -read - -A chamada de sistema read lê de um arquivo aberto para um buffer. Para -dispositivos, ela lê de um dispositivo. - - -int read (int fd, char *buffer, int bsz); - - -read retorna o número de bytes escritos no buffer, que pode ser menor que o -número de bytes requisitados por diferentes razões. - - -Exemplo: - - -c = read (fd, buffer, sizeof (buffer)); - - - - -write - -A chamada de sistema write escreve dados de um buffer em um arquivo aberto. Para -dispositivos, ela escreve no dispositivo. - - -int write (int fd, char *buffer, int bsz); - - -write retorna o número de bytes escritos no arquivo, que pode ser menor que o -número de bytes requisitados por diferentes razões. - - -Exemplo: - - -c = write (fd, buffer, strlen (buffer)); - - - - -lseek - -A chamada de sistema lseek muda a posição corrente do arquivo, permitindo a -leitura ou escrita naquela posição. Posicionar em um dispositivo pode ter -diferentes significados. - - -off\_t lseek (int fd, off\_t pos, int whence); - - -O significado da posição depende do valor de whence, que pode ser -SEEK\_SET (a posição absoluta), SEEK\_CUR (relativa a posição corrente), -SEEK\_END (relativa ao fim do arquivo). - - -Exemplo: - - -lseek (fd, 0, SEEK\_END); - - - - -ioctl - -A chamada de sistema ioctl é uma operação "pega-tudo". Para aquelas operações -que não se encaixam no modelo leitura/escrita, ioctl permite ao usuário enviar -um comando com um argumento opcional ao dispositivo. Esse comando pode aceitar -entrada ou gerar saída. - - -int ioctl (int fd, int request, char *arg); - - -O último argumento é opcional e depende do tipo de requisição. Todo dispositivo -ou classe de dispositivo pode ter seu diferente conjunto de ioctl's. - - -Exemplo: - - -struct ifreq req; ioctl (fd, SIOCGIFFLAGS, \&req); - - - - -Módulos do Linux - -Linux é modularizado. Drivers, sistemas de arquivos, protocolos de rede e outros -podem ser carregados em tempo de execução. Todo módulos tem uma função init e -uma função exit. - - -Módulos podem ter parâmetros. Em tempo de carga, parâmetros, que podem ser -booleanos, inteiros ou strings, são dados pelo usuário. - - - - -Tipos e números de dispositivos - -Dispositivos no Linux podem ter diferentes tipos, incluindo dispositivos de -caractere, dispositivos de bloco e dispositivos de rede. Tanto dispositivos de -caractere quanto de bloco têm números identificadores, um número maior e um -número menor. - +Opened File + + +f\_mode + + +f\_flags + + +f\_pos + + +f\_op + + +private\_data + + -Alocação de dispositivos de caractere - -No Linux, números maior e menor devem ser requisitados ou alocados. As chamadas -para fazê-lo para os dispositivos de caractere são: - +Filesystem File: inode -int register\_chrdev\_region (dev\_t first, unsigned int count, char -*name); -int alloc\_chrdev\_region (dev\_t *dev, unsigned int firstminor, -unsigned int count, char *name); -void unregister\_chrdev\_region (dev\_t dev, unsigned int count); +The inode is a representation of the file as in its filesystem, including its +major/minor numbers and pointers to the corresponding device representation.