PDF de programación - Construyendo un kernel en linux

<<>>
Imágen de pdf Construyendo un kernel en linux

Construyendo un kernel en linuxgráfica de visualizaciones

Publicado el 10 de Agosto del 2018
365 visualizaciones desde el 10 de Agosto del 2018. Una media de 63 por semana
1,9 MB
14 paginas
Construyendo un kernel en
linux

Por qué recompilar el
kernel

n  Modificar el modelo predefinido

n  Cambiar la frecuencia del timer

n  Agregar un parche (patch)

n  Agregar System calls personalizadas

Agregar nfsgroups patch

n  Este parche permite “eliminar” la restricción del protocolo

NFS/RPC la cual permite a cada usuario sólo pertenecer a 16
grupos.

n  En Linux el límite es 32

Agregar el patch y construir el
nuevo conjunto de paquetes

n  Crea el directorio donde se generarán los paquetes del kernel
como usuario norma e instalar todos los paquetes necesarios

apt-get install fakeroot build-essential devscripts kernel-package!
apt-get build-dep linux !

n  Obtener los fuentes del paquete. Es necesario agregar los

repositorio deb-src en /etc/apt/sources.list



apt-get source linux!
cd linux-*!

n  También es posible obtener los fuentes del kernel

descargándolos directamente de https://lists.debian.org/
debian-kernel/

Agregar el patch y construir el
nuevo conjunto de paquetes

n  Obteren las fuentes del parche



cd linux-*!
svn export svn://svn.debian.org/svn/kernel/dists/
trunk/linux/debian!

Agregar el patch y construir el
nuevo conjunto de paquetes

n  Aplicar el patch. En el directorio de los fuentes

zcat patch46.gz | patch -p0 !

o bien



n 

patch –p0 < patch46 !

Opcional: si no es el primer intente de recompilar ejecutar

make –f debian/rules clean!

Agregar el patch y construir el
nuevo conjunto de paquetes

n  Verificar que los parches funcionan y resolver conflictos



make -f debian/rules source-all!

en el primer intento el objetivo falla, ejecutar dos veces

n  Configurar el kernel

make menuconfig #es necesario tener instalado ncurses-dev

!!

n  Compilar

fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_image!

Agregar el patch y construir el
nuevo conjunto de paquetes

n  Instalar su nuevo kernel

dpkg -i ../linux-image-3.16-subarchitecture_custom.1.0_i386.deb!

n  dpkg –i instala algunas paquetes adicionales y configura el

bootloader

n  Si se crearon modulos de paquetes adicionales también es

necesario instalarlos

n  Reiniciar el sistema

shutdown –r now!



Agregar un sysmtem call al
kernel

n  Recuerde como opera un system call

Agregar un sysmtem call al
kernel

n  Los id asociados con cada system call en muchas
distribuciones de Linux están listados en (x86 es la
arquitectura del ejemplo) :

Linux-3.x/arch/x86/include/asm/unistd_32|64.h!



n  Los lista de punteros asociados con cada system call

en muchas distribuciones de Linux están en:
linux-3.x/arch/x86/kernel/syscall_table_32|64.S!

Agregar un sysmtem call al
kernel

n  Ahora podemos agregar un sytem call al kernel. Se

utiliza el API de C.

#include <linux/linkage.h>!
#include <linux/kernel.h>!
!
asmlinkage int sys_helloworld(){!
printk(KERN_EMERG ’’hello world’);!
return 1;!
}!

n  Definir una nueva entrada en unistd.h para

__NR_helloworld e incrementar __NR_syscalls

#define __NR_helloworld 312!
!
#define __NR_syscalls 313!

Agregar un sysmtem call al
kernel

n  Incluir en el archivo syscall_table la linea

.long sys_helloworld!



n  Definir una nueva entrada en syscalls.h

asmlinkage long sys_helloworld(void);!

Agregar un sysmtem call al
kernel

n  Crear un directorio hello en el directorio raíz de los fuentes

n  En ese directorio crear el procedimento para le system

call.



#include <linux/linkage.h>!
#include <linux/kernel.h>!
!
asmlinkage int sys_helloworld(){!
printk(KERN_EMERG ’’hello world’);!
return 1;!
}!

n  Crear un Makefile en hello con el siguiente contenido:

obj-y: helloworld.o!

n  Agregar a core-y del Makefile principal el directorio hello

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ hello/!

Utilizar el system call

n  Después de reiniciar.



#include <linux/errno.h>!
#include <sys/syscall.h>!
#include<linux/unistd.h>!
!
#define __NR_helloworld 349!
!
long int helloworld(void){!
return syscall(__NR__helloworld);!
}!
Int main(){!
int output =helloworld();!
return 0;!
}!

n  La ejecución del programa agregará una entrada “hello

world” en /var/log/messages.log
  • Links de descarga
http://lwp-l.com/pdf12943  

Comentarios de: Construyendo un kernel en linux (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad

Revisar política de publicidad