Introdução
Na parte 1, vimos como o kernel Linux implementa a lista ligada genérica usando o container_of para criar uma lista ligada de arquivos. Nesta parte, exploraremos como o kernel implementa polimorfismo e herança em C, uma linguagem que não tem classes ou métodos virtuais.
A Interface de Arquivos
O kernel Linux implementa uma interface de arquivos que agrupa os ponteiros de função necessários para cada tipo de arquivo. Cada função recebe o próprio struct arquivo * como primeiro argumento, similar ao this em linguagens orientadas a objetos.
Implementando Classes de Arquivo
Arquivo em Memória
Implementamos uma classe de arquivo em memória que funciona exatamente como um arquivo comum, mas grava tudo em maiúsculas. O mem_escrever espera que a->privado aponte para uma struct memoria, o que permite que o memoria funcione sem alterações.
Arquivo em Disco
Implementamos um arquivo em disco que funciona exatamente como um arquivo em disco comum. O disk_read espera que a->privado aponte para um struct disco, o que permite que o disco funcione sem alterações.
O VFS (Virtual File System)
O VFS é uma camada de abstração que permite que o kernel Linux trate arquivos de diferentes tipos de maneira uniforme. As mesmas chamadas de função são feitas, mas os arquivos respondem de maneiras diferentes.
Polimorfismo e Herança
O VFS permite que os arquivos implementem métodos opcionais sem precisar reescrever tudo. Isso é possível porque o VFS trata NULL como