Я портирую модуль ядра Linux, записанный, чтобы Linux 2.4 работал с Linux 2.6. Некоторый syscalls, объявленный через syscallN()
макросы и перенесенный в set_fs()
вызовы использовались в коде. Как я могу все еще использовать sycalls в Linux 2.6, где они макросы отсутствуют?
Я знаю, что это - дурной тон для использования syscalls от пространства ядра и syscallN()
макросы повреждаются на большинстве платформ. Любой разумный способ заменить getuid
, geteuid
, mknod
, chown
, unlink
, sched_yield
syscalls в пространстве ядра ценится.
Также имейте в виду, что внедрение приложения с несколькими действиями
даст пользователю более согласованный опыт работы с платформой в целом. Часть опыта будет формироваться с помощью встроенных приложений Google, поэтому пользователям, вероятно, будет легче использовать ваше приложение, если оно будет вести себя аналогично тем, которые уже установлены на телефоне.
Фраза super T >
- это подстановочный символ, означающий, что класс BineySeeyTree может принимать:
a. параметр типа (Т), который расширяет Сопоставимый
b. , а также может принимать подтип (S), чей родительский элемент расширяет Сопоставимый
Конструкция super T >
расширяет утилиту класса BineySeeyTree до
тип (ы), реализующий Сопоставимый и его подтипы.
Ниже приведен фрагмент кода, демонстрирующий следующее:
// Below declaration of Helper class doesn't uses the wildcard super
class Helper<T extends Comparable<T>> {
// some helper methods
}
abstract class Animal implements Comparable<Animal> {
public int compareTo(final Animal o) {
// implementation ...
}
// other abstract methods
}
class Mammal extends Animal {
// implement abstract methods
}
При приведенном выше объявлении оператор Helper < Животное > x = new Helper < Животное > ()
работает нормально.
Но утверждение: Helper < Mammal > x = new Helper < Mammal > ()
дает параметр типа ошибки компиляции
Mammal не находится в пределах его границы
(версия компилятора javac 1.5.0_06)
Когда объявление класса Helper изменяется на следующую форму:
class Helper<T extends Comparable<? super T>> {
// some helper methods
}
тогда оператор Helper < Mammal > x = new Helper < Mammal > ()
не дает ошибки компилятора.
Таким образом, использование подстановочных знаков максимизирует полезность класса.
-121--4132689- тока- > uid
и current- > euid
могут заменить первые два.
расписание ()
должно работать для последнего.
Операции файловой системы выглядят сложнее: можно попытаться проверить, экспортированы ли sys _ chown ()
, sys _ mknod ()
и sys _ unlink ()
(доступны для использования любым модулем). Если они работают, отлично. Здесь есть несколько полезных советов . В противном случае придется копать немного глубже:
chown
syscall определен в fs/open.c
. На первый взгляд я не понимаю, почему вы не смогли скопировать этот код в свою собственную функцию «kernel_chown» и попробовать.
мнодат
и разорвать связь
syscalls в fs/namei.c
; в конечном итоге они вызывают vfs _ mknod ()
и vfs _ unlink ()
соответственно. Возможно, вы можете продублировать этот код или выяснить, как это делается оттуда.