SlideShare uma empresa Scribd logo
1 de 39
kernel II - System Calls y M´odulos
Explicaci´on de pr´actica 3
Sistemas Operativos
Facultad de Inform´atica
Universidad Nacional de La Plata
2015
Agenda
1 Kernel
2 System Calls
3 M´odulos
Agenda
1 Kernel
2 System Calls
3 M´odulos
Kernel de GNU Linux
ˆ 2,4 millones de lineas de c´odigo(y contando...)
ˆ El 70 % del c´odigo son drivers
ˆ Windows: mas del doble de lineas!
ˆ Tasa de errores en drivers con respecto al Kernel: 7 veces mas
ˆ Fuente:http://pdos.csail.mit.edu/6.097/readings/osbugs.pdf
ˆ Comparaci´on con la aerona´utica:
ˆ Aislamiento de fallas
ˆ Un problema en el toilet no afecta al sistema de navegaci´on!
Kernel Monol´ıtico - Mismo proceso
ˆ Todos los componentes del kernel linkeados en un mismo
binario en memoria.
ˆ Memoria Compartida(sincronizaci´on!)
ˆ Scheduler, Drivers, Memory Manager,etc en un mismo proceso
Kernel Monol´ıtico - Operating System Crash
ˆ ¿Que sucede si hay un error en un driver?
ˆ Windows: BSD(blue screen of death).
ˆ Unix: Kernel Panic.
ˆ Un ´unico gran componente linkeado en un mismo espacio de
direcciones implica un m´odulo muy grande y complejo.
ˆ La raz´on de tener un ´unico gran componente linkeado en un
mismo espacio de direcciones se debe a cuestiones de
performance por limitaciones de hardware tomadas hace
mucho tiempo.
ˆ ¿Hoy en dia la decisi´on seria la misma?
Microkernel - Procesos de usuario
ˆ Componentes del kernel en distintos procesos de USUARIO
ˆ Kernel minimalista(comunicaci´on con el hard e IPC)
ˆ IPC (Computaci´on distribuida!)
ˆ Scheduler, Drivers, Memory Manager en distintos procesos de
Usuario
ˆ IPC es parte del Kernel(muchos cambios de modo)
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 f´acil 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)
Tanembaum – Torvalds debate
vs
http://en.wikipedia.org/wiki/Tanenbaum
Agenda
1 Kernel
2 System Calls
3 M´odulos
API del Sistema Operativo
ˆ Los SOs proveen un conjunto de interfaces mediante las
cuales un proceso que corre en espacio de usuario accede a un
conjunto de funciones comunes
ˆ En UNIX el API principal que provee estos servicios es libc:
ˆ Es el API principal del SO
ˆ Provee las librer´ıas estandar de C
ˆ Es una Interface entre aplicaciones de usuario y las System
Calls(System Call Wrappers).
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
con una System Call
System Calls - Repaso
ˆ Son llamados al kernel para ejecutar una funci´on espec´ıfica
que controla un dispositivo o ejecuta una instrucci´on
privilegiada
ˆ Su pr´oposito es proveer una interfaz com´un para lograr
portabilidad
ˆ Su funcionalidad la ejecuta el Kernel
ˆ Recordar
ˆ Cambio de Modo
ˆ ¿Como se pasa de modo usuario a modo Kernel?
Invocando System Calls
ˆ Utilizando los wrappers de glibc
ˆ int rc = chmod( /etc/passwd", 0444);
ˆ Invocaci´on expl´ıcita utilizando la System Call syscall provista
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);
}
Interrupciones y System Calls
ˆ La manera en que una system call es llevada a cabo
depender´a del procesador.
ˆ Los procesadores x86 se basan en el
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 librer´ıa de espacio de usuario(libc) carga el ´ındice de la
system call y sus argumentos, la interrupci´on enmascarable
por software 0x80 es invocada, la cual resulta en el cambio de
modo.
ˆ La estructura sys call table y el registro eax como ´ındice se
determina que funci´on invocar.
System Calls e Interrupciones
Consideremos el siguiente caso:
#include <syscall.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#define sys_getpid 20
int main(void) {
long ID = syscall(SYS_getpid);
printf ("El pId del proceso es:n", ID);
}
System Calls e Interrupciones(cont.)
El compilador generar´a:
_setuid:
subl $4, %exp
pushl %ebx
movzwl 12( %esp), %eax
movl %eax,4( %esp)
movl $20, %eax
movl 4( %esp), %ebx
int $0x80
movl %eax, %edx
testl %edx, %edx
jge L2
negl %edx
movl %edx,_errno
movl $-1, %eax
popl %ebx
addl $4, %esp
System Calls en GNU Linux
ˆ Debemos declarar nuestra syscall por un n´umero ´unico(syscall
number).
ˆ Aggregamos una entrada a la syscall table.
ˆ Debemos considerar el sys call number.
ˆ Ver que el c´odigo fuente organizado por arquitectura.
ˆ Respetar las convenciones del Kernel(ej. prefijo sys ).
/usr/src/linux-3.8/arch/x86/syscalls/syscall 32.tbl
343 i386 clock adjtime sys clock adjtime
347 i386 process vm readv sys process vm readv
348 i386 process vm writev sys process vm writev
349 i386 kcmp sys kcmp
350 i386 finit module sys finit module
351 i386 newcall sys newcall
System Calls en GNU Linux(Cont.)
ˆ Debemos definir el prototipo de nuestra system call
ˆ Los par´ametros a system calls deben ser realizados por medio
del stack
ˆ Informamos de esto al compilador mediante la macro
asmlinkage
ˆ asmlinkage instruye al compilador a pasar par´ametros por stack
y no por ejemplo en registros
/usr/src/linux-3.8/include/linux/syscalls.h
asmlinkage long sys newcall(int i);
System Calls en GNU Linux(Cont..)
ˆ Debemos nuestra syscall en alg´un punto del ´arbol de fuentes.
ˆ Podemos utilizar alg´un archivo existente.
ˆ Podemos incluir un nuevo archivo y su correspondiente
Makefile.
ˆ Ver apuntes adjuntos
En alg´un archivo ya incluido en los fuentes del Kernel...
asmlinkage int sys newcall(int a)
printk(¸calling newcall... ”);
return a+1;
ˆ ¿printk?, ¿porque no printf?
System Calls en GNU Linux(Cont...)
ˆ Recompilar el Kernel!
ˆ Idem Pr´actica 2
Invocando expl´ıcitamente nuestra System Call
#include <linux/unistd.h>
#include <stdio.h>
#define sys_newcall 351
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 ´util -f (tiene en cuenta procesos hijos)
strace a.out (hola mundo)
execve(”./a.out”, [”./a.out”], [/* 62 vars */]) = 0
brk(0) = 0x1295000
access(/etc/ld.so.nohwcap”, F OK) = -1 ENOENT (No such file
or directory)
mmap(NULL, 8192, PROT READ—PROT WRITE,
MAP PRIVATE—MAP ANONYMOUS, -1, 0) = 0x7f3b70b43000
access(/etc/ld.so.preload”, R OK) = -1 ENOENT (No such file or
directory)
Agenda
1 Kernel
2 System Calls
3 M´odulos
¿Que son los M´odulos del Kernel?
ˆ “Pedazos de c´odigo” que pueden ser cargados y descargados
bajo demanda
ˆ Extienden la funcionalidad del kernel
ˆ Sin ellos el kernel ser´ıa 100
ˆ Monol´ıtico ”hibrido”
ˆ No recompilar ni rebootear
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 informaci´on de
/etc/modules.conf para cargar el m´odulo especificado.
¿Como creamos un m´odulo?
ˆ Debemos proveer dos funciones:
ˆ Inicializaci´on: Ejecutada cuando ejecutamos insmod.
ˆ Descarga: Ejecutada cuando ejecutamos rmmod.
#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");
}
¿Como creamos un m´odulo?(cont.)
ˆ Tambi´en podemos indicarle otras funciones.
ˆ module init
ˆ module exit
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int hello_2_init(void){
printk(KERN_INFO "Hello, world 2n");
return 0;}
static void hello_2_exit(void){
printk(KERN_INFO "Goodbye, world 2n");}
module_init(hello_2_init);
module_exit(hello_2_exit);
¿Como compilamos un m´odulo?
ˆ Construimos el Makefile
obj−m += h e l l o . o
a l l :
make −C / l i b / modules /$ ( s h e l l uname −r ) / b u i l d M=$ (pwd)
modules
clean :
make −C / l i b / modules /$ ( s h e l l uname −r ) / b u i l d M=$ (pwd)
clean
ˆ Compilamos make
make −C <KERNEL CODE> M=$ (pwd) modules
¿Que son los Dispositivos?
ˆ Entendemos por dispositivo a cualquier dispositivo de hard:
discos, memoria, mouse, etc
ˆ Cada operaci´on sobre un dispositivo es llevada por c´odigo
espec´ıfico para el dispositivo
ˆ Este c´odigo se denomina “driver” y se implementa como un
m´odulo
ˆ 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
(espacio del kernel).
ˆ read, write: escribir y recuperar bulk data
ˆ ioctl: configurar el dispositivo
¿Que son los Dispositivos?(Cont)
ˆ Podemos clasificar el hard en varios tipos.
ˆ Dispositivos de acceso aleatorio(ej. discos).
ˆ Dispositivos seriales(ej. Mouse, sonido,etc).
ˆ Acorde a esto los drivers se clasifican en:
ˆ Drivers de bloques: son un grupo de bloques de datos
persistentes. Leemos y escribimos de a bloques, generalmente
de 1024 bytes.
ˆ Drivers de car´acter: Se accede de a 1 byte a la vez y 1 byte
s´olo puede ser le´ıdo por ´unica vez.
ˆ Drivers de red: tarjetas ethernet, WIFI, etc.
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]
brw−rw−−−− 1 root d i s k 3 , 1 Abr 9 15:24 /dev/hda1
brw−rw−−−− 1 root d i s k 3 , 2 Abr 9 15:24 /dev/hda2
brw−rw−−−− 1 root d i s k 3 , 3 Abr 9 15:24 /dev/hda3
Archivos de dispositivos en UNIX
ˆ Representaci´on de los dispositivos(device files)
ˆ Por convenci´on est´an en el /dev
ˆ Se crean mediante el comando mknod.
mknod[− m<mode >] f i l e [ b | c ] major 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
ˆ Necesitamos decirle al kernel:
ˆ Que hacer cuando se escribe al device file.
ˆ Que hacer cuando se lee desde el device file..
ˆ Todo esto lo hacemos en un m´odulo.
ˆ La struct file operations:
ˆ Sirve para decirle al kernel como leer y/o escribir al dispositivo.
ˆ Cada variable posee un puntero a las funciones que
implementan las operaciones sobre el dispositivo.
¿Como creamos un driver?
ˆ Mediante la struct file operations especifico que funciones
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.
register_chrdev(major_number, "myDriver", &
my_driver_fops);
ˆ En la funci´on module exit desregistro mi driver.
unregister_chrdev(major_number, "myDriver");
¿Como creamos un driver?(Cont..)
ˆ Operaciones sobre el dispositivo
ˆ Escritura del archivo de dispositivo (Ej. echo ”hi))
/dev/myDeviceFile)
ssize_t myDriver_write(struct file *filp, char
*buf,size_t count, loff_t *f_pos);
ˆ Lectura del archivo de dispositivo (Ej. cat /dev/myDeviceFile)
ssize_t myDriver_read(struct file *filp, char
*buf,size_t count, loff_t *f_pos)
¿Como creamos un driver?(Cont...)
ˆ Par´ametros de las funciones funciones:
ˆ Struct file: Estructura del kernel que representa un archivo
abierto.
ˆ char *buf: El dato a le´ıdo 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?

Mais conteúdo relacionado

Mais procurados

Linux basico-2.PDF
Linux basico-2.PDFLinux basico-2.PDF
Linux basico-2.PDF
ULEAM
 
40 configuración del kernel y dispositivos
40  configuración del kernel y dispositivos40  configuración del kernel y dispositivos
40 configuración del kernel y dispositivos
Aprende Viendo
 
Administración de procesos en ubuntu
Administración de procesos en ubuntuAdministración de procesos en ubuntu
Administración de procesos en ubuntu
luis guti
 
Linux basico-6.PDF
Linux basico-6.PDFLinux basico-6.PDF
Linux basico-6.PDF
ULEAM
 
28 el directorio sysconfig
28  el directorio sysconfig28  el directorio sysconfig
28 el directorio sysconfig
Aprende Viendo
 
Curso de software03
Curso de software03Curso de software03
Curso de software03
enriqueaco
 
Practica de procesos en Linux
Practica de procesos en LinuxPractica de procesos en Linux
Practica de procesos en Linux
Terrafx9
 
Niveles de ejecución en unix
Niveles de ejecución en  unixNiveles de ejecución en  unix
Niveles de ejecución en unix
Moises
 

Mais procurados (19)

Linux basico-2.PDF
Linux basico-2.PDFLinux basico-2.PDF
Linux basico-2.PDF
 
40 configuración del kernel y dispositivos
40  configuración del kernel y dispositivos40  configuración del kernel y dispositivos
40 configuración del kernel y dispositivos
 
Administración de procesos en ubuntu
Administración de procesos en ubuntuAdministración de procesos en ubuntu
Administración de procesos en ubuntu
 
Linux basico-6.PDF
Linux basico-6.PDFLinux basico-6.PDF
Linux basico-6.PDF
 
Administración de linux tema 2
Administración de linux tema 2Administración de linux tema 2
Administración de linux tema 2
 
28 el directorio sysconfig
28  el directorio sysconfig28  el directorio sysconfig
28 el directorio sysconfig
 
Curso de software03
Curso de software03Curso de software03
Curso de software03
 
Practica de procesos en Linux
Practica de procesos en LinuxPractica de procesos en Linux
Practica de procesos en Linux
 
Unix 3.1
Unix 3.1Unix 3.1
Unix 3.1
 
Desarrollo de rootkits en Linux [GuadalajaraCON 2013]
Desarrollo de rootkits en Linux [GuadalajaraCON 2013]Desarrollo de rootkits en Linux [GuadalajaraCON 2013]
Desarrollo de rootkits en Linux [GuadalajaraCON 2013]
 
Construyendo rootkits basicos
Construyendo rootkits basicosConstruyendo rootkits basicos
Construyendo rootkits basicos
 
AIX Administration Knowledge Share
AIX Administration Knowledge ShareAIX Administration Knowledge Share
AIX Administration Knowledge Share
 
Clasificación dos sistemas operativos
 Clasificación dos sistemas operativos Clasificación dos sistemas operativos
Clasificación dos sistemas operativos
 
Administracion basica redes linux
Administracion basica redes linuxAdministracion basica redes linux
Administracion basica redes linux
 
Programaciongnulinux
ProgramaciongnulinuxProgramaciongnulinux
Programaciongnulinux
 
Presentación1
Presentación1Presentación1
Presentación1
 
Tema3 procesos
Tema3 procesos Tema3 procesos
Tema3 procesos
 
Niveles de ejecución en unix
Niveles de ejecución en  unixNiveles de ejecución en  unix
Niveles de ejecución en unix
 
Administración de llaves SSH para aplicaciones
Administración de llaves SSH para aplicacionesAdministración de llaves SSH para aplicaciones
Administración de llaves SSH para aplicaciones
 

Destaque

Windows Y Mach
Windows Y MachWindows Y Mach
Windows Y Mach
sistemasop
 
Rudimental waiting all night
Rudimental waiting all nightRudimental waiting all night
Rudimental waiting all night
haverstockmedia
 
Carmelo cruz mendoza inicia la nueva administración
Carmelo cruz mendoza inicia la nueva administraciónCarmelo cruz mendoza inicia la nueva administración
Carmelo cruz mendoza inicia la nueva administración
megaradioexpress
 
How does Diaspora Mobilization Become a Causal Feature of Structural Change
How does Diaspora Mobilization Become a Causal Feature of Structural ChangeHow does Diaspora Mobilization Become a Causal Feature of Structural Change
How does Diaspora Mobilization Become a Causal Feature of Structural Change
Myung Ja Kim
 

Destaque (20)

Permisos en Linux
Permisos en LinuxPermisos en Linux
Permisos en Linux
 
Editor de archivos de texto vi
Editor de archivos de texto viEditor de archivos de texto vi
Editor de archivos de texto vi
 
Windows Y Mach
Windows Y MachWindows Y Mach
Windows Y Mach
 
Redirecciones y pipes - Date - Cal
Redirecciones y pipes - Date - CalRedirecciones y pipes - Date - Cal
Redirecciones y pipes - Date - Cal
 
Ejercicios planificacion 1 y 2
Ejercicios planificacion 1 y 2Ejercicios planificacion 1 y 2
Ejercicios planificacion 1 y 2
 
Planificación linux
Planificación linuxPlanificación linux
Planificación linux
 
Proyecto 2016 - ITS - SISTEMAS OPERATIVOS II
Proyecto 2016 - ITS - SISTEMAS OPERATIVOS IIProyecto 2016 - ITS - SISTEMAS OPERATIVOS II
Proyecto 2016 - ITS - SISTEMAS OPERATIVOS II
 
Rudimental waiting all night
Rudimental waiting all nightRudimental waiting all night
Rudimental waiting all night
 
Is it possible to transform healthcare (leaders)?
Is it possible to transform healthcare (leaders)?Is it possible to transform healthcare (leaders)?
Is it possible to transform healthcare (leaders)?
 
Carmelo cruz mendoza inicia la nueva administración
Carmelo cruz mendoza inicia la nueva administraciónCarmelo cruz mendoza inicia la nueva administración
Carmelo cruz mendoza inicia la nueva administración
 
Sant jordi
Sant jordiSant jordi
Sant jordi
 
2015 and Q4 2015 Financial Results
2015 and Q4 2015 Financial Results2015 and Q4 2015 Financial Results
2015 and Q4 2015 Financial Results
 
Porur Times epaper, July.24,2016
Porur Times epaper, July.24,2016Porur Times epaper, July.24,2016
Porur Times epaper, July.24,2016
 
Lineales boyaca
Lineales boyacaLineales boyaca
Lineales boyaca
 
How to Build and Manage a Thriving Facebook Community
How to Build and Manage a Thriving Facebook CommunityHow to Build and Manage a Thriving Facebook Community
How to Build and Manage a Thriving Facebook Community
 
Aca implementation in pa summer 13
Aca implementation in pa summer 13Aca implementation in pa summer 13
Aca implementation in pa summer 13
 
Tata Cara Registrasi ~ Modamodis.com
Tata Cara Registrasi ~ Modamodis.comTata Cara Registrasi ~ Modamodis.com
Tata Cara Registrasi ~ Modamodis.com
 
How does Diaspora Mobilization Become a Causal Feature of Structural Change
How does Diaspora Mobilization Become a Causal Feature of Structural ChangeHow does Diaspora Mobilization Become a Causal Feature of Structural Change
How does Diaspora Mobilization Become a Causal Feature of Structural Change
 
Ol
OlOl
Ol
 
Dectron Support for Your LEED Projects
Dectron Support for Your LEED ProjectsDectron Support for Your LEED Projects
Dectron Support for Your LEED Projects
 

Semelhante a Linux Kernel - System Calls - Modules - Drivers (20)

Notas de sistemas operativos/Saade Sergio
Notas de sistemas operativos/Saade SergioNotas de sistemas operativos/Saade Sergio
Notas de sistemas operativos/Saade Sergio
 
Configuacion de estaciones de trabajo
Configuacion de estaciones de trabajoConfiguacion de estaciones de trabajo
Configuacion de estaciones de trabajo
 
Javier aponte
Javier aponteJavier aponte
Javier aponte
 
arquitectura-de-linux
arquitectura-de-linuxarquitectura-de-linux
arquitectura-de-linux
 
Shirley
ShirleyShirley
Shirley
 
Gnu linux programacion-de-sistemas
Gnu linux programacion-de-sistemasGnu linux programacion-de-sistemas
Gnu linux programacion-de-sistemas
 
Sistemas operativos
Sistemas operativosSistemas operativos
Sistemas operativos
 
Tarea 3_individual_Nelis Rivero
Tarea 3_individual_Nelis RiveroTarea 3_individual_Nelis Rivero
Tarea 3_individual_Nelis Rivero
 
Programaciongnulinux
ProgramaciongnulinuxProgramaciongnulinux
Programaciongnulinux
 
Un sistema operativo
Un sistema operativoUn sistema operativo
Un sistema operativo
 
Practica4
Practica4Practica4
Practica4
 
Sistemas operativos hector
Sistemas operativos hectorSistemas operativos hector
Sistemas operativos hector
 
Estructura de los sistemas operativos
Estructura de los sistemas operativosEstructura de los sistemas operativos
Estructura de los sistemas operativos
 
Fredy cardenas
Fredy cardenasFredy cardenas
Fredy cardenas
 
Fredy cardenas
Fredy cardenasFredy cardenas
Fredy cardenas
 
sistemas operativos
sistemas operativossistemas operativos
sistemas operativos
 
Sistemas operativos
Sistemas operativosSistemas operativos
Sistemas operativos
 
Estructura de un sistema operativo
Estructura de un sistema operativoEstructura de un sistema operativo
Estructura de un sistema operativo
 
Taller de sistemas bryan melo
Taller de sistemas bryan meloTaller de sistemas bryan melo
Taller de sistemas bryan melo
 
Sistemas operativos
Sistemas operativosSistemas operativos
Sistemas operativos
 

Último

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Último (10)

EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 

Linux Kernel - System Calls - Modules - Drivers

  • 1. kernel II - System Calls y M´odulos Explicaci´on de pr´actica 3 Sistemas Operativos Facultad de Inform´atica Universidad Nacional de La Plata 2015
  • 2. Agenda 1 Kernel 2 System Calls 3 M´odulos
  • 3. Agenda 1 Kernel 2 System Calls 3 M´odulos
  • 4. Kernel de GNU Linux ˆ 2,4 millones de lineas de c´odigo(y contando...) ˆ El 70 % del c´odigo son drivers ˆ Windows: mas del doble de lineas! ˆ Tasa de errores en drivers con respecto al Kernel: 7 veces mas ˆ Fuente:http://pdos.csail.mit.edu/6.097/readings/osbugs.pdf ˆ Comparaci´on con la aerona´utica: ˆ Aislamiento de fallas ˆ Un problema en el toilet no afecta al sistema de navegaci´on!
  • 5. Kernel Monol´ıtico - Mismo proceso ˆ Todos los componentes del kernel linkeados en un mismo binario en memoria. ˆ Memoria Compartida(sincronizaci´on!) ˆ Scheduler, Drivers, Memory Manager,etc en un mismo proceso
  • 6. Kernel Monol´ıtico - Operating System Crash ˆ ¿Que sucede si hay un error en un driver? ˆ Windows: BSD(blue screen of death). ˆ Unix: Kernel Panic. ˆ Un ´unico gran componente linkeado en un mismo espacio de direcciones implica un m´odulo muy grande y complejo. ˆ La raz´on de tener un ´unico gran componente linkeado en un mismo espacio de direcciones se debe a cuestiones de performance por limitaciones de hardware tomadas hace mucho tiempo. ˆ ¿Hoy en dia la decisi´on seria la misma?
  • 7. Microkernel - Procesos de usuario ˆ Componentes del kernel en distintos procesos de USUARIO ˆ Kernel minimalista(comunicaci´on con el hard e IPC) ˆ IPC (Computaci´on distribuida!) ˆ Scheduler, Drivers, Memory Manager en distintos procesos de Usuario ˆ IPC es parte del Kernel(muchos cambios de modo)
  • 8. 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 f´acil 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)
  • 9. Tanembaum – Torvalds debate vs http://en.wikipedia.org/wiki/Tanenbaum
  • 10. Agenda 1 Kernel 2 System Calls 3 M´odulos
  • 11. API del Sistema Operativo ˆ Los SOs proveen un conjunto de interfaces mediante las cuales un proceso que corre en espacio de usuario accede a un conjunto de funciones comunes ˆ En UNIX el API principal que provee estos servicios es libc: ˆ Es el API principal del SO ˆ Provee las librer´ıas estandar de C ˆ Es una Interface entre aplicaciones de usuario y las System Calls(System Call Wrappers).
  • 12. 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 con una System Call
  • 13. System Calls - Repaso ˆ Son llamados al kernel para ejecutar una funci´on espec´ıfica que controla un dispositivo o ejecuta una instrucci´on privilegiada ˆ Su pr´oposito es proveer una interfaz com´un para lograr portabilidad ˆ Su funcionalidad la ejecuta el Kernel ˆ Recordar ˆ Cambio de Modo ˆ ¿Como se pasa de modo usuario a modo Kernel?
  • 14. Invocando System Calls ˆ Utilizando los wrappers de glibc ˆ int rc = chmod( /etc/passwd", 0444); ˆ Invocaci´on expl´ıcita utilizando la System Call syscall provista por glibc ˆ Definida en la libreria unistd.h ˆ long int syscall (long int sysno, ...) ˆ Ejemplo utilizando syscall: ˆ rc = syscall(SYS chmod, /etc/passwd", 0444);
  • 15. 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); }
  • 16. Interrupciones y System Calls ˆ La manera en que una system call es llevada a cabo depender´a del procesador. ˆ Los procesadores x86 se basan en el 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 librer´ıa de espacio de usuario(libc) carga el ´ındice de la system call y sus argumentos, la interrupci´on enmascarable por software 0x80 es invocada, la cual resulta en el cambio de modo. ˆ La estructura sys call table y el registro eax como ´ındice se determina que funci´on invocar.
  • 17. System Calls e Interrupciones Consideremos el siguiente caso: #include <syscall.h> #include <unistd.h> #include <stdio.h> #include <sys/types.h> #define sys_getpid 20 int main(void) { long ID = syscall(SYS_getpid); printf ("El pId del proceso es:n", ID); }
  • 18. System Calls e Interrupciones(cont.) El compilador generar´a: _setuid: subl $4, %exp pushl %ebx movzwl 12( %esp), %eax movl %eax,4( %esp) movl $20, %eax movl 4( %esp), %ebx int $0x80 movl %eax, %edx testl %edx, %edx jge L2 negl %edx movl %edx,_errno movl $-1, %eax popl %ebx addl $4, %esp
  • 19. System Calls en GNU Linux ˆ Debemos declarar nuestra syscall por un n´umero ´unico(syscall number). ˆ Aggregamos una entrada a la syscall table. ˆ Debemos considerar el sys call number. ˆ Ver que el c´odigo fuente organizado por arquitectura. ˆ Respetar las convenciones del Kernel(ej. prefijo sys ). /usr/src/linux-3.8/arch/x86/syscalls/syscall 32.tbl 343 i386 clock adjtime sys clock adjtime 347 i386 process vm readv sys process vm readv 348 i386 process vm writev sys process vm writev 349 i386 kcmp sys kcmp 350 i386 finit module sys finit module 351 i386 newcall sys newcall
  • 20. System Calls en GNU Linux(Cont.) ˆ Debemos definir el prototipo de nuestra system call ˆ Los par´ametros a system calls deben ser realizados por medio del stack ˆ Informamos de esto al compilador mediante la macro asmlinkage ˆ asmlinkage instruye al compilador a pasar par´ametros por stack y no por ejemplo en registros /usr/src/linux-3.8/include/linux/syscalls.h asmlinkage long sys newcall(int i);
  • 21. System Calls en GNU Linux(Cont..) ˆ Debemos nuestra syscall en alg´un punto del ´arbol de fuentes. ˆ Podemos utilizar alg´un archivo existente. ˆ Podemos incluir un nuevo archivo y su correspondiente Makefile. ˆ Ver apuntes adjuntos En alg´un archivo ya incluido en los fuentes del Kernel... asmlinkage int sys newcall(int a) printk(¸calling newcall... ”); return a+1; ˆ ¿printk?, ¿porque no printf?
  • 22. System Calls en GNU Linux(Cont...) ˆ Recompilar el Kernel! ˆ Idem Pr´actica 2
  • 23. Invocando expl´ıcitamente nuestra System Call #include <linux/unistd.h> #include <stdio.h> #define sys_newcall 351 int main(void) { int i = syscall(sys_newcall,1); printf ("El resultado es:n", i); }
  • 24. Strace ˆ Reporta las system calls que realiza cualquier programa ˆ man strace ˆ Opci´on ´util -f (tiene en cuenta procesos hijos) strace a.out (hola mundo) execve(”./a.out”, [”./a.out”], [/* 62 vars */]) = 0 brk(0) = 0x1295000 access(/etc/ld.so.nohwcap”, F OK) = -1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT READ—PROT WRITE, MAP PRIVATE—MAP ANONYMOUS, -1, 0) = 0x7f3b70b43000 access(/etc/ld.so.preload”, R OK) = -1 ENOENT (No such file or directory)
  • 25. Agenda 1 Kernel 2 System Calls 3 M´odulos
  • 26. ¿Que son los M´odulos del Kernel? ˆ “Pedazos de c´odigo” que pueden ser cargados y descargados bajo demanda ˆ Extienden la funcionalidad del kernel ˆ Sin ellos el kernel ser´ıa 100 ˆ Monol´ıtico ”hibrido” ˆ No recompilar ni rebootear
  • 27. 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 informaci´on de /etc/modules.conf para cargar el m´odulo especificado.
  • 28. ¿Como creamos un m´odulo? ˆ Debemos proveer dos funciones: ˆ Inicializaci´on: Ejecutada cuando ejecutamos insmod. ˆ Descarga: Ejecutada cuando ejecutamos rmmod. #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"); }
  • 29. ¿Como creamos un m´odulo?(cont.) ˆ Tambi´en podemos indicarle otras funciones. ˆ module init ˆ module exit #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> static int hello_2_init(void){ printk(KERN_INFO "Hello, world 2n"); return 0;} static void hello_2_exit(void){ printk(KERN_INFO "Goodbye, world 2n");} module_init(hello_2_init); module_exit(hello_2_exit);
  • 30. ¿Como compilamos un m´odulo? ˆ Construimos el Makefile obj−m += h e l l o . o a l l : make −C / l i b / modules /$ ( s h e l l uname −r ) / b u i l d M=$ (pwd) modules clean : make −C / l i b / modules /$ ( s h e l l uname −r ) / b u i l d M=$ (pwd) clean ˆ Compilamos make make −C <KERNEL CODE> M=$ (pwd) modules
  • 31. ¿Que son los Dispositivos? ˆ Entendemos por dispositivo a cualquier dispositivo de hard: discos, memoria, mouse, etc ˆ Cada operaci´on sobre un dispositivo es llevada por c´odigo espec´ıfico para el dispositivo ˆ Este c´odigo se denomina “driver” y se implementa como un m´odulo ˆ 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 (espacio del kernel). ˆ read, write: escribir y recuperar bulk data ˆ ioctl: configurar el dispositivo
  • 32. ¿Que son los Dispositivos?(Cont) ˆ Podemos clasificar el hard en varios tipos. ˆ Dispositivos de acceso aleatorio(ej. discos). ˆ Dispositivos seriales(ej. Mouse, sonido,etc). ˆ Acorde a esto los drivers se clasifican en: ˆ Drivers de bloques: son un grupo de bloques de datos persistentes. Leemos y escribimos de a bloques, generalmente de 1024 bytes. ˆ Drivers de car´acter: Se accede de a 1 byte a la vez y 1 byte s´olo puede ser le´ıdo por ´unica vez. ˆ Drivers de red: tarjetas ethernet, WIFI, etc.
  • 33. 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] brw−rw−−−− 1 root d i s k 3 , 1 Abr 9 15:24 /dev/hda1 brw−rw−−−− 1 root d i s k 3 , 2 Abr 9 15:24 /dev/hda2 brw−rw−−−− 1 root d i s k 3 , 3 Abr 9 15:24 /dev/hda3
  • 34. Archivos de dispositivos en UNIX ˆ Representaci´on de los dispositivos(device files) ˆ Por convenci´on est´an en el /dev ˆ Se crean mediante el comando mknod. mknod[− m<mode >] f i l e [ b | c ] major 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
  • 35. Dispositivos en UNIX ˆ Necesitamos decirle al kernel: ˆ Que hacer cuando se escribe al device file. ˆ Que hacer cuando se lee desde el device file.. ˆ Todo esto lo hacemos en un m´odulo. ˆ La struct file operations: ˆ Sirve para decirle al kernel como leer y/o escribir al dispositivo. ˆ Cada variable posee un puntero a las funciones que implementan las operaciones sobre el dispositivo.
  • 36. ¿Como creamos un driver? ˆ Mediante la struct file operations especifico que funciones 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. register_chrdev(major_number, "myDriver", & my_driver_fops); ˆ En la funci´on module exit desregistro mi driver. unregister_chrdev(major_number, "myDriver");
  • 37. ¿Como creamos un driver?(Cont..) ˆ Operaciones sobre el dispositivo ˆ Escritura del archivo de dispositivo (Ej. echo ”hi)) /dev/myDeviceFile) ssize_t myDriver_write(struct file *filp, char *buf,size_t count, loff_t *f_pos); ˆ Lectura del archivo de dispositivo (Ej. cat /dev/myDeviceFile) ssize_t myDriver_read(struct file *filp, char *buf,size_t count, loff_t *f_pos)
  • 38. ¿Como creamos un driver?(Cont...) ˆ Par´ametros de las funciones funciones: ˆ Struct file: Estructura del kernel que representa un archivo abierto. ˆ char *buf: El dato a le´ıdo 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