2015-03-30 2 views
1

Я хотел изменить параметр ядра на частоте таймера ядра.Как изменить частоту таймера ядра?

Так я нашел this, он говорит, что я могу изменить конфигурацию с помощью /boot/config-'uname -r'

(И я также нашел пост говоря, если он не строит Tickless ядра - CONFIG_NO_HZ=y я не мог изменить частоту таймера, но шахта значение CONFIG_NO_HZ=y)

И также упоминается, как рассчитать частоту с помощью кода C.

Так что сначала я проверяю текущую частоту таймера ядра с кодом C.

Результат 1000 ~ 1500 Гц.

И я проверяю /boot/config-'uname -r', он представляет собой, как показано ниже.

# CONFIG_HZ_100 is not set 
CONFIG_HZ_250=y 
# CONFIG_HZ_300 is not set 
# CONFIG_HZ_1000 is not set 
CONFIG_HZ=250 

Но при этом таймер частоты составлял 250 Гц ...?

А затем, чтобы проверить больше, я пытаюсь изменить файл

# CONFIG_HZ_100 is not set 
# CONFIG_HZ_250=y 
# CONFIG_HZ_300 is not set 
CONFIG_HZ_1000=y 
CONFIG_HZ=1000 

И перезагрузки, снова проверьте конфигурационный файл, если применяется изменение, и запустить код C, который проверяет частоту таймера приблизительно ,

Но результат был таким же, как и раньше.

В чем проблема ???

Моя среда VMware, ubuntu12.04

Ниже приведен код C.

#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/time.h> 

#define USECREQ 250 
#define LOOPS 1000 

void event_handler (int signum) 
{ 
static unsigned long cnt = 0; 
static struct timeval tsFirst; 
if (cnt == 0) { 
    gettimeofday (&tsFirst, 0); 
} 
cnt ++; 
if (cnt >= LOOPS) { 
    struct timeval tsNow; 
    struct timeval diff; 
    setitimer (ITIMER_REAL, NULL, NULL); 
    gettimeofday (&tsNow, 0); 
    timersub(&tsNow, &tsFirst, &diff); 
    unsigned long long udiff = (diff.tv_sec * 1000000) + diff.tv_usec; 
    double delta = (double)(udiff/cnt)/1000000; 
    int hz = (unsigned)(1.0/delta); 
    printf ("kernel timer interrupt frequency is approx. %d Hz", hz); 
    if (hz >= (int) (1.0/((double)(USECREQ)/1000000))) { 
    printf (" or higher"); 
    }  
    printf ("\n"); 
    exit (0); 
} 
} 

int main (int argc, char **argv) 
{ 
struct sigaction sa; 
struct itimerval timer; 

memset (&sa, 0, sizeof (sa)); 
sa.sa_handler = &event_handler; 
sigaction (SIGALRM, &sa, NULL); 
timer.it_value.tv_sec = 0; 
timer.it_value.tv_usec = USECREQ; 
timer.it_interval.tv_sec = 0; 
timer.it_interval.tv_usec = USECREQ; 
setitimer (ITIMER_REAL, &timer, NULL); 
while (1); 
} 

ответ

2

Изменения, внесенные в/boot/config, не влияют на работающее ядро. Подробнее о файле конфигурации ядра here.

Файл конфигурации, который вы видите в/boot/config (фактически, это больше похоже на config- [kernel_version]), является конфигурационным файлом, который был USED для сборки ядра. Это означает, что каждое изменение, которое вы делаете в этом конфигурационном файле, ничем не влияет.

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

Смежные вопросы