Nano Hash - криптовалюты, майнинг, программирование

Опрос петлевого устройства через модуль ядра

Я пытался прочитать петлевое устройство, которое я создал с помощью модуля ядра, с периодом 200 мс, но оно приводит к сбою ядра, когда я пытаюсь его вставить.

Я думаю, что есть проблема с моим модулем чтения, но он отлично работает без таймера.

Я новичок в программировании ядра, пожалуйста, помогите. Заранее благодарю

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/timer.h>
#include<linux/fs.h>
#include <linux/init.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>

static struct timer_list my_timer;

static void read_file(char *filename)
{
  struct file *fd;
  char buf[1];
  unsigned long long offset=0;
  mm_segment_t old_fs = get_fs();
  set_fs(KERNEL_DS);

  fd = filp_open(filename, O_RDONLY, 0);
  if (fd >= 0) {
    printk(KERN_DEBUG);
    while (vfs_read(fd, buf, 1,&offset) == 1)
    {
      if((0 <= buf[0]) && (buf[0] <=255))
        printk("%c", buf[0]);
    } 
    printk(KERN_ALERT "Loop Ran\n");
    filp_close(fd,NULL);
  }
  set_fs(old_fs);
}

void my_timer_callback( unsigned long data )
{
  int ret;
  printk( "my_timer_callback called (%ld).\n", jiffies );  
  printk( "Starting timer to fire in 200ms (%ld)\n", jiffies );  
  read_file("/dev/loop0");  
  ret = mod_timer( &my_timer, jiffies + msecs_to_jiffies(3000) );
  if(ret)  
    printk("Error in mod_timer\n");  
}

int init_module( void )
{
  int ret;
  printk("Timer module installing\n");

  setup_timer( &my_timer, my_timer_callback, 0 );

  printk( "Starting timer to fire in 200ms (%ld)\n", jiffies );
  ret = mod_timer( &my_timer, jiffies + msecs_to_jiffies(200) );
  if(ret)
    printk("Error in mod_timer\n");

  return 0;
}

void cleanup_module( void )
{
  int ret;

  ret = del_timer( &my_timer );
  if(ret)
    printk("The timer is still in use...\n");

  printk("Timer module uninstalling\n");

  return;
}`enter code here`

MODULE_LICENSE("GPL"); 

Мой сделать файл:

obj-m := timer2.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD)   clean 

  • linuxjournal.com/article/8110 01.07.2013
  • @BraveNewCurrency Поскольку чтение работает правильно без таймера, поэтому я думаю, что проблема в том, что этот модуль чтения работает как подпрограмма обслуживания прерываний, а ISR слишком велик. 02.07.2013
  • Можете ли вы помочь мне с этим? 02.07.2013
  • Чтение файлов из ядра официально является ПЛОХИМ делом. Почему бы вам не закрыть этот вопрос и не опубликовать то, что вы действительно хотите сделать, и, возможно, мы сможем вам помочь. 06.07.2013

Ответы:


1

Чтение файлов довольно сложно, так как приходится обрабатывать множество угловых случаев. (Что, если необходимо расширить сопоставления виртуальных машин? Что, если вам нужно приостановить поток во время ожидания диска? и т. д.)

В этой статье рассказывается о том, что вам следует делать вместо этого: http://www.linuxjournal.com/article/8110

К сожалению, в статье приводится пример кода для обхода проблемы, который дает людям надежду. Но пример кода работает ТОЛЬКО в контексте «вызовов пользовательского процесса в ядро». В этом случае ядро ​​может повторно использовать текущий контекст пользовательского процесса, но это хак.

В общем случае (прерывания, таймеры, травление) вы не можете просто «захватить случайный пользовательский контекст», потому что это приведет к серьезным проблемам.

Вместо этого вы должны создать процесс в пользовательском пространстве, который передает ядру необходимые ему данные.

06.07.2013

2

Функции таймера ядра должны быть атомарными. Файловые операции нуждаются в контексте процесса. Ваш сбой связан с файловыми операциями, присутствующими в вашей операции чтения.

Драйверы устройств Linux — глава 7 должна помочь вам разобраться с таймерами ядра.

16.09.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..