Hello world introduction.
[cascardo/kernel/old_slides/.git] / _ldd.xml
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE slides SYSTEM "/usr/share/xml/docbook/custom/slides/3.3.1/schema/dtd/slides-full.dtd">
3
4 <slides>
5
6 <slidesinfo>
7 <title>Linux Device Drivers</title>
8 <author><firstname>Thadeu</firstname><surname>Cascardo</surname></author>
9 </slidesinfo>
10
11 <foil>
12 <title>Introdução</title>
13 <para>
14 Dispositivos em sistemas POSIX são arquivos no diretório /dev. Como quaisquer
15 outros arquivos no POSIX, eles podem ser abertos, fechados, lidos, escritos,
16 posicionados, controlados, entre outros.
17 </para>
18
19 <para>
20 Exemplos de arquivos de dispositivos:
21 </para>
22
23 <itemizedlist>
24 <listitem>
25 <para>
26 /dev/sda - Um dispositivo de bloco SCSI
27 </para>
28 </listitem>
29 <listitem>
30 <para>
31 /dev/ttyS0 - Um dispositivo terminal serial
32 </para>
33 </listitem>
34 </itemizedlist>
35
36 </foil>
37
38 <foil>
39 <title>Chamandas de Entrada e Saída em POSIX</title>
40 <para>
41 Sistemas POSIX possuem algumas chamadas padrões para E/S. Já que dispositivos
42 são arquivos, essas mesmas chamadas são utilizadas para trabalhar com
43 dispositivos. Vamos trabalhar com as seguintes chamadas:
44 </para>
45 <itemizedlist>
46 <listitem><para>
47 open
48 </para></listitem>
49 <listitem><para>
50 read
51 </para></listitem>
52 <listitem><para>
53 write
54 </para></listitem>
55 <listitem><para>
56 close
57 </para></listitem>
58 <listitem><para>
59 lseek
60 </para></listitem>
61 <listitem><para>
62 ioctl
63 </para></listitem>
64 </itemizedlist>
65 </foil>
66
67 <foil>
68 <title>open</title>
69 <para>
70 A chamada de systema open abre um arquivo. Quando estivermos trabalhando com
71 dispositivo, é quando alguma inicialização deve ser feita. Alguns dispositivos
72 só podem ser abertos por um processo de cada vez.
73 </para>
74 <para>
75 int open (char * filename, int flags);
76 </para>
77 <para>
78 flags podem ser O\_RDONLY, O\_WRONLY, O\_RDWR e muitas outras, algumas menos
79 importantes para dispositivos.
80 </para>
81 <para>
82 Exemplo:
83 </para>
84 <para>
85 fd = open ("/dev/ttyS0", O\_RDWR);
86 </para>
87 </foil>
88
89 <foil>
90 <title>close</title>
91 <para>
92 A chamada de sistema close fecha um arquivo aberto.
93 </para>
94 <para>
95 int close (int fd);
96 </para>
97 <para>
98 Exemplo:
99 </para>
100 <para>
101 close (fd);
102 </para>
103 </foil>
104
105 <foil>
106 <title>read</title>
107 <para>
108 A chamada de sistema read lê de um arquivo aberto para um buffer. Para
109 dispositivos, ela lê de um dispositivo.
110 </para>
111 <para>
112 int read (int fd, char *buffer, int bsz);
113 </para>
114 <para>
115 read retorna o número de bytes escritos no buffer, que pode ser menor que o
116 número de bytes requisitados por diferentes razões.
117 </para>
118 <para>
119 Exemplo:
120 </para>
121 <para>
122 c = read (fd, buffer, sizeof (buffer));
123 </para>
124 </foil>
125
126 <foil>
127 <title>write</title>
128 <para>
129 A chamada de sistema write escreve dados de um buffer em um arquivo aberto. Para
130 dispositivos, ela escreve no dispositivo.
131 </para>
132 <para>
133 int write (int fd, char *buffer, int bsz);
134 </para>
135 <para>
136 write retorna o número de bytes escritos no arquivo, que pode ser menor que o
137 número de bytes requisitados por diferentes razões.
138 </para>
139 <para>
140 Exemplo:
141 </para>
142 <para>
143 c = write (fd, buffer, strlen (buffer));
144 </para>
145 </foil>
146
147 <foil>
148 <title>lseek</title>
149 <para>
150 A chamada de sistema lseek muda a posição corrente do arquivo, permitindo a
151 leitura ou escrita naquela posição. Posicionar em um dispositivo pode ter
152 diferentes significados.
153 </para>
154 <para>
155 off\_t lseek (int fd, off\_t pos, int whence);
156 </para>
157 <para>
158 O significado da posição depende do valor de whence, que pode ser
159 SEEK\_SET (a posição absoluta), SEEK\_CUR (relativa a posição corrente),
160 SEEK\_END (relativa ao fim do arquivo).
161 </para>
162 <para>
163 Exemplo:
164 </para>
165 <para>
166 lseek (fd, 0, SEEK\_END);
167 </para>
168 </foil>
169
170 <foil>
171 <title>ioctl</title>
172 <para>
173 A chamada de sistema ioctl é uma operação "pega-tudo". Para aquelas operações
174 que não se encaixam no modelo leitura/escrita, ioctl permite ao usuário enviar
175 um comando com um argumento opcional ao dispositivo. Esse comando pode aceitar
176 entrada ou gerar saída.
177 </para>
178 <para>
179 int ioctl (int fd, int request, char *arg);
180 </para>
181 <para>
182 O último argumento é opcional e depende do tipo de requisição. Todo dispositivo
183 ou classe de dispositivo pode ter seu diferente conjunto de ioctl's.
184 </para>
185 <para>
186 Exemplo:
187 </para>
188 <para>
189 struct ifreq req; ioctl (fd, SIOCGIFFLAGS, \&#38;req);
190 </para>
191 </foil>
192
193 <foil>
194 <title>Módulos do Linux</title>
195 <para>
196 Linux é modularizado. Drivers, sistemas de arquivos, protocolos de rede e outros
197 podem ser carregados em tempo de execução. Todo módulos tem uma função init e
198 uma função exit.
199 </para>
200 <para>
201 Módulos podem ter parâmetros. Em tempo de carga, parâmetros, que podem ser
202 booleanos, inteiros ou strings, são dados pelo usuário.
203 </para>
204 </foil>
205
206 <foil>
207 <title>Tipos e números de dispositivos</title>
208 <para>
209 Dispositivos no Linux podem ter diferentes tipos, incluindo dispositivos de
210 caractere, dispositivos de bloco e dispositivos de rede. Tanto dispositivos de
211 caractere quanto de bloco têm números identificadores, um número maior e um
212 número menor.
213 </para>
214 </foil>
215
216 <foil>
217 <title>Alocação de dispositivos de caractere</title>
218 <para>
219 No Linux, números maior e menor devem ser requisitados ou alocados. As chamadas
220 para fazê-lo para os dispositivos de caractere são:
221 </para>
222 <para>
223 int register\_chrdev\_region (dev\_t first, unsigned int count, char
224 *name);
225 int alloc\_chrdev\_region (dev\_t *dev, unsigned int firstminor,
226 unsigned int count, char *name);
227 void unregister\_chrdev\_region (dev\_t dev, unsigned int count);
228 </para>
229 </foil>
230
231 </slides>