2016-11-04 4 views
2

Я хочу использовать функцию getname в моем модуле ядра. Он не экспортируется. Поскольку я сейчас сталкиваюсь с этой проблемой, я хотел бы знать, как получить доступ и использовать любой символ ядра, который не экспортируется. Я полагаю, что шаги, необходимые для его использования, будут различаться в зависимости от того, что такое символ, поэтому я хотел бы посмотреть, как это будет сделано для типа (например, структуры), переменной, таблицы указателей (например, системы таблица вызовов) и функцию. Как это можно сделать в любом из этих случаев:Как получить доступ к символу ядра в модуле ядра?

  • Когда я знаю адрес символа из System.map или /proc/kallsyms.
  • Когда я знаю имя символа и хочу использовать kallsyms_lookup_name в его извлечении.

В настоящее время я знаю, как угнать системные вызовы, и это требует объявляющий что-то вроде

asmlinkage <return_type> (*<name_for_system_call>)(<the types of the its arguments separated by commas>); 
использовать

Would что-то подобное? В http://stackoverflow.com/a/32968387/1953537 ответе на другой вопрос, пример, представленный плакате

#include <linux/kallsyms.h> 

static void (*machine_power_off_p)(void); 
machine_power_off = (void*) kallsyms_lookup_name("machine_power_off"); 

Но что, если символ возвращает указатель? Я помещу звездочку слева от (*machine_power_off_p)?

+0

«Не помещаю ли я звездочку слева от первого набора круглых скобок?» Какие круглые скобки? В вашем вопросе много круглых скобок. Так вы спрашиваете, как вызвать указатель на функцию? Google должен быть в состоянии сказать вам об этом. Например: [Как работают указатели функций в C?] (Http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work) – kaylum

+0

@kaylum Первый набор в примере справа выше этот вопрос. – Melab

+0

'Но что, если символ возвращает указатель?" - Затем замените * left * 'void' в примере возвращаемым типом (например,, 'struct filename *'). Вопрос в том, что речь идет об использовании указателя к функциям, как заметил кайлум. – Tsyvarev

ответ

0

Доступ к не экспортируемой функции не отличается от доступа к экспортированным функциям, за исключением того, что вы не можете разрешить свой адрес в ядре. Вы можете сделать трюк, как это:

static void (*your_func)(void); 
your_func=0xhex_addr; 

или структуры

strucr your_struct{int i;double j} *stru; 
stru=0xhex_addr; 

Тип указателя просто определяет, сколько байт будет считан или записан с или адрес указателя.

Для структурного или переменного шестнадцатеричного адреса даже может находиться в сегменте кода ядра, но вы получите ошибку сегментации, если попытаетесь написать что-то в этой структуре или var-reading будет законным. И еще одна вещь ... при выполнении этого трюка со структурой не забывайте о выравнивании данных структуры.

0

#include <linux/fs.h> заявляет extern struct filename *getname(const char __user *);. Указатель на эту функцию имеет тип struct filename *(*)(const char __user *). Если объявление переменной этого типа, имя переменной следует после * в (*). Таким образом, вы можете объявить переменную этого типа и присвоить возвращаемое значение kallsyms_lookup_name("getname") к нему следующим образом:

static struct filename *(*getname_p)(const char __user *); 

getname_p = (struct filename *(*)(const char __user *)) 
      kallsyms_lookup_name("getname"); 

Для вашего другом случае, когда вы хотите использовать числовой адрес, просто замените вызов на kallsyms_lookup_name функцию с фактическим число (kallsyms_lookup_name все равно возвращает значение символа в виде номера).

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