Я там же выше дополнил, почему это возможно.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