J'ai trouvé la réponse suivante ici :
La réponse courte est que le fichier .ko est votre fichier objet lié à certaines structures de données générées automatiquement par le noyau dont le noyau a besoin.
Le fichier .o est le fichier objet de vos modules - le résultat de la compilation de vos fichiers c. Le système de construction du noyau crée ensuite automatiquement un autre fichier C avec des structures de données décrivant le module du noyau (nommé your_module_kmod.c), compile ce fichier C dans un autre fichier objet et relie votre fichier objet et le fichier objet qu'il a construit ensemble pour créer le .ko fichier.
L'éditeur de liens dynamique dans le noyau qui est chargé de charger les modules du noyau, s'attend à trouver la structure de données que le noyau a placée dans l'objet kmod dans le fichier .ko et ne pourra pas charger votre module du noyau sans eux.
Également de cette source , citant tldp : jusqu'à la version 2.4 du noyau, c'était ".o", et depuis 2.6, c'est ".ko".