2010-01-15 6 views
4

Je porte le module noyau Linux écrit pour Linux 2.4 pour fonctionner avec Linux 2.6. Certains appels système déclarés via les macros syscallN() et enveloppés dans des appels set_fs() ont été utilisés dans le code. Comment puis-je toujours utiliser sycalls sous Linux 2.6 où ces macros sont absentes?Comment appeler Linux syscall à partir de l'espace noyau?

Je sais que c'est un mauvais goût d'utiliser des syscalls à partir de l'espace noyau et les macros syscallN() sont cassées sur la plupart des plates-formes. N'importe quel moyen raisonnable pour remplacer getuid, geteuid, mknod, chown, unlink, sched_yield syscalls dans l'espace de noyau est apprécié.

Répondre

3

current->uid et current->euid peuvent se substituer aux deux premiers.

schedule() devrait fonctionner pour le dernier.

Les opérations du système de fichiers semblent plus compliquées: vous pouvez essayer de voir si sys_chown(), sys_mknod() et sys_unlink() sont exportés (disponible pour tout module). Si ça marche, génial. Il y a quelques useful tips here. Sinon, vous devez creuser un peu plus loin:

Le syscall chown est défini dans fs/open.c. En un coup d'oeil, je ne vois pas pourquoi vous ne pourriez pas copier ce code dans votre propre fonction "kernel_chown" et essayer. Les appels système mknodat et unlink sont dans fs/namei.c; ils finiront par appeler vfs_mknod() et vfs_unlink(), respectivement. Peut-être que vous pouvez dupliquer ce code ou comprendre comment c'est fait à partir de là.

+0

current-> uid et current-> euid ne sont plus disponibles en 2.6. – Basilevs

+3

Il était présent dans les premiers noyaux 2.6, mais on dirait qu'il a été remplacé par la macro 'current_uid()' dans 2.6.27. Voir 'include/linux/cred.h'. –

Questions connexes