2012-03-18 38 views
15

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 ..

Trả lời

32

Mô-đun hạt nhân có thể định vị lại và được liên kết vào hạt nhân khi chúng được tải. Các địa chỉ bộ nhớ thực tế chỉ được xác định tại thời điểm đó. Điều này là do địa chỉ cho các hàm hạt nhân và địa chỉ mà tại đó mô-đun sẽ được tải, không được biết tại thời gian biên dịch.

Nếu bạn nhìn vào mã byte cho tất cả các hướng dẫn call, bạn sẽ thấy rằng tất cả chúng đều có bốn byte không. Khi mô-đun được tải, các byte này sẽ được thay thế bằng địa chỉ hàm thực tế. Điều này cũng đúng với địa chỉ chuỗi: Trong hướng dẫn mov $0x0,%rdi, số không sẽ được thay thế bằng địa chỉ chính xác.

Lý do bạn thấy hướng dẫn như callq 9callq 17 là hướng dẫn call chỉ định địa chỉ liên quan đến hướng dẫn tiếp theo. Vì địa chỉ tương đối được lưu trữ trong tệp là 0, trình tách rời sẽ hiển thị nó như thể lệnh call đang gọi lệnh sau nó.

Sử dụng objdump -r sẽ hiển thị cho bạn các định vị lại cho mô-đun.

Các vấn đề liên quan