Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.68 KB | None | 0 0
  1. #include<linux/module.h>
  2. #include<linux/kfifo.h>
  3.  
  4. /*
  5. W przypadku parametru tablicowego należy użyć makra module_param_array zamiast module_param.
  6. Przyjmuje ono cztery parametry wywołania: nazwę tablicy, typ elementów tablicy, adres zmiennej typu int,
  7. w której makro zapisze ile zostało modułowi dostarczonych wartości dla elementów tablicy podczas
  8. jego ładowania, a ostatni argument jest liczbą ósemkową definiującą prawa dostępu do parametru.
  9. */
  10.  
  11. #define MAX_NUMBER_OF_PARAMS 100
  12.  
  13. static char* strings[MAX_NUMBER_OF_PARAMS];
  14. static int number_of_elements = 0;
  15.  
  16. /*
  17. charp - sizeof(char*)--v
  18. */
  19.  
  20. module_param_array(strings, charp, &number_of_elements, 0644);
  21. MODULE_PARM_DESC(strings, "An array parameters as char pointers to get strings");
  22.  
  23. static struct kfifo fifo_queue;
  24.  
  25.  
  26. static int __init fifo_init(void) {
  27.  
  28. printk(KERN_ALERT "-------- Fifo Init --------");
  29.  
  30. int i=0;
  31. unsigned int returned_size;
  32.  
  33. /*
  34. Makro, które dynamicznie przydziela pamięć na kolejkę fifo
  35. - Jego pierwszym argumentem jest wskaźnik na strukturę typu struct kfifo.
  36. - Drugim jest rozmiar wszystkich elementów kolejki,który musi być wyrażony potęgą dwójki.
  37. - Trzeci argument to znacznik typu przydziału.
  38. Makro zwraca zero jeśli alokacja zakończy się pomyślnie lub kod błędu w przypadku niepowodzenia przydziału.
  39. */
  40.  
  41. int returned_value =
  42. kfifo_alloc(&fifo_queue, number_of_elements * sizeof(char*), GFP_KERNEL);
  43.  
  44. if (returned_value) {
  45.  
  46. pr_alert("Error allocating kfifo!\n");
  47. return -ENOMEM;
  48. }
  49.  
  50. /*
  51. Do czasu aż jest wystarczająco przydzielonego miejsca
  52. w kolejce poniższa pętla będzie wykonywana
  53. */
  54.  
  55. while (!kfifo_is_full(&fifo_queue)) {
  56.  
  57. returned_size = kfifo_in(&fifo_queue, &strings[i], sizeof(char*));
  58.  
  59. if (returned_size != sizeof(char*))
  60. pr_alert("Enqueue error\n");
  61.  
  62. pr_notice("Value enqueued: %s\n", strings[i]);
  63. i++;
  64.  
  65. }
  66.  
  67. return 0;
  68. }
  69.  
  70.  
  71. static void __exit fifo_exit(void) {
  72.  
  73. printk(KERN_ALERT "-------- Fifo Exit --------");
  74.  
  75. int returned_size;
  76. char *string;
  77.  
  78. /*
  79. Do czasu aż jest wystarczająco przydzielonego miejsca
  80. w kolejce poniższa pętla będzie wykonywana
  81. */
  82.  
  83. while (!kfifo_is_empty(&fifo_queue)) {
  84.  
  85. returned_size = kfifo_out(&fifo_queue, &string,sizeof(char*));
  86.  
  87. if (returned_size != sizeof(char*))
  88. pr_alert("Dequeue error!\n");
  89.  
  90. pr_notice("Value from the queue: %s\n", string);
  91. }
  92.  
  93. kfifo_free(&fifo_queue);
  94.  
  95. }
  96.  
  97. module_init(fifo_init);
  98. module_exit(fifo_exit);
  99.  
  100. MODULE_LICENSE("GPL");
  101. MODULE_AUTHOR("Zachariasz Lukasz | Wychowski Norbert | Zak Kamil | 15B");
  102. MODULE_DESCRIPTION("Zadanie 4");
  103. MODULE_VERSION("1.0");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement