используя системный вызов в файле ядра Linux

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

Файл, который я пишу,

исходный код: linux-x.x.x/kernel/sched_new_scheduler.c

В sched_new_scheduler.c можно ли использовать syscall(the id of the system call, parameter); напрямую? Кажется, что syscall(); используется с #include<sys/syscalls.h> в программе C, но ".h" не может быть найден в kernel/.

Я просто хочу знать, как моя программа выполняется, записывая что-то, поэтому могу ли я напрямую написать printk("something"); в sched_new_scheduler.c ? Или попробовать правильный способ использования системного вызова?


person Johnn    schedule 20.05.2015    source источник


Ответы (2)


Системный вызов выглядит как оболочка вокруг другой функции ядра. Одним из способов использования системного вызова внутри ядра является поиск подфункции для точного системного вызова. Например:

int open(const char *pathname, int flags, mode_t mode); -> filp_open

////////////////////////////////////////////////////////////////////////////////////////////////
struct file* file_open(const char* path, int flags, int rights)
{
    struct file* filp = NULL;
    mm_segment_t oldfs;
    int err = 0;

    oldfs = get_fs();
    set_fs(get_ds());
    filp = filp_open(path, flags, rights);
    set_fs(oldfs);

    if(IS_ERR(filp)) {
        err = PTR_ERR(filp);
        return NULL;
    }

    return filp;
}

ssize_t write(int fd, const void *buf, size_t count); -> vfs_write

////////////////////////////////////////////////////////////////////////////////////////////////
int file_write(struct file* file, unsigned long long offset, unsigned char* data, unsigned int size)
{
    mm_segment_t oldfs;
    int ret;

    oldfs = get_fs();
    set_fs(get_ds());

    ret = vfs_write(file, data, size, &offset);

    set_fs(oldfs);
    return ret;
}
person cosinus0    schedule 20.05.2015
comment
Спасибо за ваше предложение найти подфункции определенных системных вызовов. И я обнаружил, что использовать printk сложно, реализуя его подфункции внутри ядра. Но я также обнаружил, что мой linux-x.x.x/kernel/sched_new_scheduler.c может напрямую использовать printk, просто добавив #include<linux/kernel.h> в файл c, и это работает. Спасибо за вашу помощь еще раз! :) - person Johnn; 21.05.2015

Предполагается, что системный вызов используется прикладной программой для использования службы из ядра. Вы можете реализовать системный вызов в модуле ядра, но его следует вызывать из прикладной программы. Если вы просто хотите предоставить статистику вашего нового планировщика пользовательскому пространству для отладки, вы можете использовать такие интерфейсы, как proc, sys, debugfs и т. д. И это будет намного проще, чем реализовать системный вызов и написать приложение пользовательского пространства для его использования. .

person subin    schedule 21.05.2015
comment
Большое тебе спасибо. Я попробую эти интерфейсы позже. :) - person Johnn; 24.05.2015