add task 12
This commit is contained in:
parent
aa602678c0
commit
d595cdf771
3 changed files with 138 additions and 0 deletions
15
README.md
15
README.md
|
@ -287,6 +287,21 @@ ls -l /sys/eudyptula/
|
||||||
`kobject`](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/samples/kobject)
|
`kobject`](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/samples/kobject)
|
||||||
* [Chapitre 14, Linux Device Drivers, 3rd Edition](https://lwn.net/Kernel/LDD3/)
|
* [Chapitre 14, Linux Device Drivers, 3rd Edition](https://lwn.net/Kernel/LDD3/)
|
||||||
|
|
||||||
|
### Tache 12
|
||||||
|
|
||||||
|
Il suffit de charger le menu et de lire les messages noyaux pour voir le bon
|
||||||
|
fonctionnement. J'ai repris le `main` donné dans l'ennoncé sans le modifier
|
||||||
|
plus que ça :
|
||||||
|
|
||||||
|
```
|
||||||
|
[1220142.976299] Coucou le gens !!!!
|
||||||
|
[1220142.976340] id 3 = Dave
|
||||||
|
[1220142.976346] id 42 not found
|
||||||
|
[1220148.124624] Tschuss !!!
|
||||||
|
```
|
||||||
|
|
||||||
|
* [Chapitre 11, Linux Device Drivers, 3rd Edition](https://lwn.net/Kernel/LDD3/)
|
||||||
|
|
||||||
## Informations diverses
|
## Informations diverses
|
||||||
|
|
||||||
Je liste dans cette section quelques informations que j'ai pu découvrir en
|
Je liste dans cette section quelques informations que j'ai pu découvrir en
|
||||||
|
|
9
task_12/Makefile
Normal file
9
task_12/Makefile
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
obj-m += list.o
|
||||||
|
|
||||||
|
PWD := $(CURDIR)
|
||||||
|
|
||||||
|
all:
|
||||||
|
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
|
||||||
|
|
||||||
|
clean:
|
||||||
|
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
|
114
task_12/list.c
Normal file
114
task_12/list.c
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/list.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
|
||||||
|
#define NAME_SIZE 20
|
||||||
|
|
||||||
|
struct identity {
|
||||||
|
struct list_head list;
|
||||||
|
char name[NAME_SIZE];
|
||||||
|
int id;
|
||||||
|
bool busy;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct list_head identity_list;
|
||||||
|
|
||||||
|
static int identity_create(char *name, int id)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
struct identity *new = kmalloc(sizeof(*new), GFP_KERNEL);
|
||||||
|
|
||||||
|
if (!new) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
} else {
|
||||||
|
ssize_t name_len = strlen(name) + 1;
|
||||||
|
|
||||||
|
if (name_len > NAME_SIZE) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
} else {
|
||||||
|
strscpy(new->name, name, name_len);
|
||||||
|
new->id = id;
|
||||||
|
new->busy = false;
|
||||||
|
list_add_tail(&new->list, &identity_list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct identity *identity_find(int id)
|
||||||
|
{
|
||||||
|
struct identity *ret = NULL;
|
||||||
|
struct identity *tmp = NULL;
|
||||||
|
struct list_head *list = &identity_list;
|
||||||
|
|
||||||
|
do {
|
||||||
|
tmp = list_entry(list, struct identity, list);
|
||||||
|
if (tmp->id == id)
|
||||||
|
ret = tmp;
|
||||||
|
else
|
||||||
|
list = tmp->list.next;
|
||||||
|
} while (list != &identity_list && !ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void identity_destroy(int id)
|
||||||
|
{
|
||||||
|
struct identity *tmp = identity_find(id);
|
||||||
|
|
||||||
|
if (tmp) {
|
||||||
|
list_del(&tmp->list);
|
||||||
|
kfree(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init my_init(void)
|
||||||
|
{
|
||||||
|
struct identity *temp;
|
||||||
|
|
||||||
|
pr_info("Coucou le gens !!!!\n");
|
||||||
|
INIT_LIST_HEAD(&identity_list);
|
||||||
|
|
||||||
|
if (identity_create("Alice", 1))
|
||||||
|
pr_info("Alice n'a pas été créée.");
|
||||||
|
if (identity_create("Bob", 2))
|
||||||
|
pr_info("Bob n'a pas été créée.");
|
||||||
|
if (identity_create("Dave", 3))
|
||||||
|
pr_info("Dave n'a pas été créée.");
|
||||||
|
if (identity_create("Gena", 10))
|
||||||
|
pr_info("Gena n'a pas été créée.");
|
||||||
|
|
||||||
|
temp = identity_find(3);
|
||||||
|
if (!temp)
|
||||||
|
pr_info("id 3 not found\n");
|
||||||
|
else
|
||||||
|
pr_info("id 3 = %s\n", temp->name);
|
||||||
|
|
||||||
|
temp = identity_find(42);
|
||||||
|
if (!temp)
|
||||||
|
pr_info("id 42 not found\n");
|
||||||
|
|
||||||
|
identity_destroy(2);
|
||||||
|
identity_destroy(1);
|
||||||
|
identity_destroy(10);
|
||||||
|
identity_destroy(42);
|
||||||
|
identity_destroy(3);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit my_exit(void)
|
||||||
|
{
|
||||||
|
pr_info("Tschuss !!!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(my_init);
|
||||||
|
module_exit(my_exit);
|
||||||
|
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_AUTHOR("rick <rick@gnous.eu>");
|
||||||
|
MODULE_DESCRIPTION("Simple liste chainée.");
|
Loading…
Reference in a new issue