X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=_ldd.xml;h=a1085c6615fc247d80fdc4a0d68044d1efd75d4f;hb=07e42265974da64efdb139647780b3f133590374;hp=2dd4fa6cfbdcdab8e992b70e78d0cd987bd93506;hpb=f22b26650464c996890e3dd3a1059618715f6da0;p=cascardo%2Fkernel%2Fold_slides%2F.git diff --git a/_ldd.xml b/_ldd.xml index 2dd4fa6..a1085c6 100644 --- a/_ldd.xml +++ b/_ldd.xml @@ -9,18 +9,223 @@ -Introduction -Devices are files in /dev +Introdução + +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. + + + +Exemplos de arquivos de dispositivos: + -/dev/sda + +/dev/sda - Um dispositivo de bloco SCSI + -/dev/ttyS0 + +/dev/ttyS0 - Um dispositivo terminal serial + + +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: + + + +open + + +read + + +write + + +close + + +lseek + + +ioctl + + + + + +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. + + + + +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: + + +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); + + +