From: Thadeu Lima de Souza Cascardo Date: Mon, 7 Dec 2009 02:21:36 +0000 (-0200) Subject: Moved POSIX course to its own directory, independent of VFS. X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fkernel%2Fold_slides%2F.git;a=commitdiff_plain;h=8407213d1b6c248350d90e1a1c0e8c8bfe878da4 Moved POSIX course to its own directory, independent of VFS. --- diff --git a/02.a.posix/02.vfs.xml b/02.a.posix/02.vfs.xml new file mode 100644 index 0000000..a1085c6 --- /dev/null +++ b/02.a.posix/02.vfs.xml @@ -0,0 +1,231 @@ + + + + + + +Linux Device Drivers +ThadeuCascardo + + + +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 - Um dispositivo de bloco SCSI + + + + +/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); + + + + diff --git a/02.a.posix/Makefile b/02.a.posix/Makefile new file mode 100644 index 0000000..a7a7fc7 --- /dev/null +++ b/02.a.posix/Makefile @@ -0,0 +1,13 @@ +NAME = 02.vfs + +all: $(NAME).pdf + +%.pdf: %.tex + TEXINPUTS=.:..: pdflatex $< + +%.tex: %.xml ../beamer.xsl + xsltproc ../beamer.xsl $< > $@ + +clean: + rm -f $(NAME).pdf $(NAME).tex $(NAME).aux $(NAME).log $(NAME).nav \ + $(NAME).out $(NAME).snm $(NAME).toc $(NAME).vrb diff --git a/02.vfs/02.vfs.xml b/02.vfs/02.vfs.xml deleted file mode 100644 index a1085c6..0000000 --- a/02.vfs/02.vfs.xml +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - -Linux Device Drivers -ThadeuCascardo - - - -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 - Um dispositivo de bloco SCSI - - - - -/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); - - - - diff --git a/02.vfs/Makefile b/02.vfs/Makefile deleted file mode 100644 index a7a7fc7..0000000 --- a/02.vfs/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -NAME = 02.vfs - -all: $(NAME).pdf - -%.pdf: %.tex - TEXINPUTS=.:..: pdflatex $< - -%.tex: %.xml ../beamer.xsl - xsltproc ../beamer.xsl $< > $@ - -clean: - rm -f $(NAME).pdf $(NAME).tex $(NAME).aux $(NAME).log $(NAME).nav \ - $(NAME).out $(NAME).snm $(NAME).toc $(NAME).vrb