модификация системных вызовов

Вопросы программного кода и архитектуры Linux

Модератор: Olej

jcmvbkbc
Интересующийся
Сообщения: 6
Зарегистрирован: 08 окт 2015, 21:05
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение jcmvbkbc » 08 окт 2015, 21:43

Olej писал(а):
jcmvbkbc писал(а):Например так, если эти функции вызываются в атомарном контексте:
Это возможно в виде патча, комита ... при сборке ядра.
В коде динамического модуля это не сделаешь - я там выше дополнил почему ... но не успел ;-)
Я там же выше дополнил, почему это возможно.
В любом случае, как именно будет сброшен TLB не имеет значения, можно вызвать invlpg руками если не париться, скопировать нужную функцию в модуль, или вызвать __flush_tlb_all в конце концов.

Код этих функций с __flush_tlb_one превращается в следующее:

Код: Выделить всё

Disassembly of section .text:

0000000000000000 <mem_setrw>:
   0:   e8 00 00 00 00          callq  5 <mem_setrw+0x5>
                        1: R_X86_64_PC32        __fentry__-0x4
   5:   55                      push   %rbp
   6:   48 89 e5                mov    %rsp,%rbp
   9:   53                      push   %rbx
   a:   48 89 fb                mov    %rdi,%rbx
   d:   48 8d 75 ec             lea    -0x14(%rbp),%rsi
  11:   48 83 ec 18             sub    $0x18,%rsp
  15:   e8 00 00 00 00          callq  1a <mem_setrw+0x1a>
                        16: R_X86_64_PC32       lookup_address-0x4
  1a:   48 89 df                mov    %rbx,%rdi
  1d:   48 83 08 02             orq    $0x2,(%rax)
  21:   ff 14 25 00 00 00 00    callq  *0x0
                        24: R_X86_64_32S        pv_mmu_ops+0x48
  28:   48 83 c4 18             add    $0x18,%rsp
  2c:   5b                      pop    %rbx
  2d:   5d                      pop    %rbp
  2e:   c3                      retq
  2f:   90                      nop

0000000000000030 <mem_setro>:
  30:   e8 00 00 00 00          callq  35 <mem_setro+0x5>
                        31: R_X86_64_PC32       __fentry__-0x4
  35:   55                      push   %rbp
  36:   48 89 e5                mov    %rsp,%rbp
  39:   53                      push   %rbx
  3a:   48 89 fb                mov    %rdi,%rbx
  3d:   48 8d 75 ec             lea    -0x14(%rbp),%rsi
  41:   48 83 ec 18             sub    $0x18,%rsp
  45:   e8 00 00 00 00          callq  4a <mem_setro+0x1a>
                        46: R_X86_64_PC32       lookup_address-0x4
  4a:   48 89 df                mov    %rbx,%rdi
  4d:   48 83 20 fd             andq   $0xfffffffffffffffd,(%rax)
  51:   ff 14 25 00 00 00 00    callq  *0x0
                        54: R_X86_64_32S        pv_mmu_ops+0x48
  58:   48 83 c4 18             add    $0x18,%rsp
  5c:   5b                      pop    %rbx
  5d:   5d                      pop    %rbp
  5e:   c3                      retq
Вызов __flush_tlb_one превратился в косвенный вызов из таблицы pv_mmu_ops, таблица экспортирована.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 08 окт 2015, 22:23

jcmvbkbc писал(а): С чего бы? Конечно она доступна. Она будет встроена компилятором в место вызова, вне зависимости от того, модуль это или не модуль.
Это было бы безусловно так (inline подстановка) если бы объявление это было в одном (любом) из хэдер файлов в /lib/module/`uname -r`/build/include ... но оно объявляется в arch/x86/include/asm/tlbflush.h - файл который отсутствует, недоступен при компиляции модулей.

Т.е. определения всех этих имён находятся в архитектурно-зависимой части, недоступны во время компиляции модуля, и могут быть использованы только если все эти определения скопировать из исходников в код модуля.

То же относится и к константе _PAGE_RW:

Код: Выделить всё

// <arch/x86/include/asm/pgtable-2level_types.h>
typedef unsigned long   pteval_t;

// <include/linux/const.h>
#define _AT(T,X)        ((T)(X))

// <arch/x86/include/asm/pgtable_types.h>
#define _PAGE_BIT_RW            1       /* writeable */
#define _PAGE_RW        (_AT(pteval_t, 1) << _PAGE_BIT_RW)

jcmvbkbc
Интересующийся
Сообщения: 6
Зарегистрирован: 08 окт 2015, 21:05
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение jcmvbkbc » 08 окт 2015, 22:33

Olej писал(а):
jcmvbkbc писал(а): С чего бы? Конечно она доступна. Она будет встроена компилятором в место вызова, вне зависимости от того, модуль это или не модуль.
Это было бы безусловно так (inline подстановка) если бы объявление это было в одном (любом) из хэдер файлов в /lib/module/`uname -r`/build/include ... но оно объявляется в arch/x86/include/asm/tlbflush.h - файл который отсутствует, недоступен при компиляции модулей.

Т.е. определения всех этих имён находятся в архитектурно-зависимой части, недоступны во время компиляции модуля, и могут быть использованы только если все эти определения скопировать из исходников в код модуля.

То же относится и к константе _PAGE_RW:
Я не знаю, кто вам это сказал, но это явная ошибка. Достаточно посмотреть, сколько драйверов, которые могут быть собраны как модули, содержат строки начинающиеся с #include <asm/.
Вот вам ссылочка на репозиторий на github с исходником модуля ядра с функциями о которых мы говорим: https://github.com/jcmvbkbc/memsetrw
У меня он отлично компилируется, загружается и выгружается.
Последний раз редактировалось jcmvbkbc 08 окт 2015, 22:47, всего редактировалось 1 раз.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 08 окт 2015, 22:45

jcmvbkbc писал(а): Я не знаю, кто вам это сказал, но это явная ошибка.
Мне сказали это визуализаторы исходников ядра по проекту LXR (Linux Cross Reference), здесь и здесь
jcmvbkbc писал(а): Вот вам ссылочка на репозиторий на github с исходником модуля ядра с функциями о которых мы говорим: https://github.com/jcmvbkbc/memsetrw
У меня он отлично компилируется, загружается и выгружается.
За пример спасибо, посмотрю.

jcmvbkbc
Интересующийся
Сообщения: 6
Зарегистрирован: 08 окт 2015, 21:05
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение jcmvbkbc » 08 окт 2015, 22:51

Olej писал(а):
jcmvbkbc писал(а): Я не знаю, кто вам это сказал, но это явная ошибка.
Мне сказали это визуализаторы исходников ядра по проекту LXR (Linux Cross Reference), здесь и здесь
Уточню, "явная ошибка" было сказано вот об этой фразе:
arch/x86/include/asm/tlbflush.h - файл который отсутствует, недоступен при компиляции модулей.
Достаточно посмотреть, сколько драйверов, которые могут быть собраны как модули, содержат строки начинающиеся с #include <asm/, чтобы понять, что это не так.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 08 окт 2015, 22:53

jcmvbkbc писал(а):У меня он отлично компилируется, загружается и выгружается.
Да, всё компилируется ...
Загружаться-выгружаться там нечему, потому что ничего не вызывается ;-) , но с компиляцией сяду посмотреть внимательнее.

jcmvbkbc
Интересующийся
Сообщения: 6
Зарегистрирован: 08 окт 2015, 21:05
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение jcmvbkbc » 08 окт 2015, 22:55

Olej писал(а):Загружаться-выгружаться там нечему, потому что ничего не вызывается ;-) , но с компиляцией сяду посмотреть внимательнее.
Символы связываются, загрузка это тестирует.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 08 окт 2015, 23:09

jcmvbkbc писал(а):
Olej писал(а):Загружаться-выгружаться там нечему, потому что ничего не вызывается ;-) , но с компиляцией сяду посмотреть внимательнее.
Символы связываются, загрузка это тестирует.
Это то всё понятно...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 11 окт 2015, 15:42

jcmvbkbc писал(а): Уточню, "явная ошибка" было сказано вот об этой фразе:
arch/x86/include/asm/tlbflush.h - файл который отсутствует, недоступен при компиляции модулей.
Достаточно посмотреть, сколько драйверов, которые могут быть собраны как модули, содержат строки начинающиеся с #include <asm/, чтобы понять, что это не так.
Вот этим местом мне заморочило голову обстоятельство, которое нужно описать, потому как с ним может столкнуться всяк, кто будет иметь дело с кодом ядра или модулей ядра.
Это нужно иметь в виду:

- я эти фрагменты кода сел смотреть на другом дистрибутиве Mint 17.1, Ubuntu-производный, который оказался под рукой.
- до того все kernel-зависимые вещи смотрел на соседних компьютерах с Fedora (разные версии за несколько последних лет, до 21-й)
- в Fedora сборщики пакета поместили /lib/modules/`uname -r`/build в компактный каталог где он и должен быть (это должно быть удобнее в процессе активного развития, изменений ... для пишущих ПО, наверное)

Код: Выделить всё

bash-4.2$ pwd
/lib/modules/3.19.3-100.fc20.i686/build

bash-4.2$ ls -l
итого 3376
drwxr-xr-x  32 root root    4096 апр  7  2015 arch
drwxr-xr-x   3 root root    4096 апр  7  2015 block
drwxr-xr-x   4 root root    4096 апр  7  2015 crypto
drwxr-xr-x 121 root root    4096 апр  7  2015 drivers
drwxr-xr-x   2 root root    4096 апр  7  2015 firmware
drwxr-xr-x  75 root root    4096 апр  7  2015 fs
drwxr-xr-x  30 root root    4096 апр  7  2015 include
drwxr-xr-x   2 root root    4096 апр  7  2015 init
drwxr-xr-x   2 root root    4096 апр  7  2015 ipc
-rw-r--r--   2 root root     252 мар  7  2014 Kconfig
drwxr-xr-x  14 root root    4096 апр  7  2015 kernel
drwxr-xr-x  11 root root    4096 апр  7  2015 lib
-rw-r--r--   1 root root   54445 мар 27  2015 Makefile
drwxr-xr-x   2 root root    4096 апр  7  2015 mm
-rw-r--r--   1 root root  969189 мар 27  2015 Module.symvers
drwxr-xr-x  59 root root    4096 апр  7  2015 net
drwxr-xr-x  13 root root    4096 апр  7  2015 samples
drwxr-xr-x  13 root root    4096 апр  7  2015 scripts
drwxr-xr-x   9 root root    4096 апр  7  2015 security
drwxr-xr-x  22 root root    4096 апр  7  2015 sound
-rw-r--r--   1 root root 2337661 мар 27  2015 System.map
drwxr-xr-x  16 root root    4096 апр  7  2015 tools
drwxr-xr-x   2 root root    4096 апр  7  2015 usr
drwxr-xr-x   3 root root    4096 апр  7  2015 virt
-rw-r--r--   1 root root      41 мар 27  2015 vmlinux.id
- в MInt (и в Ubuntu, наверное) - это (тоже там где ему и надлежит быть) система сложных ссылок на каталоги:

Код: Выделить всё

olej@nvidia ~/2015_WORK/HISTORY.nvidia/10/10 $ lsb_release -ircd
Distributor ID: LinuxMint
Description:    Linux Mint 17.1 Rebecca
Release:        17.1
Codename:       rebecca

olej@nvidia /lib/modules/3.13.0-37-generic/build $ ls -l
итого 1160
drwxr-xr-x 3 root root    4096 нояб. 27  2014 arch
lrwxrwxrwx 1 root root      32 апр.   4  2015 block -> ../linux-headers-3.13.0-37/block
lrwxrwxrwx 1 root root      33 апр.   4  2015 crypto -> ../linux-headers-3.13.0-37/crypto
lrwxrwxrwx 1 root root      40 апр.   4  2015 Documentation -> ../linux-headers-3.13.0-37/Documentation
lrwxrwxrwx 1 root root      34 апр.   4  2015 drivers -> ../linux-headers-3.13.0-37/drivers
lrwxrwxrwx 1 root root      35 апр.   4  2015 firmware -> ../linux-headers-3.13.0-37/firmware
lrwxrwxrwx 1 root root      29 апр.   4  2015 fs -> ../linux-headers-3.13.0-37/fs
drwxr-xr-x 5 root root    4096 нояб. 27  2014 include
lrwxrwxrwx 1 root root      31 апр.   4  2015 init -> ../linux-headers-3.13.0-37/init
lrwxrwxrwx 1 root root      30 апр.   4  2015 ipc -> ../linux-headers-3.13.0-37/ipc
lrwxrwxrwx 1 root root      33 апр.   4  2015 Kbuild -> ../linux-headers-3.13.0-37/Kbuild
lrwxrwxrwx 1 root root      34 апр.   4  2015 Kconfig -> ../linux-headers-3.13.0-37/Kconfig
drwxr-xr-x 2 root root    4096 нояб. 27  2014 kernel
lrwxrwxrwx 1 root root      30 апр.   4  2015 lib -> ../linux-headers-3.13.0-37/lib
lrwxrwxrwx 1 root root      35 апр.   4  2015 Makefile -> ../linux-headers-3.13.0-37/Makefile
lrwxrwxrwx 1 root root      29 апр.   4  2015 mm -> ../linux-headers-3.13.0-37/mm
-rw-r--r-- 1 root root 1168706 сент. 23  2014 Module.symvers
lrwxrwxrwx 1 root root      30 апр.   4  2015 net -> ../linux-headers-3.13.0-37/net
lrwxrwxrwx 1 root root      34 апр.   4  2015 samples -> ../linux-headers-3.13.0-37/samples
drwxr-xr-x 7 root root    4096 нояб. 27  2014 scripts
lrwxrwxrwx 1 root root      35 апр.   4  2015 security -> ../linux-headers-3.13.0-37/security
lrwxrwxrwx 1 root root      32 апр.   4  2015 sound -> ../linux-headers-3.13.0-37/sound
lrwxrwxrwx 1 root root      32 апр.   4  2015 tools -> ../linux-headers-3.13.0-37/tools
lrwxrwxrwx 1 root root      33 апр.   4  2015 ubuntu -> ../linux-headers-3.13.0-37/ubuntu
lrwxrwxrwx 1 root root      30 апр.   4  2015 usr -> ../linux-headers-3.13.0-37/usr
lrwxrwxrwx 1 root root      31 апр.   4  2015 virt -> ../linux-headers-3.13.0-37/virt
- а контекстный поиск по такой ссылочной структуре - не спускается по ссылкам (по крайней мере, контекстный поиск средствами поиска файлов менеджера mc - так иногда быстрее чем find) ... и тогда простейшие вещи, такие как константа _PAGE_RW - не находятся в заголовках, доступных по цепочке ссылок.

Вот про такие мелочи нужно помнить, чтобы так не попадать ... в засаду. ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модификация системных вызовов

Непрочитанное сообщение Olej » 17 окт 2015, 00:37

Продолжаем: "4 способа писать в защищённую страницу"
Вложения
4write_03.odt
(64.56 КБ) 305 скачиваний
4write.tgz
(6.71 КБ) 330 скачиваний

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей