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);
+
+
+