CFLAGS = -D__KERNEL__ -DMODULE -Wall -O
El símbolo
Junto con el código fuente del driver se incluye un archivo Makefile para facilitar el proceso de compilación.
/sbin/insmod -f ./rw_bar.o "used_bars=3"
Para simplificar la tarea de determinar la cantidad de espacios de memoria PCI utilizados por el dispositivo se utiliza un script ( load_rw_bar.sh ), que hace uso de la herramienta lspci explicada más adelante. También en este script se crean los nodos en el sistema de archivos para acceder a cada espacio de memoria PCI.
Deben de completarse los siguientes parámetros en el script:
Por ejemplo:
vendor_id="1172"
device_id="abba"
module="rw_bar"
device="rw_bar"
mode="664"
El vendor_id="1172" corresponde a ALTERA.
En caso de que la aplicación utilice 3 BARs, se crean los nodos:
/dev/rw_bar0, correspondiente a BAR0
/dev/rw_bar1, correspondiente a BAR1
/dev/rw_bar2, correspondiente a BAR2
Al instalarlo se muestra información sobre las direcciones del espacio PCI asignadas a cada BAR y el tamaño de estos.
La descarga del driver utiliza el programa rmmod pasándole como parámetro el nombre del módulo. Para simplificar la tarea se utiliza un script(unload_rw_bar.sh)
El mismo desinstala el módulo y elimina los nodos creados con load_rw_bar.sh.
Los parámetros a completar son los mismos que los del script de instalación.
Se desarrollaron un par de scripts basados en el lenguaje Perl, uno de lectura y otro de escritura. Ambos scripts permiten manipular un byte en particular, ubicado en cualquier posición dentro del espacio de memoria, utilizando un cierto offset o desplazamiento a partir del primer byte.
Uso:
roff.pl [-C] [-x] [-b] [-o offset] [-c count] [-s buffsize] archivo
Parámetros requeridos:
Parámetros opcionales:
Un ejemplo de utilización sería:
./roff.pl -C -o 2 -c 30 /dev/rw_bar1
Se leen 30 bytes (parámetro -c) a partir del byte 2 (parámetro -o) del archivo /dev/rw_bar1, y la salida se presenta en pantalla en forma hexadecimal y ascii en forma de columnas (parámetro -C).
Uso:
woff.pl [-x] [-b] [-v] [-o offset] [-c count] [-s buffsize] archivo
Parámetros requeridos:
* archivo de lectura
* datos por entrada estándar
Parámetros opcionales
El uso del modo -x hace que se interprete la entrada como ASCII hexadecimal. Esto significa que los caracteres de la entrada se juntan de a pares para generar un byte, que es lo que que finalmente se escribe en el archivo de salida. Por ejemplo, el par de caracteres ASCII hexa "FF" corresponden a un byte cuyo valor es 255.
El uso de este modo afecta a los valores de -c y -s. Ambos pasan a interpretarse en caracteres y no en bytes. Si se quiere escribir con un buffer de tamaño 4, el valor de -s debe ser 8 cuando se lo usa junto con -x.
Un ejemplo sería el siguiente:
echo -n "testing" | ./woff.pl -o 2 /dev/rw_bar1
En este caso se escribe el texto "testing" al archivo /dev/rw_bar1, tomando como posición inicial de escritura el byte 2 dentro del archivo (parámetro -o).
El uso del parámetro -x permite escribir cualquier valor deseado, representado en forma hexadecimial. El siguiente ejemplo escribe el numero 255 en el primer byte del archivo /dev/rw_bar1:
echo -n ff | ./woff.pl -x /dev/rw_bar1
NOTA: la variable de entorno LANG no debe estar configurada para utilizar caracteres UTF8. Se recomienda LANG=en_US.
Uso:
#cat /proc/driver/iiepci --------- IEEPCI Stats - HZ : 512 - loops_per_jiffy: 778240 ------- --------- W R I T E -- M E M C O P Y ------------------------------- | KB/sec | bytes | microseconds | tsc loops ----------+--------------+--------------+--------------+-------------- TOTAL | 32231| 26624| 806| 321425 BAR1 TOTAL| 32231| 26624| 806| 321425 BAR2 TOTAL| 0| 0| 0| 1 BAR3 TOTAL| 0| 0| 0| 1 LAST WRITE| 32468| 512| 15| 6136 --------- R E A D -- M E M C O P Y --------------------------------- | KB/sec | bytes | microseconds | tsc loops ----------+--------------+--------------+--------------+-------------- TOTAL | 5472| 10058788| 1795103| 715274956 BAR1 TOTAL| 5472| 10058788| 1795103| 715274956 BAR2 TOTAL| 0| 0| 0| 1 BAR3 TOTAL| 0| 0| 0| 1 LAST READ | 2829| 4| 1| 550
También se recomienda el uso de la utilidad watch de Linux (parte del paquete procps de RedHat) que reitera un comando cada una cierta cantidad de segundos, especificad por el parámetro -n.
Ejemplo:
# watch -n 1 cat /proc/driver/iiepci
Este comando despliega automáticamente las estadísticas en pantalla, cada 1 segundo.
Es muy útil para obtener información rápidamente.
La aplicación lspci despliega información sobre todos los buses PCI presentes en el sistema, y los dispositivos que estén conectados en ellos.
La aplicación setpci permite obtener y modificar valores de configuración de los dispositivos PCI conectados. Esta aplicación permite hacer cambios en los registros de configuración de un dispositivo en forma muy sencilla. Fue utilizada extensivamente en las primeras etapas de desarrollo del core PCI.