tôi đã viết module này kernel đơn giản:Newbie asm: mã cuộc gọi ở đâu?
#include <linux/module.h> // for printk()
int init(void)
{
printk("n Kello, everybody! nn");
return 0;
}
void exit(void)
{
printk("n Goodbye now... nn");
}
MODULE_LICENSE("GPL");
module_init(init);
module_exit(exit);
và tôi đang cố gắng để hiểu làm thế nào các mã được dịch sang asm, vì vậy tôi objdumped nó:
[email protected]:/home/alex/Desktop/KModule# objdump -D kmodule.ko
kmodule.ko: file format elf64-x86-64
Disassembly of section .note.gnu.build-id:
0000000000000000 <.note.gnu.build-id>:
0: 04 00 add $0x0,%al
2: 00 00 add %al,(%rax)
4: 14 00 adc $0x0,%al
6: 00 00 add %al,(%rax)
8: 03 00 add (%rax),%eax
a: 00 00 add %al,(%rax)
c: 47 rex.RXB
d: 4e 55 rex.WRX push %rbp
f: 00 5e ef add %bl,-0x11(%rsi)
12: 7d 73 jge 87 <__mod_vermagic5+0x4f>
14: 83 47 e9 4d addl $0x4d,-0x17(%rdi)
18: 98 cwtl
19: eb b8 jmp ffffffffffffffd3 <__mod_vermagic5+0xffffffffffffff9b>
1b: eb 18 jmp 35 <__module_depends+0x6>
1d: fb sti
1e: 84 28 test %ch,(%rax)
20: 73 db jae fffffffffffffffd <__mod_vermagic5+0xffffffffffffffc5>
22: 51 push %rcx
23: e4 .byte 0xe4
Disassembly of section .text:
0000000000000000 <init>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: e8 00 00 00 00 callq 9 <init+0x9>
9: 48 c7 c7 00 00 00 00 mov $0x0,%rdi
10: 31 c0 xor %eax,%eax
12: e8 00 00 00 00 callq 17 <init+0x17>
17: 31 c0 xor %eax,%eax
19: 5d pop %rbp
1a: c3 retq
1b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
0000000000000020 <cleanup_module>:
20: 55 push %rbp
21: 48 89 e5 mov %rsp,%rbp
24: e8 00 00 00 00 callq 29 <cleanup_module+0x9>
29: 48 c7 c7 00 00 00 00 mov $0x0,%rdi
30: 31 c0 xor %eax,%eax
32: e8 00 00 00 00 callq 37 <cleanup_module+0x17>
37: 5d pop %rbp
38: c3 retq
39: 00 00 add %al,(%rax)
...
Disassembly of section .rodata.str1.1:
0000000000000000 <.rodata.str1.1>:
0: 0a 20 or (%rax),%ah
2: 20 20 and %ah,(%rax)
4: 4b rex.WXB
5: 65 gs
6: 6c insb (%dx),%es:(%rdi)
7: 6c insb (%dx),%es:(%rdi)
8: 6f outsl %ds:(%rsi),(%dx)
9: 2c 20 sub $0x20,%al
b: 65 gs
c: 76 65 jbe 73 <__mod_vermagic5+0x3b>
e: 72 79 jb 89 <__mod_vermagic5+0x51>
10: 62 (bad)
11: 6f outsl %ds:(%rsi),(%dx)
12: 64 fs
13: 79 21 jns 36 <__module_depends+0x7>
15: 20 0a and %cl,(%rdx)
17: 0a 00 or (%rax),%al
19: 0a 20 or (%rax),%ah
1b: 20 20 and %ah,(%rax)
1d: 47 6f rex.RXB outsl %ds:(%rsi),(%dx)
1f: 6f outsl %ds:(%rsi),(%dx)
20: 64 fs
21: 62 (bad)
22: 79 65 jns 89 <__mod_vermagic5+0x51>
24: 20 6e 6f and %ch,0x6f(%rsi)
27: 77 2e ja 57 <__mod_vermagic5+0x1f>
29: 2e 2e 20 0a cs and %cl,%cs:(%rdx)
2d: 0a 00 or (%rax),%al
Disassembly of section .modinfo:
0000000000000000 <__mod_license27>:
0: 6c insb (%dx),%es:(%rdi)
1: 69 63 65 6e 73 65 3d imul $0x3d65736e,0x65(%rbx),%esp
8: 47 50 rex.RXB push %r8
a: 4c 00 73 72 rex.WR add %r14b,0x72(%rbx)
000000000000000c <__mod_srcversion31>:
c: 73 72 jae 80 <__mod_vermagic5+0x48>
e: 63 76 65 movslq 0x65(%rsi),%esi
11: 72 73 jb 86 <__mod_vermagic5+0x4e>
13: 69 6f 6e 3d 45 33 46 imul $0x4633453d,0x6e(%rdi),%ebp
1a: 38 45 32 cmp %al,0x32(%rbp)
1d: 30 39 xor %bh,(%rcx)
1f: 34 37 xor $0x37,%al
21: 44 32 31 xor (%rcx),%r14b
24: 33 30 xor (%rax),%esi
26: 32 35 44 36 39 34 xor 0x34393644(%rip),%dh # 34393670 <__mod_vermagic5+0x34393638>
2c: 34 45 xor $0x45,%al
...
000000000000002f <__module_depends>:
2f: 64 fs
30: 65 gs
31: 70 65 jo 98 <__mod_vermagic5+0x60>
33: 6e outsb %ds:(%rsi),(%dx)
34: 64 fs
35: 73 3d jae 74 <__mod_vermagic5+0x3c>
...
0000000000000038 <__mod_vermagic5>:
38: 76 65 jbe 9f <__mod_vermagic5+0x67>
3a: 72 6d jb a9 <__mod_vermagic5+0x71>
3c: 61 (bad)
3d: 67 69 63 3d 33 2e 30 imul $0x2e302e33,0x3d(%ebx),%esp
44: 2e
45: 30 2d 31 36 2d 67 xor %ch,0x672d3631(%rip) # 672d367c <__mod_vermagic5+0x672d3644>
4b: 65 6e outsb %gs:(%rsi),(%dx)
4d: 65 gs
4e: 72 69 jb b9 <__mod_vermagic5+0x81>
50: 63 20 movslq (%rax),%esp
52: 53 push %rbx
53: 4d 50 rex.WRB push %r8
55: 20 6d 6f and %ch,0x6f(%rbp)
58: 64 fs
59: 5f pop %rdi
5a: 75 6e jne ca <__mod_vermagic5+0x92>
5c: 6c insb (%dx),%es:(%rdi)
5d: 6f outsl %ds:(%rsi),(%dx)
5e: 61 (bad)
5f: 64 20 6d 6f and %ch,%fs:0x6f(%rbp)
63: 64 fs
64: 76 65 jbe cb <__mod_vermagic5+0x93>
66: 72 73 jb db <__mod_vermagic5+0xa3>
68: 69 .byte 0x69
69: 6f outsl %ds:(%rsi),(%dx)
6a: 6e outsb %ds:(%rsi),(%dx)
6b: 73 20 jae 8d <__mod_vermagic5+0x55>
...
Disassembly of section __mcount_loc:
0000000000000000 <__mcount_loc>:
...
Disassembly of section __versions:
0000000000000000 <____versions>:
0: 73 24 jae 26 <____versions+0x26>
2: 57 push %rdi
3: 41 00 00 add %al,(%r8)
6: 00 00 add %al,(%rax)
8: 6d insl (%dx),%es:(%rdi)
9: 6f outsl %ds:(%rsi),(%dx)
a: 64 fs
b: 75 6c jne 79 <____versions+0x79>
d: 65 gs
e: 5f pop %rdi
f: 6c insb (%dx),%es:(%rdi)
10: 61 (bad)
11: 79 6f jns 82 <____versions+0x82>
13: 75 74 jne 89 <____versions+0x89>
...
3d: 00 00 add %al,(%rax)
3f: 00 49 a0 add %cl,-0x60(%rcx)
42: e1 27 loope 6b <____versions+0x6b>
44: 00 00 add %al,(%rax)
46: 00 00 add %al,(%rax)
48: 70 72 jo bc <____versions+0xbc>
4a: 69 6e 74 6b 00 00 00 imul $0x6b,0x74(%rsi),%ebp
...
7d: 00 00 add %al,(%rax)
7f: 00 9a 0f 39 b4 00 add %bl,0xb4390f(%rdx)
85: 00 00 add %al,(%rax)
87: 00 6d 63 add %ch,0x63(%rbp)
8a: 6f outsl %ds:(%rsi),(%dx)
8b: 75 6e jne fb <__mod_vermagic5+0xc3>
8d: 74 00 je 8f <____versions+0x8f>
...
Disassembly of section .gnu.linkonce.this_module:
0000000000000000 <__this_module>:
...
18: 6b 6d 6f 64 imul $0x64,0x6f(%rbp),%ebp
1c: 75 6c jne 8a <__this_module+0x8a>
1e: 65 00 00 add %al,%gs:(%rax)
...
Disassembly of section .comment:
0000000000000000 <.comment>:
0: 00 47 43 add %al,0x43(%rdi)
3: 43 3a 20 rex.XB cmp (%r8),%spl
6: 28 55 62 sub %dl,0x62(%rbp)
9: 75 6e jne 79 <__mod_vermagic5+0x41>
b: 74 75 je 82 <__mod_vermagic5+0x4a>
d: 2f (bad)
e: 4c 69 6e 61 72 6f 20 imul $0x34206f72,0x61(%rsi),%r13
15: 34
16: 2e 36 2e 31 2d 39 75 cs ss xor %ebp,%cs:%ss:0x75627539(%rip) # 75627558 <__mod_vermagic5+0x75627520>
1d: 62 75
1f: 6e outsb %ds:(%rsi),(%dx)
20: 74 75 je 97 <__mod_vermagic5+0x5f>
22: 33 29 xor (%rcx),%ebp
24: 20 34 2e and %dh,(%rsi,%rbp,1)
27: 36 2e 31 00 ss xor %eax,%cs:%ss:(%rax)
2b: 00 47 43 add %al,0x43(%rdi)
2e: 43 3a 20 rex.XB cmp (%r8),%spl
31: 28 55 62 sub %dl,0x62(%rbp)
34: 75 6e jne a4 <__mod_vermagic5+0x6c>
36: 74 75 je ad <__mod_vermagic5+0x75>
38: 2f (bad)
39: 4c 69 6e 61 72 6f 20 imul $0x34206f72,0x61(%rsi),%r13
40: 34
41: 2e 36 2e 31 2d 39 75 cs ss xor %ebp,%cs:%ss:0x75627539(%rip) # 75627583 <__mod_vermagic5+0x7562754b>
48: 62 75
4a: 6e outsb %ds:(%rsi),(%dx)
4b: 74 75 je c2 <__mod_vermagic5+0x8a>
4d: 33 29 xor (%rcx),%ebp
4f: 20 34 2e and %dh,(%rsi,%rbp,1)
52: 36 2e 31 00 ss xor %eax,%cs:%ss:(%rax)
nhưng một cái gì đó không hoàn toàn ngăn xếp với phần còn lại ...
chức năng printk được gọi là gì? Tôi chỉ có thể nhìn thấy "callq 9", và bù đắp đó không cho tôi biết bất cứ điều gì .. đó là hướng dẫn tiếp theo .. vì vậy những gì? Thông báo "Kello" được in chính xác nhưng tôi không thể tìm thấy mã nơi điều này xảy ra!
Bên cạnh đó .. làm cách nào mã này có thể truy cập chuỗi "Kello v.v .." trong phần .rodata.str1.1? Nếu đây là một đoạn chương trình được ánh xạ vào đăng ký ds, không nên là một cái gì đó như "ds: 0" để truy cập nó?
Tôi khá bối rối ..