for_each_zone используется в системном вызове Linux - PullRequest
0 голосов
/ 16 декабря 2011

при новом системном вызове я хочу получить доступ к статистике каждой зоны, т.е. в vm_stat [].

#include < linux/mmzone.h >
        my service{


    struct zone *mzone;
        for_each_zone(mzone)
            {
                long l=mzone.vm_stat[NR_FREE_PAGES];
            }

    }

выдает несколько ошибок.я полностью сбит с толку относительно того, как макрос for_each_zone вызывается из myservice.c ..

и, во-вторых, если я хочу вызвать любую функцию из vmscan.c .. какой будет способ сделать это ..

plzzz помогите .. все мои концепции относительно linux нуждаются в чистке.

Спасибо

1 Ответ

0 голосов
/ 18 декабря 2011

Я вижу здесь две вещи не так.Сначала вы объявляете l внутри цикла for.Второй mzone - указатель, поэтому вам нужно использовать -> вместо . для доступа к vm_stat.Кроме того, вместо long l следует использовать atomic_long_t l, для которого необходимо asm-generic/atomic-long.h.Тем не менее, вот модуль ядра , который работает с вашим примером:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mmzone.h>
#include <asm-generic/atomic-long.h>

int __init init_module(void){
 struct zone *mzone;
 atomic_long_t l
 for_each_zone(mzone)
   l = mzone->vm_stat[NR_FREE_PAGES];
 return 0;
}

void __exit clean_module(void){
}

Теперь о том, как работает макрос for_each_zone.Он определен в linux/mmzone.h как (ядро 3.1.5):

#define for_each_zone(zone)                             \
        for (zone = (first_online_pgdat())->node_zones; \
             zone;                                      \
             zone = next_zone(zone))

Как вы можете видеть, он работает, получая указатель на struct zone и затем расширяется в цикл for, который будетцикл через каждую зону.Следовательно, вы можете думать об этом как о простом цикле for.

Теперь, как я понял ваш вопрос, вам нужно вызвать my_service из исходных кодов ядра.В ядре есть несколько папок, в которые вы можете поместить свои исходники (fs, ipc и т. Д.).Самый быстрый способ сделать это - выбрать одну из этих папок и поместить туда файл .c.Затем вам нужно изменить Makefile из этой папки, чтобы он также компилировал ваш .c.После этого вы, вероятно, захотите написать файл .h, чтобы предоставить свои функции другим.Я бы порекомендовал положить его внутрь include/linux.Наконец, вам нужно перекомпилировать ядро.Не забывайте, что если вы хотите, чтобы модули использовали любую из ваших функций / переменных, вы всегда можете использовать макрос EXPORT_SYMBOL, чтобы сделать их доступными.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...