Je souhaite apprendre la programmation du noyau Linux.Programmation du noyau d'apprentissage
Quels seraient les points de départ pour cela? Quels pourraient être quelques-uns des problèmes les plus simples à cibler?
merci d'avance
Je souhaite apprendre la programmation du noyau Linux.Programmation du noyau d'apprentissage
Quels seraient les points de départ pour cela? Quels pourraient être quelques-uns des problèmes les plus simples à cibler?
merci d'avance
Essayez de mettre la main sur le livre de Robert Love sur le noyau Linux Programmation. C'est très concis et facile à suivre. Après cela ou avec cela, vous pouvez jeter un oeil à "Comprendre le noyau Linux" .Mais je ne le recommanderais pas au cours des premières étapes. En outre, regardez le Linux kernel programming guide. Puisque beaucoup de choses peuvent être apprises à partir des modules du noyau de programmation, ce guide vous aidera. Et oui, pour beaucoup d'informations, consultez le sous-répertoire 'documentation' de l'archive tar des sources du noyau.
Je devrais dire: "apprendre C". :)
Essayez ce livre en ligne gratuit.
Linux Kernel Module Guide de programmation http://www.linuxhq.com/guides/LKMPG/mpg.html
Découvrez The Linux Kernel Janitor Project
'' Nous traversons le code source du noyau Linux, faire des revues de code, en fixant le code et faire d'autres unmaintained opérations de nettoyage et les conversions API. C'est un bon début pour le piratage du noyau. ''
+1 lien impressionnant –
Pour ceux qui souhaitent en savoir plus sur le projet Linux Kitorel Janitor, j'ai rédigé ma thèse de master analysant leur travail. Ce rapport est maintenant publié sous forme de livre, ISBN 978-3-639-20637-1. http://www.bookfinder.com/search/?isbn=3639206371&submit=Begin+search&mode=isbn&st=sr&ac=qr – hlovdal
Vérifiez kernelnewbies.org, abonnez-vous à la liste de diffusion Kernelnewbies, obtenu à irc.oftc.org #kernelnewbies
Après livres que je lis et trouvé très utile:
Quelques ressources:
**TODO** +editPic: Linux Kernel Developer -> (Ring Layer 0)
+addSection: Kernel Virtualization Engine
KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.
Livres Recommandé pour les initialisées
void *i
« Les hommes ne comprendre les livres jusqu'à ce qu'ils aient une certaine quantité de vie, ou en tout cas, aucun homme ne comprend un livre profond, jusqu'à comme vu et vécu au moins une partie de son contenu ". -Ezra Pound
Un voyage de mille le code-miles doit commencer par une seule étape. Si vous êtes dans la confusion sur lequel des livres suivants pour commencer, ne vous inquiétez pas, choisissez celui de votre choix. Tous ceux qui errent ne sont pas perdus. Comme toutes les routes se connectent finalement à l'autoroute, vous explorerez de nouvelles choses dans votre voyage du noyau que les pages progressent sans rencontrer d'impasses, et finalement se connecter au code-set
. Lisez avec un esprit alerte et rappelez-vous: Le code n'est pas la littérature. Ce qui reste n'est ni une chose, ni une émotion, ni une image, ni une image mentale, ni un souvenir, ni même une idée. C'est une fonction. Un processus de quelque sorte. Un aspect de la vie qui pourrait être décrit comme une fonction de quelque chose de «plus grand». Et par conséquent, il semble que ce n'est pas vraiment "séparé" de ce quelque chose d'autre. Comme la fonction d'un couteau - couper quelque chose - n'est pas, en fait, séparé du couteau lui-même. La fonction peut ou ne peut pas être utilisée pour l'instant, mais elle n'est potentiellement JAMAIS séparée.
Solovay Strassen Derandomized Algorithm for Primality Test:
Lire ne pas contredire et réfuter; ni croire et prendre pour acquis; ni pour trouver la conversation et le discours; mais peser et considérer. Certains livres doivent être goûtés, d'autres doivent être avalés, et quelques-uns à mâcher et à digérer, c'est-à-dire que certains livres ne doivent être lus qu'en partie, d'autres à lire, mais pas curieusement, et quelques-uns à lire entièrement. , et avec diligence et attention.
static void tasklet_hi_action(struct softirq_action *a)
{
struct tasklet_struct *list;
local_irq_disable();
list = __this_cpu_read(tasklet_hi_vec.head);
__this_cpu_write(tasklet_hi_vec.head, NULL);
__this_cpu_write(tasklet_hi_vec.tail, this_cpu_ptr(&tasklet_hi_vec.head));
local_irq_enable();
while (list) {
struct tasklet_struct *t = list;
list = list->next;
if (tasklet_trylock(t)) {
if (!atomic_read(&t->count)) {
if (!test_and_clear_bit(TASKLET_STATE_SCHED,
&t->state))
BUG();
t->func(t->data);
tasklet_unlock(t);
continue;
}
tasklet_unlock(t);
}
local_irq_disable();
t->next = NULL;
*__this_cpu_read(tasklet_hi_vec.tail) = t;
__this_cpu_write(tasklet_hi_vec.tail, &(t->next));
__raise_softirq_irqoff(HI_SOFTIRQ);
local_irq_enable();
}
}
noyau Linux (5 -> 1 -> 3 -> 2 -> 7 -> 4 -> 6)
« La nature n'a ni noyau ni coquille; elle est tout à la fois » - Johann Wolfgang von Goethe
lecteur doit être bien familiarisés avec operating system concepts; une bonne compréhension des processus de longue durée et de ses différences avec les processus avec de courtes périodes d'exécution; la tolérance aux pannes tout en répondant aux contraintes de temps réel, douces et dures. Pendant la lecture, il est important de comprendre et de choisir les choix de conception faits par la source du noyau Linux dans les sous-systèmes principaux. Threads [et] les signaux [sont] une traînée dépendant de la plateforme de la misère, du désespoir, de l'horreur et de la folie (~ Anthony Baxte). Cela étant dit, vous devriez être un expert C auto-évaluateur, avant de plonger dans le noyau. Vous devriez également avoir une bonne expérience avec les listes liées, les piles, les files d'attente, les arbres noirs de noir, les fonctions de hachage, et al. La beauté et l'art de la source Linux Kernel réside dans l'obscurcissement délibéré du code utilisé le long de. Ceci est souvent nécessaire pour transmettre la signification computationnelle impliquant deux ou plusieurs opérations d'une manière propre et élégante. Cela est particulièrement vrai lors de l'écriture de code pour l'architecture multicœur.
Video Lectures on Real-Time Systems, Task Scheduling, Memory Compression, Memory Barriers, SMP
#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
Linux Device Drivers (1 -> 2 -> 4 -> 3 -> 8 -> ...)
"La musique ne vous accompagne pas. Vous devez porter le long strictement par votre capacité à vraiment se concentrer uniquement sur ce petit petit noyau d'émotion ou une histoire. » - Debbie Harry
Votre tâche consiste essentiellement à établir une interface de communication à grande vitesse entre le matériel périphérique et le noyau logiciel Vous devriez lire la fiche de données de matériel/manuel pour comprendre le comportement de l'appareil et ses états de contrôle et de données et les canaux physiques fournis.Connaissance de l'Assemblée pour votre architecture particulière et une bonne connaissance de VLSI Description du matériel VHDL ou Verilog vous aidera à long terme
Q: Mais, pourquoi dois-je lire les spécifications matérielles?
A: Parce que, « Il y a un gouffre de carbone et de silicium le logiciel ne peut pas combler » - Rahul Sonnad
Cependant, ne pas ci-dessus pose un problème pour les algorithmes de calcul (Driver code - bottom-half processing), car il peut être entièrement simulé sur un Universal Turing Machine. Si le résultat calculé est vrai dans le mathematical domain, il est certain qu'il est également vrai dans le physical domain.
Video Lectures on Linux Device Drivers (Lec.17 & 18), Anatomy of an Embedded KMS Driver, Pin Control and GPIO Update, Common Clock Framework, Write a Real Linux Driver - Greg KH
static irqreturn_t phy_interrupt(int irq, void *phy_dat)
{
struct phy_device *phydev = phy_dat;
if (PHY_HALTED == phydev->state)
return IRQ_NONE; /* It can't be ours. */
/* The MDIO bus is not allowed to be written in interrupt
* context, so we need to disable the irq here. A work
* queue will write the PHY to disable and clear the
* interrupt, and then reenable the irq line.
*/
disable_irq_nosync(irq);
atomic_inc(&phydev->irq_disable);
queue_work(system_power_efficient_wq, &phydev->phy_queue);
return IRQ_HANDLED;
}
noyau en réseau (1 -> 2 -> 3 -> ...)
« appelez un clan, appelez un réseau, appelez une tribu, appelez une fa Mily: Tout ce que vous appelez, qui que vous soyez, vous en avez besoin « - Jane Howard
Comprendre un paquet de passage dans le noyau est une clé pour comprendre la mise en réseau du noyau.. Comprendre c'est un must si nous voulons comprendre les internes Netfilter ou IPSec, et plus encore. Les deux structures les plus importantes de la couche réseau du noyau Linux sont: struct sk_buff
et struct net_device
static inline int sk_hashed(const struct sock *sk)
{
return !sk_unhashed(sk);
}
de débogage du noyau (1 -> 4 -> 9 -> ...)
Sauf en communiquant avec elle on dit exactement ce qu'on veut dire, il y a forcément des problèmes. ~ Alan Turing, sur les ordinateurs
Brian W. Kernighan, dans le journal Unix pour les débutants (1979) a dit: « L'outil de débogage la plus efficace est la pensée toujours prudent, couplé avec des instructions d'impression judicieusement placés ». Savoir quoi collecter vous aidera à obtenir les bonnes données rapidement pour un diagnostic rapide. Le grand informaticien Edsger Dijkstra a dit un jour que les tests pouvaient démontrer la présence de bugs mais pas leur absence. De bonnes pratiques d'enquête devraient équilibrer le besoin de résoudre rapidement les problèmes, le besoin de développer vos compétences et l'utilisation efficace des experts en la matière.
Il ya des moments où vous frappez le fond, rien ne semble fonctionner et vous n'avez plus aucune option. C'est alors que le vrai débogage commence. Un bug peut fournir la pause dont vous avez besoin de se désengager d'une fixation sur la solution inefficace.
Video Lectures on Kernel Debug and Profiling, Core Dump Analysis, Multicore Debugging with GDB, Controlling Multi-Core Race Conditions, Debugging Electronics
/* Buggy Code -- Stack frame problem
* If you require information, do not free memory containing the information
*/
char *initialize() {
char string[80];
char* ptr = string;
return ptr;
}
int main() {
char *myval = initialize();
do_something_with(myval);
}
/* “When debugging, novices insert corrective code; experts remove defective code.”
* – Richard Pattis
#if DEBUG
printk("The above can be considered as Development and Review in Industrial Practises");
#endif
*/
systèmes de fichiers (1 -> 2 -> 6 -> ...
"Je voulais avoir de la mémoire virtuelle, au moins car elle est couplée à des systèmes de fichiers". - Ken Thompson
Sur un système UNIX, tout est un fichier; Si quelque chose n'est pas un fichier, c'est un processus, sauf pour les pipes et sockets nommés. Dans un système de fichiers, un fichier est représenté par un inode
, un type de numéro de série contenant des informations sur les données réelles qui composent le fichier. Le système de fichiers virtuels Linux VFS
met en cache les informations en mémoire de chaque système de fichiers lorsqu'il est monté et utilisé. Un grand soin doit être pris pour mettre à jour le système de fichiers correctement car les données dans ces caches sont modifiées au fur et à mesure que les fichiers et répertoires sont créés, écrits et supprimés. Le plus important de ces caches est le cache de mémoire tampon, qui est intégré dans la manière dont les systèmes de fichiers individuels accèdent à leurs périphériques de stockage de blocs sous-jacents.
Video Lectures on Storage Systems, Flash Friendly File System
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
struct open_flags op;
int fd = build_open_flags(flags, mode, &op);
struct filename *tmp;
if (fd)
return fd;
tmp = getname(filename);
if (IS_ERR(tmp))
return PTR_ERR(tmp);
fd = get_unused_fd_flags(flags);
if (fd >= 0) {
struct file *f = do_filp_open(dfd, tmp, &op);
if (IS_ERR(f)) {
put_unused_fd(fd);
fd = PTR_ERR(f);
} else {
fsnotify_open(f);
fd_install(fd, f);
}
}
putname(tmp);
return fd;
}
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
if (force_o_largefile())
flags |= O_LARGEFILE;
return do_sys_open(AT_FDCWD, filename, flags, mode);
}
sécurité (1 -> 2 -> 8 -> 4 -> 3 -> ...)
« UNIX n'a pas été conçu pour arrêter ses utilisateurs de faire des choses stupides, car cela les empêcherait de faire des choses intelligentes ". - Doug Gwyn
Aucune technique ne fonctionne si elle n'est pas utilisée. L'éthique change avec la technologie.
"F × S = k" le produit de la liberté et de la sécurité est une constante. - Les lois de Niven
La cryptographie constitue la base de la confiance en ligne. Le piratage exploite les contrôles de sécurité dans un élément technique, physique ou humain. Protéger le noyau des autres programmes en cours d'exécution est un premier pas vers un système sécurisé et stable, mais ce n'est évidemment pas suffisant: un certain degré de protection doit également exister entre les différentes applications utilisateur. Les exploits peuvent cibler des services locaux ou distants.
« Vous ne pouvez pas pirater votre destin, la force brute ... vous avez besoin d'une porte arrière, un canal latéral dans la vie. » - Clyde Dsouza
Les ordinateurs ne résolvent pas les problèmes, ils exécuter des solutions Derrière chaque non-deterministic le code algorithmique, il y a un esprit determined -../var/log/dmesg
Video Lectures on Cryptography and Network Security, Namespaces for Security, Protection Against Remote Attacks, Secure Embedded Linux
env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
noyau Source (0.11 -> 2.4 -> 2.6 -> 3,18)
« Comme le vin , la maîtrise de la programmation du noyau mûrit avec le temps. Mais, contrairement au vin, il devient plus doux dans le processus ». --Lawrence Mucheka
Vous ne pourriez pas penser que les programmeurs sont des artistes, mais la programmation est une profession extrêmement créatif. Il est la créativité basée sur la logique. L'enseignement des sciences de l'ordinateur ne peut pas Faire de quelqu'un un programmeur expert, pas plus que d'étudier les pinceaux et les pigments peuvent faire de quelqu'un un peintre expert Comme vous le savez déjà, il y a une différence entre connaître le chemin et marcher sur le chemin, il est primordial de retrousser ses manches. mains sales avec le code source du noyau Enfin, avec votre noyau ainsi gagné connaissance, partout où vous allez, vous allez briller.
Les codeurs immatures imitent; les codeurs matures volent; les mauvais codeurs défigurent ce qu'ils prennent, et les bons codeurs en font quelque chose de mieux, ou du moins quelque chose de différent. Le bon codeur soude son vol dans un sentiment unique, tout à fait différent de celui dont il était déchiré.
Video Lectures on Kernel Recipes
linux-0.11
├── boot
│ ├── bootsect.s head.s setup.s
├── fs
│ ├── bitmap.c block_dev.c buffer.c char_dev.c exec.c
│ ├── fcntl.c file_dev.c file_table.c inode.c ioctl.c
│ ├── namei.c open.c pipe.c read_write.c
│ ├── stat.c super.c truncate.c
├── include
│ ├── a.out.h const.h ctype.h errno.h fcntl.h
│ ├── signal.h stdarg.h stddef.h string.h termios.h
│ ├── time.h unistd.h utime.h
│ ├── asm
│ │ ├── io.h memory.h segment.h system.h
│ ├── linux
│ │ ├── config.h fdreg.h fs.h hdreg.h head.h
│ │ ├── kernel.h mm.h sched.h sys.h tty.h
│ ├── sys
│ │ ├── stat.h times.h types.h utsname.h wait.h
├── init
│ └── main.c
├── kernel
│ ├── asm.s exit.c fork.c mktime.c panic.c
│ ├── printk.c sched.c signal.c sys.c system_calls.s
│ ├── traps.c vsprintf.c
│ ├── blk_drv
│ │ ├── blk.h floppy.c hd.c ll_rw_blk.c ramdisk.c
│ ├── chr_drv
│ │ ├── console.c keyboard.S rs_io.s
│ │ ├── serial.c tty_io.c tty_ioctl.c
│ ├── math
│ │ ├── math_emulate.c
├── lib
│ ├── close.c ctype.c dup.c errno.c execve.c _exit.c
│ ├── malloc.c open.c setsid.c string.c wait.c write.c
├── Makefile
├── mm
│ ├── memory.c page.s
└── tools
└── build.c
Linux_source_dir/Documentation/*
Bon pour voir une réponse dépendante durable, complète et non liée à une question comme celle-ci. +1 –
J'espère être assez artistique pour comprendre la beauté de cette réponse un jour! – Hamzahfrq
@manav m-n: Pouvez-vous dire pourquoi vous publiez le test de primalité de Solovay-Strassen dans votre réponse. Je pense que vous voulez exprimer quelque chose, mais je n'ai pas compris. – user565739
Étape 1: le faire fonctionner sur une machine virtuelle: https://github.com/cirosantilli/runlinux –
Cela aide aussi http://linuxseekernel.blogspot.in/2015/08/linux-kernel-module -programming.html – Jeyaram