У меня есть упражнение по добавлению системного вызова в ядре Linux, но я изо всех сил пытаюсь его реализовать. Ниже приведено описание:
Основная часть этого назначения заключается в реализации нового системного вызова, который позволяет пользователю определять информацию как о родительском, так и о самом старшем дочернем процессе. Информация об информации о процессах представлена следующей структурой:
struct procinfos{
long studentID;
struct proc_info proc;
struct proc_info parent_proc;
struct proc_info oldest_child_proc;
};
Где proc_info
определяется следующим образом:
struct proc_info{
pid_t pid;
char name[16];
};
procinfos
содержит информацию о трех процессах:
proc
, текущий процесс или процесс с PID parent_proc
, родительский процесс первого процесса oldest_child_proc
, самый старый дочерний процесспервого процесса
Информация о процессах хранится в структуре proc_info
и содержит:
pid
, идентификатор процесса name
, имя программы, которая выполняется
Прототип нашего системного вызова описан ниже:
Чтобы вызвать get_proc_info
системный вызов, пользователь долженукажите PID процесса или −1
в случае текущего процесса. Если системный вызов находит процесс с заданным PID, он получает информацию о процессе, помещает ее в выходной параметр *info
и возвращает 0
. Однако, если системный вызов не может найти такой процесс, он вернет EINVAL
.
#include <linux/kernel.h>
#include <unistd.h>
struct procinfos{
long studentID;
struct proc_info proc;
struct proc_info parent_proc;
struct proc_info oldest_child_proc;
};
struct proc_info{
pid_t pid;
char name[16];
};
asmlinkage long sys_get_proc_info(pid_t pid, struct proinfos *info){
// TODO: implement the system call
}
СОВЕТ:
- Чтобы найти текущий процесс: посмотрите на
arch/x86/include/asm/current.h
или для простого использования макроса current (current -> pid). - Чтобы найти информацию о каждом процессе, посмотрите
include/linux/sched.h
. - Чтобы после процесса обрезки время для сборки ядра былосокращено до 10 минут, но это долго компилируется. Чтобы как можно быстрее приступить к разработке системного вызова, вы можете использовать модуль ядра, чтобы заранее протестировать системный вызов, представленный в виде модуля (приложение B).
Как реализовать этот системный вызов?