Задержка Linux ядра pani c при изменении PFN в PTE - PullRequest
0 голосов
/ 16 января 2020

Я запускаю модуль ядра, и через некоторое время, когда модуль выгружается, я запускаю ядро ​​c.
Модуль ядра выполняет несколько действий.
1. virt_addr1 = kmallo c ( 4096);
2. virt_addr2 = kmallo c (4096);
3. найдите PTE для virt_addr1 и virt_addr2.
4. установите PFN virt_addr1 в PTE virt_addr2, поэтому virt_addr2 и virt_addr1 в основном указывает на один и тот же PFN и страницу.
5. очистка TLB с помощью вызова invlpg.
6. верните обратно PTE virt_addr2 в исходное PFN.
7. kfree (virt_adddr1) и kfree ( virt_addr2);
8. выгрузите модуль.

запустите make в модуле dir, а затем в ядре pani c следующим образом,

[ 1980.579451] RIP: 0010:[<ffffffff811ff44a>]  [<ffffffff811ff44a>] getname_kernel+0xda/0x120
[ 1980.583728] RSP: 0018:ffff8804a596bd38  EFLAGS: 00010283
[ 1980.586396] RAX: 1111111111111111 RBX: 1111111111111111 RCX: 0000000000000000
[ 1980.590111] RDX: 000000000001bd58 RSI: 1111111111111111 RDI: 111111111111112d
[ 1980.593795] RBP: ffff8804a596bd58 R08: ffff8804a0dfbc00 R09: 0000000000000000
[ 1980.597418] R10: 2d3638782d78756e R11: 00322e6f732e3436 R12: 000000000000001c
[ 1980.601093] R13: fffffffffffffff4 R14: ffff8804a1380f20 R15: ffff8804a1bee038
[ 1980.604736] FS:  00007efd1517c700(0000) GS:ffff8804bd940000(0000) knlGS:0000000000000000
[ 1980.608942] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 1980.611885] CR2: 00007fb42fc7ad0c CR3: 00000004a5864000 CR4: 00000000001406e0
[ 1980.615509] Stack:
[ 1980.616565]  ffff8800ba1fb380 ffff8804a0dfae00 00000000fffffff8 ffff8804a596c000
[ 1980.620540]  ffff8804a596bd78 ffffffff811f5b91 ffff8800ba1fb380 ffff8804a0dfae00
[ 1980.624527]  ffff8804a596be60 ffffffff81249e4c 0000000000000000 0000000000000000
[ 1980.628518] Call Trace:
[ 1980.629791]  [<ffffffff811f5b91>] open_exec+0x11/0x50
[ 1980.632362]  [<ffffffff81249e4c>] load_elf_binary+0x2bc/0x1710
[ 1980.635288]  [<ffffffff811a0222>] ? get_user_pages+0x52/0x60
[ 1980.638132]  [<ffffffff811f610e>] search_binary_handler+0x9e/0x1d0
[ 1980.641241]  [<ffffffff811f79dc>] do_execveat_common.isra.36+0x52c/0x710
[ 1980.645204]  [<ffffffff811f7e5a>] SyS_execve+0x3a/0x50
[ 1980.648518]  [<ffffffff81804ba5>] stub_execve+0x5/0x5
[ 1980.651829]  [<ffffffff8180491b>] ? entry_SYSCALL_64_fastpath+0x16/0x6a
[ 1980.655781] Code: 80 80 06 00 00 48 85 c0 74 0e 8b 00 85 c0 75 08 48 89 df e8 69 e7 f0 ff 49 89 dd 5b 4c 89 e8 41 5c 41 5d 41 5e 5d c3 48 8d 78 1c <48> 89 38 eb a3 48 8b 3d ca 34 d3 00 48 89 c6 49 c7 c5 dc ff ff  

1 Ответ

0 голосов
/ 19 января 2020

С большим количеством тестов и перезагрузок, я думаю, я нашел способ исправить pani c.
Между
6. Заменить обратно PTE virt_addr2 на исходный PFN.
7. kfree ( virt_adddr1) и kfree (virt_addr2);
Необходимо снова выполнить sh TLB после изменения PTE обратно на исходный PFN.

С этим промыванием TLB снова НЕ ПАНИ C.
Я не знаю причину, если кто-то может поделиться более подробной информацией, это будет здорово.

...