Para modelar o funcionamento de um computader de programa armazenado, podemos usar o QEMU para emular uma plataforma de hardware x86 e modificar o kernel Linux para incluir tratamento de interrupções de clock. O processo envolve configurar o ambiente, obter o código-fonte do kernel, implementar módulos personalizados e executar o sistema.
Configuração do Ambiente com QEMU
Instale o sistema QEMU para virtualização de x86:
sudo apt-get install qemu-system-x86
Obtanção do Código-Fonte do Kernel Linux
Baixe e extraia a versão 3.9.4 do kernel Linux:
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4.tar.xz
xz -d linux-3.9.4.tar.xz
tar -xvf linux-3.9.4.tar
cd linux-3.9.4
Implementação de Módulos Personalizados no Kernel
Crie um diretório para o módulo customizado e modifique os arquivos relevantes do kernel.
Crie o diretório custom_kernel dentro do código-fonte do kernel:
mkdir custom_kernel
Modifique include/linux/timer.h para declarar a rotina de tratamento de interrupção:
// Na linha 254 de timer.h
extern void handle_clock_interrupt(void);
Atualize arch/x86/kernel/time.c para integrar a rotina personalizada:
// Em time.c, na linha 16
#include <linux/timer.h>
// Dentro da função timer_interrupt(), na linha 61
handle_clock_interrupt();
// Em setup_default_timer_irq(), na linha 73
printk(KERN_NOTICE "Interrupção de clock configurada\n");
Modifique include/linux/start_kernel.h para adicionar a declaração da função de inicialização customizada:
// Na linha 11 de start_kernel.h
extern void __init kernel_main_loop(void);
Altere init/main.c para chamar a função personalizada dentro de start_kernel():
// Na linha 643 de main.c (no contexto de start_kernel)
kernel_main_loop();
Atualize o Makefile principal para incluir o diretório customizado na compilação:
# Na linha 736 do Makefile
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ custom_kernel/
Crie um Makefile dentro de custom_kernel:
obj-y = kernel_init.o clock_handler.o
Implemente a rotina de tratamento de interrupção no arquivo clock_handler.c:
#include <linux/kernel_stat.h>
// Outros includes necessários ...
void handle_clock_interrupt(void) {
printk(KERN_NOTICE "\n>>>>>>>>>>> Rotina de interrupção de clock executada <<<<<<<<<<<<<\n\n");
}
Desenvolva a função de inicialização personalizada no arquivo kernel_init.c:
#include <linux/types.h>
// Outros includes necessários ...
void __init kernel_main_loop(void) {
int iteration = 0;
while(1) {
iteration++;
if(iteration % 100000 == 0)
printk(KERN_NOTICE "Kernel customizado ativo, iteração: %d\n", iteration);
}
}
Compilação e Execução do Kernel Customizado
Compile o kernel com configuração mínima e execute-o no QEMU:
make allnoconfig
make
qemu-system-i386 -kernel arch/x86/boot/bzImage
Se ocorrer erros de compilação relacionados ao compilador, como no such file compiler-gcc11.h, renomeie o arquivo existente para resolver:
mv include/linux/compiler-gcc3.h include/linux/compiler-gcc11.h
No kernel Linux, a execução começa pela função start_kernel() em init/main.c. Quando o kernel é executado no QEMU, a função kernel_main_loop() é chamada continuamente, simulando o ciclo de instruções de um computador de programa armazenado, enquanto interrupções de clock periódicas acionam handle_clock_interrupt(), demonstrando o mecanismo de interrupção.