LINUX.ORG.RU

Замена системного вызова для ядра 4.9

 , ,


0

2

Делаю драйвер для ARMv7 с ядром 4.9.14 Linux (задача - резервирование контроллеров).

Уперся в проблему — не могу изменить содержимое в sys_call_table:

sys_call_table[__NR_mkdir] = new_sys_mkdir;

Это работало на старом ядре и старой версии ARM.

В интернете есть решения для последних ядер, но только для intel. Для ARMv7 - ничего.

Как обойти этот запрет? Должно же быть решение? Помогите!



Последнее исправление: Evg12 (всего исправлений: 1)

Проблема слабо коррелирует с исходной задачей — ты вероятно делаешь что-то не так.

Как обойти этот запрет?

Замапить эту же (virt_to_page) страницу еще раз (vmap), но уже с записью.

Deleted
()

kpatch и, надеюсь, в жизни ты не такой страшный человек, как постановка твоей задачи.

ttnl ★★★★★
()

Нужно какие-то стандартные механизмы использовать, тк на х86 архитектурно-зависимый костыль:

#include<linux/module.h>
#include<linux/syscalls.h>
static void**st;

for(st=(void**)PAGE_OFFSET;st<(void**)ULONG_MAX;++st)

  if(st[__NR_close]==(void*)sys_close){

    write_cr0(read_cr0()&~X86_CR0_WP);
    st[__NR_sync]=(void*)my;

    write_cr0(read_cr0()|X86_CR0_WP);
    return 0;}

anonymous
()

задача - резервирование контроллеров

какое еще резервирование ? В Device Tree можно все что угодно сделать - или вообще отключить или указать нужный драйвер, например свой

&pwm3 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pwm3>;
        status = "disabled";
};
  
&pwm7 {
        compatible = "vendor,custom-function-pwm";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pwm7>;
        status = "okay";
};

в драйвере

static const struct of_device_id custom_function_pwm_dt_ids[] = {
        { .compatible = "vendor,custom-function-pwm", },
        { /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, custom_function_pwm_dt_ids);
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.