Professional Documents
Culture Documents
Explicaci
on de practica 3
Sistemas Operativos
Facultad de Inform
atica
Universidad Nacional de La Plata
2016
Agenda
1 Kernel
2 System Calls
3 M
odulos
Agenda
1 Kernel
2 System Calls
3 M
odulos
binario en memoria.
Memoria Compartida(sincronizaci
on!)
Scheduler, Drivers, Memory Manager,etc en un mismo proceso
direcciones implica un m
odulo muy grande y complejo.
La raz
on de tener un u
nico gran componente linkeado en un
Microkernel
Pros
Facilidad para desarrollar servicios del SO.
Los bugs existen y existir
an siempre, entonces deben ser
aislados.
Kernel muy peque
no, entonces mas facil de entender,
actualizar y optimizar.
Contras
Baja performance
La computaci
on distribuida es inheremente mas compleja que
la computaci
on por memoria compartida
No fue adoptado masivamente por la industria(ej. Minix)
vs
http://en.wikipedia.org/wiki/Tanenbaum
Agenda
1 Kernel
2 System Calls
3 M
odulos
POSIX APIs
La funcionalidad anterior est
a definida por el estandar POSIX
Su pr
oposito es proveer una interfaz com
un para lograr
portabilidad
En el caso de las System Calls, el desarrollador generalmente
interact
ua con el API y NO directamente con el Kernel
En UNIX por lo general cada funci
on del API se corresponde
portabilidad
Su funcionalidad la ejecuta el Kernel
Recordar
Cambio de Modo
Como se pasa de modo usuario a modo Kernel?
por glibc
Definida en la libreria unistd.h
long int syscall (long int sysno, ...)
Ejemplo utilizando syscall:
rc = syscall(SYS chmod, /etc/passwd,
0444);
Ejemplo
#include <stdlib.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <unistd.h>
#define SYS_gettimeofday 78
void main(void){
struct timeval tv;
/* usando el wrapper de glibc */
gettimeofday(&tv, NULL);
/* Invocaci
on expl
cita del system call */
syscall(SYS_gettimeofday, &tv, NULL);
}
mecanismo de interrupciones.
Interrupci
on enmascarable int 0x80 en Linux.
Se usa el vector 0x80 para transferir el
control al kernel. Este vector de
interrupci
on esta inicializado durante el
startup del sistema.
Una librera de espacio de usuario(libc) carga el ndice de la
number).
Agregamos una entrada a la syscall table.
Debemos considerar el sys call number.
Ver que el codigo fuente organizado por arquitectura.
Respetar las convenciones del Kernel(ej. prefijo sys ).
/usr/src/linux-3.8/arch/x86/entry/syscalls/syscall 32.tbl
373
374
375
376
377
i386
i386
i386
i386
i386
del stack
Informamos de esto al compilador mediante la macro
asmlinkage
asmlinkage instruye al compilador a pasar par
ametros por stack
/usr/src/linux-3.8/include/linux/syscalls.h
asmlinkage long sys newcall(int i);
Makefile.
Ver apuntes adjuntos
Recompilar el Kernel!
Idem Pr
actica 2
#include <linux/unistd.h>
#include <stdio.h>
#define sys_newcall 377
int main(void) {
int i = syscall(sys_newcall,1);
printf ("El resultado es:\n", i);
}
Strace
Reporta las system calls que realiza cualquier programa
man strace
Opci
on u
til -f (tiene en cuenta procesos hijos)
DESAFIO
la funci
on printk
Se debe hacer sobre la la 4.4.6
Tips:
Utilizar explicaci
on y practica para guiarse
http://lxr.free-electrons.com/
DESAFIO - Implementacion
D
onde incluir la implementaci
on?:
Dos opciones:
Incluir el c
odigo en un fichero existente
Agregar un nuevo fichero i modificar Makefile existente
hsourcei/kernel
#i n c l u d e < l i n u x / s y s c a l l s . h> / * For SYSCALL DEFINEi ( ) * /
#i n c l u d e < l i n u x / k e r n e l . h>
SYSCALL DEFINE0 ( m y s y s c a l l )
{
p r i n t k (KERN DEBUG H e l l o w o r l d \n ) ;
return 0;
}
#
# Makefile f o r the l i n u x k e r n e l .
#
o b j y = . . .
a s y n c . o r a n g e . o g r o u p s . o smpboot . o m y s y s c a l l . o
...
DESAFIO - Test
#i n c l u d e
#i n c l u d e
#i n c l u d e
#i n c l u d e
< l i n u x / e r r n o . h>
<s y s / s y s c a l l . h>
< l i n u x / u n i s t d . h>
< s t d i o . h>
#d e f i n e
NR MYSYSCALL nums y s c a l l
i n t main ( ) {
p r i n t f ( I n v o c a n d o s y s t e m c a l l \n ) ;
r e t u r n s y s c a l l ( NR MYSYSCALL ) ;
}
$ g c c m y s y s c a l l . c o m y s y s c a l l
$ ./ mysyscall
DESAFIO - Parche
## C r e a r p a r c h e
$ d i f f urpN l i n u x 4 . 4 . 6 l i n u x 4.4.6 m o d i f i c a d o > patch
4.4.6 s o 2 0 1 6
No olvidar ejecutar!:
$ make c l e a n
$ make m r p r o p e r
Agenda
1 Kernel
2 System Calls
3 M
odulos
Pedazos de c
odigo que pueden ser cargados y descargados
bajo demanda
Extienden la funcionalidad del kernel
Sin ellos el kernel sera 100 % monoltico
Monoltico hibrido
No recompilar ni rebootear el kernel
Comandos relacionados
lsmod
Lista los m
odulos cargados (es equivalente a cat
/proc/modules)
rmmod
Descarga uno o m
as m
odulos
modinfo
Muestra informaci
on sobre el m
odulo
insmod
Trata de cargar el m
odulo especificado
depmod
Permite calcular las dependencias de un m
odulo
depmod -a escribe las dependencias en el archivo
/lib/modules/version/modules.emp
modprobe
Emplea la informaci
on generada por depmod e informacion de
/etc/modules.conf para cargar el m
odulo especificado.
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void){
printk(KERN_INFO "Hello world 1.\n");
return 0;
}
void cleanup_module(void){
printk(KERN_INFO "Goodbye world 1.\n");
}
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int hello_2_init(void){
printk(KERN_INFO "Hello, world 2\n");
return 0;}
static void hello_2_exit(void){
printk(KERN_INFO "Goodbye, world 2\n");}
module_init(hello_2_init);
module_exit(hello_2_exit);
Compilamos
$ make
modulo
Cada dispositivo de hardware es un archivo (abstracci
on)
Ejemplo: /dev/hda
En realidad no es un archivo.
Si leemos/escribimos desde
el lo hacemos sobre datos crudos
del disco (bulk data).
Accedemos a estos archivos mediante operaciones b
asicas
Dispositivos en UNIX
Major y Minor device number.
Los dispositivos se dividen en n
umeros llamados major device
number. Ej: los discos SCSI tienen el major number 8.
Cada dispositivo tiene su minor device number. Ejemplo:
/dev/sda major number 8 y minor number 0
Con el major y el minor number el kernel identifica un
dispositivo.
kernel code/linux/Documentation/devices.txt
# l s l / dev / hda [1 3]
brwrw 1 r o o t d i s k 3 , 1 Abr 9 1 5 : 2 4 / dev / hda1
brwrw 1 r o o t d i s k 3 , 2 Abr 9 1 5 : 2 4 / dev / hda2
brwrw 1 r o o t d i s k 3 , 3 Abr 9 1 5 : 2 4 / dev / hda3
Representaci
on de los dispositivos(device files)
Por convenci
on estan en el /dev
Se crean mediante el comando mknod.
mknod[ m<mode >] f i l e [ b | c ] m a j o r
minor
b o c: seg
un se trate de dispositivos de caracter o de bloque.
El minor y el major number lo obtenemos de
kernel code/linux/Documentation/devices.txt
Dispositivos en UNIX
leen/escriben al dispositivo.
struct file_operations my_driver_fops = {
read: myDriver_read,
write: myDriver_write,
open: myDriver_open,
release: mydriver_release};
En la funci
on module init registro mi driver.
unregister_chrdev(major_number, "myDriver");
Par
ametros de las funciones funciones:
Struct file: Estructura del kernel que representa un archivo
abierto.
char *buf: El dato a ledo o a escribir desde/hacia el
dispositivo(espacio de usuario)
size t count: La longitud de buf.
loff t *f pos count: La posici
on manipulada
Preguntas?