LINUX.ORG.RU

Была свободная минутка и я написал модуль ядра.

/* CPU_IDLE kernel module by xnix <xnix@list.ru>
 LICENSE - GPL  */
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/errno.h>
#include <linux/proc_fs.h>
#include <linux/config.h>
#include <linux/init.h>
static struct proc_dir_entry *qq_proc;
static char *name="CPU_IDLE";
static int cycle=8192;
static int result;
MODULE_PARM (name, "s");
MODULE_PARM (cycle, "i");
MODULE_PARM_DESC (name, "Name");
MODULE_PARM_DESC (cycle, "Number of cycles");
static ssize_t
idle_read(char *buffer,
              char **buffer_location,
              off_t offset, int buffer_length, int *eof, void *data)
{
  //printk("<1>The process is \"%s\" (pid %i)\n",current->comm, current->uid);
  if (current->uid!=0)return -EPERM;
  printk(KERN_INFO "IDLE CYCLE STARTED %i CYCLES\n",cycle);

  int len = 0; 
  if (offset > 0) {
    *eof = 1;
    return len;
  }
  int count;
  for (count=0;count<cycle;count++){
asm volatile ("sti");
asm volatile("hlt");
}
  len = sprintf(buffer,"CPU IDLE CYCLE PASSED\n");
  return len;
}
int init_module(void)
{
  int err;
  printk("<1>The process is \"%s\" (pid %i)\n",current->comm, current->pid);
  int rv = 0;
  qq_proc = create_proc_entry(name, 000, NULL);
  qq_proc->read_proc = idle_read;
  qq_proc->owner = THIS_MODULE;
  qq_proc->mode = S_IFREG | S_IRUGO;
  qq_proc->uid = 0;
  qq_proc->gid = 0;
  qq_proc->size = 37;
  printk(KERN_INFO "Trying to create /proc/%s:\n",name);
  if (qq_proc == NULL) {
    rv = -ENOMEM;
    remove_proc_entry(name, &proc_root);
    printk(KERN_INFO "Could not initialize /proc/%s\n",name);
  } else {
    printk(KERN_INFO "proc device initialized!\n");
  }
  return 0;
};

void cleanup_module(void)
{
  remove_proc_entry(name, &proc_root);
  printk(KERN_INFO "/proc/%s removed\n",name);
  printk("<1>Unloading module\n");
}

xnix ★★
()

$ esearch cpufreq
[ Results for search key : cpufreq ]
[ Applications found : 3 ]

*  sys-power/cpufreqd
      Latest version available: 2.0.0
      Latest version installed: 2.0.0
      Size of downloaded files: 595 kB
      Homepage:    http://cpufreqd.sourceforge.net
      Description: CPU Frequency Daemon
      License:     GPL-2

*  sys-power/cpufrequtils
      Latest version available: 0.4
      Latest version installed: 0.4
      Size of downloaded files: 422 kB
      Homepage:    http://www.kernel.org/pub/linux/utils/kernel/cpufreq/cpufrequtils.html
      Description: Userspace utilities for the Linux kernel cpufreq subsystem
      License:     GPL-2

*  sys-power/ncpufreqd
      Latest version available: 2.0
      Latest version installed: [ Not Installed ]
      Size of downloaded files: 62 kB
      Homepage:    http://fatcat.ftj.agh.edu.pl/~nelchael/
      Description: Daemon controlling CPU speed and temperature
      License:     ZLIB

SatanClaus ★★★
()

Сохрани файл как idle.c

$ cat Makefile obj-m := idle.o

собрать такой командой make -C /usr/src/linux-2.6.14/ SUBDIRS=/home/mops/kerndev modules

Загрузить так : insmod idle.ko

Вот демон idle # cat idle.sh s=1 while [ $s -lt 2 ] do cat /proc/CPU_IDLE done

Будут вопросы - спрашивай

xnix ★★
()
Ответ на: комментарий от xnix

xnix: Спасибо. Если заработает, отпишусь. SatanClaus: cpufreq - это для регулировки частоты процессора? Если так, то у меня не мобильный вариант. Или будет работать и так?

А вообще, включал в ядре ACPI::Processor и CPUFreq::ACPI Processor P-States driver - не заработало. Или это не для этого?

anonymous
()
Ответ на: комментарий от xnix

xnix: Пишет, что:

make: Entering directory `/usr/src/linux-2.6.14-gentoo-r5' scripts/Makefile.build:197: цель `/home/ruslan/projects/cpuidle/cpuidle.c' не соответствует образцу целей Building modules, stage 2. MODPOST make: Leaving directory `/usr/src/linux-2.6.14-gentoo-r5'

Что делать?

anonymous
()
Ответ на: комментарий от xnix

Прошу прощения, моя вина, в одной букве ошибся. Теперь всё нормально. Спасибо.

anonymous
()
Ответ на: комментарий от isn

isn: Спасибо, это в самом деле работает.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.