Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<linux/module.h>
- #include<linux/kfifo.h>
- /*
- W przypadku parametru tablicowego należy użyć makra module_param_array zamiast module_param.
- Przyjmuje ono cztery parametry wywołania: nazwę tablicy, typ elementów tablicy, adres zmiennej typu int,
- w której makro zapisze ile zostało modułowi dostarczonych wartości dla elementów tablicy podczas
- jego ładowania, a ostatni argument jest liczbą ósemkową definiującą prawa dostępu do parametru.
- */
- #define MAX_NUMBER_OF_PARAMS 100
- static char* strings[MAX_NUMBER_OF_PARAMS];
- static int number_of_elements = 0;
- /*
- charp - sizeof(char*)--v
- */
- module_param_array(strings, charp, &number_of_elements, 0644);
- MODULE_PARM_DESC(strings, "An array parameters as char pointers to get strings");
- static struct kfifo fifo_queue;
- static int __init fifo_init(void) {
- printk(KERN_ALERT "-------- Fifo Init --------");
- int i=0;
- unsigned int returned_size;
- /*
- Makro, które dynamicznie przydziela pamięć na kolejkę fifo
- - Jego pierwszym argumentem jest wskaźnik na strukturę typu struct kfifo.
- - Drugim jest rozmiar wszystkich elementów kolejki,który musi być wyrażony potęgą dwójki.
- - Trzeci argument to znacznik typu przydziału.
- Makro zwraca zero jeśli alokacja zakończy się pomyślnie lub kod błędu w przypadku niepowodzenia przydziału.
- */
- int returned_value =
- kfifo_alloc(&fifo_queue, number_of_elements * sizeof(char*), GFP_KERNEL);
- if (returned_value) {
- pr_alert("Error allocating kfifo!\n");
- return -ENOMEM;
- }
- /*
- Do czasu aż jest wystarczająco przydzielonego miejsca
- w kolejce poniższa pętla będzie wykonywana
- */
- while (!kfifo_is_full(&fifo_queue)) {
- returned_size = kfifo_in(&fifo_queue, &strings[i], sizeof(char*));
- if (returned_size != sizeof(char*))
- pr_alert("Enqueue error\n");
- pr_notice("Value enqueued: %s\n", strings[i]);
- i++;
- }
- return 0;
- }
- static void __exit fifo_exit(void) {
- printk(KERN_ALERT "-------- Fifo Exit --------");
- int returned_size;
- char *string;
- /*
- Do czasu aż jest wystarczająco przydzielonego miejsca
- w kolejce poniższa pętla będzie wykonywana
- */
- while (!kfifo_is_empty(&fifo_queue)) {
- returned_size = kfifo_out(&fifo_queue, &string,sizeof(char*));
- if (returned_size != sizeof(char*))
- pr_alert("Dequeue error!\n");
- pr_notice("Value from the queue: %s\n", string);
- }
- kfifo_free(&fifo_queue);
- }
- module_init(fifo_init);
- module_exit(fifo_exit);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("Zachariasz Lukasz | Wychowski Norbert | Zak Kamil | 15B");
- MODULE_DESCRIPTION("Zadanie 4");
- MODULE_VERSION("1.0");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement