Assembly no Linux/BIOS e suas rotinas

Origem: Wikilivros, livros abertos por um mundo aberto.

Com esta explicação chegamos à conclusão que o Linux utiliza o máximo que pode deste processador, por ter sido desenvolvido primeiramente nele. É um sistema multitarefa, multiusuários, de 32 bits, que roda em "Modo Protegido".

Um dos primeiros paralelos que farei com os DOS, é uma explicação sobre a BIOS. Obviamente, o software que roda nas BIOS de hoje em dia é bem mais elaborado que há alguns anos, mesmo porque o hardware exige isso, mas (outra limitação ligada a manter compatibilidade) a interface exposta para os programas ainda é a mesma. Mas estas interfaces não foram pensadas para um sistema multitarefa como o Linux, teríamos um problema com um fenômeno chamado reentrância. As rotinas não prevêem que mais de um processo pode tentar acessar o mesmo recuso e, portanto, não implementam travas para isso. Para ilustrar, um pequeno exemplo em C.

int Func [void] {
static char busy=0; /*criada uma variavel static e inicializada com 0,
 um flag para sinalizar o uso de um recurso*/
if [!busy] { /*não esta em uso*/
init_stuff [] ; // inicializada
busy=1; // seta flag
} else {
fprintf [stderr," Recurso ocupado\n"]
return ERRO;
}
}

Grosso modo, esta pequena função quando executada, checa se o flag busy é 0, se for significa que o recurso está livre, portanto é inicializado, flag setado para 1 e se procede o resto da função enquanto este flag for 1 e se procede o resto da função. Enquanto este flag for 1, nenhum outro processo pode acessá-las. Claro, existem as chamadas race-conditions, mas este trecho tem a intenção de demonstrar um modo de checar o uso de um recurso em um ambiente multitarefa, que pode se tornar facilmente caótico do ponto de vista do programador. Imagine o acesso a um dispositivo como um HD, neste modo. Além disso, tem a questão de performance também, rotinas de 16 bits presentes na BIOS não apresentam a performance das rotinas usadas no kernel do Linux em 32 bits.

Isto finaliza a explicação de uma das dúvidas que tenho encontrado, que é: por que não posso usar X função da BIOS? Em primeiro lugar, porque você está em 32 bits e esta função provavelmente está escrita para o modo que usa 16 bits. em segundo, porque ela não é reentrante, portanto as chamadas para a BIOS ficam desabilitadas no Linux, que usa sua própria implementação de muitas das funções presentes lá, tais como gerenciamento do barramento PCI e clock do sistema. Portanto sempre que possível, utilize o equivalente do Linux.