Определите местоположение (адрес памяти), где находится модуль драйвера.

Когда драйвер ядра Linux загружается динамически, как нам написать функцию C, чтобы сообщить местоположение (адрес памяти), где находится модуль драйвера?

Это больше для Windows, однако, если мы адаптируем аналогичный драйвер для Linux, будет ли это работать?

    long sizeOfExe = 0;   
    FILE *fp;

    fp = fopen("./Mini.ko", "rb"); // reading itself

    fseek(fp, 0L, SEEK_END);
    sizeOfExe = ftell(fp);

    printf("The size of this driver module is: %ld bytes\n", sizeOfExe);   
    int* addressStartOfFile = &fp;
    printf("Location of this driver module starts at: 0x%x\n", addressStartOfFile);        
    printf("Location of this driver module ends at: 0x%x\n", (addressStartOfFile+sizeOfExe));

/*
The size of this driver module is: 18727 bytes
Location of this driver module starts at: 0x28ff30
Location of this driver module ends at: 0x2a23cc
*/


person Ursa Major    schedule 19.12.2013    source источник
comment
Для частей драйвера было бы относительно легко получить адрес функций, которые его составляют, как и в другом коде C. Зачем вам эта информация?   -  person Chris Stratton    schedule 19.12.2013
comment
Привет @ChrisStratton, не могли бы вы привести пример функции C для этого? Причина в том, что существует требование выполнять код обнаружения ошибок на лету.   -  person Ursa Major    schedule 19.12.2013
comment
Оператор & работает и с именами функций. Остерегайтесь таких вещей, как кэш инструкций и данных! Представление памяти, которое вы получаете в одном режиме, может не совпадать с представлением в другом, если были какие-то недавние изменения (/ошибки памяти?).   -  person Chris Stratton    schedule 19.12.2013
comment
Я разделяю ваши взгляды, и это то, что меня беспокоит. Поскольку я не очень хорошо разбираюсь в ядрах Linux, меня беспокоят проблемы доступа и виртуальной памяти (а также другие проблемы, такие как проблемы отображения памяти). Есть ли способ убедиться в этом? Спасибо, @ChrisStratton.   -  person Ursa Major    schedule 19.12.2013
comment
Нет, этот пример кода не должен работать. Я был бы немного удивлен, если бы это работало даже в Windows. Есть две основные проблемы: вы предполагаете, что данные и кодовые пространства являются смежными в этом порядке, и вы предполагаете, что существует файл, отдаленно напоминающий занимаемый в памяти файл. Я был бы гораздо более склонен взять адрес первой и последней функций, а также первого и последнего элементов данных - и я не ожидаю, что они будут (обязательно) непрерывными. Но если вы попытаетесь пройтись по памяти, чтобы проверить ее, помните, что доступ к данным в памяти кода может проходить через другой кеш.   -  person Chris Stratton    schedule 19.12.2013
comment
Привет @ChrisStratton, не могли бы вы привести пример функции C, чтобы продемонстрировать то, что вы только что сказали?   -  person Ursa Major    schedule 19.12.2013
comment
Привет @ChrisStratton, как мы можем объяснить проблемы (непрерывная память, MMU и т. д.), о которых вы упомянули?   -  person Ursa Major    schedule 19.12.2013
comment
Если это для самопроверки целостности, вы не можете сделать это таким образом. Загрузка модуля выполняет некоторую компоновку, которая изменяет код.   -  person Gilles 'SO- stop being evil'    schedule 10.01.2014
comment
острое наблюдение, @Gilles. +1 для вас. К сожалению, я не могу использовать ответ, чтобы удалить это требование.   -  person Ursa Major    schedule 10.01.2014


Ответы (1)


Когда драйвер ядра Linux загружается динамически, как нам написать функцию C, чтобы сообщить местоположение (адрес памяти), где находится модуль драйвера?

Мы пишем его, чтобы прочитать (через popen() и т. д.) вывод или перевести на C команду оболочки

grep '\[modulename]' /proc/k*syms | sort
person Armali    schedule 14.10.2016