2015-01-24 3 views
0

Интересно, что я не нашел простого примера в Интернете. Можете ли вы поделиться простым примером, пожалуйста? Я пытаюсь понять следующее, проанализировав пример.Простой пример реализации системного вызова?

⦁ Typically, 
⦁ a number associated with each system call 
⦁ Number used as an index to a table: System Call table 
⦁ Table keeps addresses of system calls (routines) 
⦁ System call runs and returns 
⦁ Caller does not know system call implementation 
⦁ Just knows interface 

ответ

3

Это зависит от архитектуры, для которой вы хотите добавить системный вызов, или если вы хотите добавить системный вызов для всех архитектур. Я объясню один способ добавить системный вызов для ARM.

  1. Выберите название для вашей системы. Например, mysyscall.
  2. Выберите номер системного вызова. В arch/arm/include/asm/unistd.h обратите внимание на то, как назначается ему каждый столбец с заданным номером (__NR__SYSCALL_BASE+<number>). Выберите неиспользуемый номер для вашего системного вызова. Выберем число системных вызовов 223. Затем добавить:

    #define __NR_mysyscall (__NR_SYSCALL_BASE+223

    где индекс 223 будет в этом файле заголовка. Это присваивает номер 223 вашему Syscall на ARM-архитектурах.

  3. Изменить архитектуры системного вызова таблица. В linux/arch/arm/kernel/calls.S, измените строку, которая соответствует SYSCALL 223 к:

    CALL(sys_mysyscall)

  4. Добавьте свой прототип функции. Предположим, вы хотели добавить нестандартный сценарий. Редактирование файла: include/linux/syscalls.h и добавить прототип вашего SYSCALL в:

    asmlinkage long sys_mysyscall(struct dummy_struct *buf);

    Если вы хотите, чтобы добавить его специально для ARM, то выполните следующие действия, за исключением в этом файле: arch/arm/kernel/sys_arm.c.

  5. Внесите свой syscall где-нибудь. Создайте файл, пожалуйста. Например, в каталоге kernel/. Вы должны иметь по крайней мере:

#include <linux/syscalls.h> 
... 
SYSCALL_DEFINE1(mysyscall, struct dummy_struct __user *, buf) 
{ 
    /* Implement your syscall */ 
} 

Обратите внимание на макро, SYSCALL_DEFINE1. Номер в конце должен соответствовать количеству входных параметров, которые имеет ваш syscall. В этом случае наш системный вызов имеет только один параметр, поэтому вы используете SYSCALL_DEFINE1. Если у него было два параметра, вы использовали бы SYSCALL_DEFINE2 и т. Д.

Не забудьте добавить файл объекта (.o) в файл Makefile в каталог, в который вы его положили.

  1. Скомпилируйте свое новое ядро ​​и тест. Вы не изменили свои библиотеки C, поэтому вы не можете вызывать свой системный вызов с mysyscall().Вы должны использовать функцию syscall() которая принимает номер системного вызова в качестве первого аргумента:
struct dummy_struct *buf = calloc(1, sizeof(buf)); 
int res = syscall(223, buf); 

Обратите внимание, что это было для ARM. Этот процесс будет очень похож на другие архитектуры.

Edit: Не забудьте добавить свой файл системного вызова в Makefile в ядре /.

+0

Привет, У меня есть аналогичный вопрос в OS X, посвященный конкретному сценарию, который уже реализован в ядре. однако реализация и вызов кажутся разными в входных аргументах. возможно, вы можете посмотреть здесь: http://stackoverflow.com/questions/37656016/osx-setgid-system-call-which-api-is-the-correct-one – Zohar81

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