xiaozhiwise头像
关注

debug for __startup_64

__startup_64() 是 Linux x86_64 内核在启动过程中,由汇编代码调用的第一个 C 语言函数。它的核心任务是为内核即将切换到自己的虚拟地址空间做准备,具体来说,就是修正页表、处理内存加密,并计算重定位偏移量

rdi=physaddr
rsi=struct boot_params
0x10001ec <__startup_64>        mov    %rdi,%rax        // rax=rdi=0x1000000
0x10001ef <__startup_64+3>      shr    $0x2e,%rax       // rax=0x1000000>>0x2e=0
0x10001f3 <__startup_64+7>      je     0x10001f7 <__startup_64+11>  // jump
0x10001f5 <__startup_64+9>      jmp    0x10001f5 <__startup_64+9>   // infinite loop, but not executed
0x10001f7 <__startup_64+11>     mov    %rdi,%rcx        // rcx=rdi=0x1000000
0x10001fa <__startup_64+14>     movabs $0x1000000,%rax  // rax=(_text - __START_KERNEL_map)=(0xffffffff81000000-0xffffffff80000000)=0x1000000                                                                       │
0x1000204 <__startup_64+24>     sub    %rax,%rdi        // load_delta = rdi=0x1000000-0x1000000=0
0x1000207 <__startup_64+27>     mov    %rdi,%r8         // r8 = 0
0x100020a <__startup_64+30>     and    $0x1fffff,%r8d
0x1000211 <__startup_64+37>     je     0x1000215 <__startup_64+41>
0x1000213 <__startup_64+39>     jmp    0x1000213 <__startup_64+39>
0x1000215 <__startup_64+41>     push   %rbp             // pgd = fixup_pointer(&early_top_pgt, physaddr)
0x1000216 <__startup_64+42>     mov    %rsp,%rbp
0x1000219 <__startup_64+45>     push   %r12
0x100021b <__startup_64+47>     push   %rbx
0x100021c <__startup_64+48>     lea    -0x7dc04000(%rcx),%rax     // rax=-0x7dc04000+0x1000000=0xffffffff823fc000=&early_top_pgt                                                                    │
0x1000223 <__startup_64+55>     sub    $0xffffffff81000000,%rax   // rax=0xffffffff823fc000-0xffffffff81000000=0x23fc000
0x1000229 <__startup_64+61>     movabs $0x220c067,%rdx            // rdx=0x220c067
0x1000233 <__startup_64+71>     add    %rdi,%rdx                  // rdx=0x220c067+0=0x220c067
0x1000236 <__startup_64+74>     mov    %rdx,0xff8(%rax)           // 0xff8=4096-8=4088, 0x23fcff8:0x000000000220c067
0x100023d <__startup_64+81>     lea    -0x7ddf4000(%rcx),%rdx     // rdx=-0x7ddf4000+0x1000000=0xffffffff8320c000
0x1000244 <__startup_64+88>     sub    $0xffffffff81000000,%rdx   // rdx=0xffffffff8320c000-0xffffffff81000000=0x220c000
0x100024b <__startup_64+95>     add    %rdi,0xff0(%rdx)           // 0x220cff0:0x000000000220d063
0x1000252 <__startup_64+102>    add    %rdi,0xff8(%rdx)           // 0x220cff8:0x000000000220e067
0x1000259 <__startup_64+109>    lea    -0x7ddf2000(%rcx),%rdx     // rdx=-0x7ddf2000+0x1000000=0xffffffff8320e000
0x1000260 <__startup_64+116>    sub    $0xffffffff81000000,%rdx   // rdx=0xffffffff8320e000-0xffffffff81000000=0x220e000
0x1000267 <__startup_64+123>    add    %rdi,0xfd8(%rdx)           // 0x220efd8:0x0000000002210067
0x100026e <__startup_64+130>    add    %rdi,0xfd0(%rdx)           // 0x220efd0:0x000000000220f067
0x1000275 <__startup_64+137>    lea    -0x7dbc2000(%rcx),%rdx     // rdx=-0x7dbc2000+0x1000000=0xffffffff8343e000
0x100027c <__startup_64+144>    sub    $0xffffffff81000000,%rdx   // rdx=0xffffffff8343e000-0xffffffff81000000=0x243e000
0x1000283 <__startup_64+151>    mov    (%rdx),%esi                // esi=0
0x1000285 <__startup_64+153>    mov    %esi,%r9d                  // r9d=0
0x1000288 <__startup_64+156>    shl    $0xc,%r9                   // r9=0
0x100028c <__startup_64+160>    add    $0xffffffff823fe000,%r9    // r9=0xffffffff823fe000
0x1000293 <__startup_64+167>    sub    $0xffffffff81000000,%r9    // r9=0x13fe000
0x100029a <__startup_64+174>    add    %rcx,%r9                   // r9=0x23fe000
0x100029d <__startup_64+177>    lea    0x2(%rsi),%r10d            // r10d=0x2
0x10002a1 <__startup_64+181>    mov    %r10d,(%rdx)               // 0x243e000:0x0000000000000002
0x10002a4 <__startup_64+184>    lea    0x1(%rsi),%esi             // esi=0x1
0x10002a7 <__startup_64+187>    shl    $0xc,%rsi                  // rsi=0x1000
0x10002ab <__startup_64+191>    add    $0xffffffff823fe000,%rsi   // rsi=0xffffffff823ff000
0x10002b2 <__startup_64+198>    sub    $0xffffffff81000000,%rsi   // rsi=0x13ff000
0x10002b9 <__startup_64+205>    add    %rcx,%rsi                  // rsi=0x23ff000
0x10002bc <__startup_64+208>    mov    %rsi,%r10                  // r10=0x23ff000
0x10002bf <__startup_64+211>    mov    %rcx,%r11                  // r11=0x1000000
0x10002c2 <__startup_64+214>    shr    $0x27,%r11                 // r11=0x1000000>>0x27=0x0
0x10002c6 <__startup_64+218>    lea    0x63(%r9),%rdx             // rdx=0x23fe063
0x10002ca <__startup_64+222>    mov    %rdx,(%rax,%r11,8)         // (0x23fc000+0x0*8)=0x23fc000:0x00000000023fe063
0x10002ce <__startup_64+226>    mov    %rdx,0x8(%rax,%r11,8)      // (0x23fc000+0x0*8)+0x8=0x23fc008:0x00000000023fe063
0x10002d3 <__startup_64+231>    mov    %rcx,%r11                  // r11=0x1000000
0x10002d6 <__startup_64+234>    shr    $0x1e,%r11                 // r11=0x0
0x10002da <__startup_64+238>    add    $0x63,%rsi                 // rsi=0x23ff063
0x10002de <__startup_64+242>    mov    $0x200,%ebx                // ebx=0x200
0x10002e3 <__startup_64+247>    mov    %r11d,%eax                 // eax=0x0
0x10002e6 <__startup_64+250>    cltd                              // eax-->edx:eax ---> edx=0x00000000,eax=0x00000000
0x10002e7 <__startup_64+251>    idiv   %ebx                       // eax=eax/ebx=0/0x200, eax=0,edx=0, (RAX:=Quotient,RDX:=Remainder)
0x10002e9 <__startup_64+253>    movslq %edx,%rdx                  // rdx=0
0x10002ec <__startup_64+256>    mov    %rsi,(%r9,%rdx,8)          // (0x23fe000+0*8)=0x23ff063, 0x23fe000:0x00000000023ff063
0x10002f0 <__startup_64+260>    lea    0x1(%r11),%eax             // eax=0x0+1=0x1
0x10002f4 <__startup_64+264>    cltd                              // eax-->edx:eax ---> edx=0x00000000,eax=0x00000001
0x10002f5 <__startup_64+265>    idiv   %ebx                       // 0x00000001/0x200 -> eax=0, edx=1
0x10002f7 <__startup_64+267>    movslq %edx,%rax                  // rax=0x1
0x10002fa <__startup_64+270>    mov    %rsi,(%r9,%rax,8)          // 0x23fe008:0x00000000023ff063
0x10002fe <__startup_64+274>    lea    -0x7dcd0550(%rcx),%rax     // rax=0xffffffff8332fab0
0x1000305 <__startup_64+281>    sub    $0xffffffff81000000,%rax   // rax=0x232fab0
0x100030b <__startup_64+287>    mov    (%rax),%rsi                // rsi=0xffffffffffffffff
0x100030e <__startup_64+290>    and    $0xe3,%esi                 // esi=0xe3
0x1000314 <__startup_64+296>    add    %rcx,%rsi                  // rsi=0x10000e3
0x1000317 <__startup_64+299>    mov    $0xffffffff8262c000,%rax   // rax=0xffffffff8262c000
0x100031e <__startup_64+306>    sub    $0xffffffff81000000,%rax   // rax=0x162c000
0x1000324 <__startup_64+312>    add    $0x1fffff,%rax             // rax=0x182bfff
0x100032a <__startup_64+318>    mov    %rax,%r11                  // r11=0x182bfff
0x100032d <__startup_64+321>    shr    $0x15,%r11                 // r11=0xc
0x1000331 <__startup_64+325>    cmp    $0x1fffff,%rax
0x1000337 <__startup_64+331>    jbe    0x100037c <__startup_64+400> // not jump
0x1000339 <__startup_64+333>    mov    %rcx,%rbx                  // rbx=0x1000000
0x100033c <__startup_64+336>    shr    $0x15,%rbx                 // rbx=0x8
0x1000340 <__startup_64+340>    mov    %r8,%rdx                   // rdx=0x0
0x1000343 <__startup_64+343>    mov    $0x0,%r9d                  // r9d=0x0
0x1000349 <__startup_64+349>    lea    (%r9,%rbx,1),%eax          // eax=(0x0+0x8*1)=0x8
0x100034d <__startup_64+353>    mov    %eax,%r12d                 // r12d=0x8
0x1000350 <__startup_64+356>    sar    $0x1f,%r12d                // r12d=0x8>>0x1f=0x0
0x1000354 <__startup_64+360>    shr    $0x17,%r12d                // r12d=0x8>>0x17=0x0
0x1000358 <__startup_64+364>    add    %r12d,%eax                 // eax=0x8
0x100035b <__startup_64+367>    and    $0x1ff,%eax                // eax=0x8
0x1000360 <__startup_64+372>    sub    %r12d,%eax                 // eax=0x8-0x0=0x8
0x1000363 <__startup_64+375>    cltq                              // eax-->edx:eax ---> edx=0x00000000,eax=0x00000008
0x1000365 <__startup_64+377>    shl    $0x15,%rdx                 // rdx=0x0
0x1000369 <__startup_64+381>    add    %rsi,%rdx                  // rdx=0x10000e3
0x100036c <__startup_64+384>    mov    %rdx,(%r10,%rax,8)         // (0x23ff000+0x8*8)=0x23ff040:0x00000000010000e3
0x1000370 <__startup_64+388>    add    $0x1,%r9d                  // r9d=0x1
0x1000374 <__startup_64+392>    movslq %r9d,%rdx                  // rdx=0x1
0x1000377 <__startup_64+395>    cmp    %rdx,%r11                  // r11=0xc
0x100037a <__startup_64+398>    ja     0x1000349 <__startup_64+349> // jump 0x1000349
0x100037c <__startup_64+400>    lea    -0x7ddf3000(%rcx),%r9        // r9=0xffffffff8320d000
0x1000383 <__startup_64+407>    sub    $0xffffffff81000000,%r9      // r9=0x220d000
0x100038a <__startup_64+414>    mov    %r9,%r10                     // r10=0x220d000
0x100038d <__startup_64+417>    mov    $0xffffffff81000000,%rsi     // rsi=0xffffffff81000000
0x1000394 <__startup_64+424>    shr    $0x15,%rsi                   // rsi=0xffffffff81000000>>0x15=0x7fffffffc08
0x1000398 <__startup_64+428>    and    $0x1ff,%esi                  // rsi=esi=0x8
0x100039e <__startup_64+434>    je     0x1000433 <__startup_64+583> // no jump
0x10003a4 <__startup_64+440>    mov    $0x0,%edx                    // edx=0x0
0x10003a9 <__startup_64+445>    andq   $0xfffffffffffffffe,(%r10,%r8,8) // (0x220d000+0*8)=0x00000000000001e3&0xfffffffffffffffe=0x00000000000001e2
0x10003ae <__startup_64+450>    add    $0x1,%edx                    // edx+=1
0x10003b1 <__startup_64+453>    movslq %edx,%r8                     // r8=edx
0x10003b4 <__startup_64+456>    cmp    %rsi,%r8                     // rsi=0x8
0x10003b7 <__startup_64+459>    jb     0x10003a9 <__startup_64+445> // jump
0x10003b9 <__startup_64+461>    mov    $0xffffffff8262c000,%rax     // rax=0xffffffff8262c000
0x10003c0 <__startup_64+468>    shr    $0x15,%rax                   // rax=0x7fffffffc13
0x10003c4 <__startup_64+472>    and    $0x1ff,%eax                  // eax=0x13
0x10003c9 <__startup_64+477>    cmp    %rax,%r8                     // rax=0x13, r8=0x8
0x10003cc <__startup_64+480>    jbe    0x100041e <__startup_64+562> // jump
0x10003ce <__startup_64+482>    cmp    $0x1ff,%edx
0x10003d4 <__startup_64+488>    jg     0x10003f9 <__startup_64+525>
0x10003d6 <__startup_64+490>    movslq %edx,%r8
0x10003d9 <__startup_64+493>    lea    (%r9,%r8,8),%rsi
0x10003dd <__startup_64+497>    mov    $0x1ff,%eax
0x10003e2 <__startup_64+502>    sub    %edx,%eax
0x10003e4 <__startup_64+504>    add    %r8,%rax
0x10003e7 <__startup_64+507>    lea    0x8(%r9,%rax,8),%rax
0x10003ec <__startup_64+512>    andq   $0xfffffffffffffffe,(%rsi)
0x10003f0 <__startup_64+516>    add    $0x8,%rsi
0x10003f4 <__startup_64+520>    cmp    %rax,%rsi
0x10003f7 <__startup_64+523>    jne    0x10003ec <__startup_64+512>
0x10003f9 <__startup_64+525>    lea    -0x7ddeeff0(%rcx),%rax
0x1000400 <__startup_64+532>    sub    $0xffffffff81000000,%rax
0x1000406 <__startup_64+538>    add    %rdi,(%rax) 
0x1000409 <__startup_64+541>    mov    $0x0,%eax
0x100040e <__startup_64+546>    pop    %rbx
0x100040f <__startup_64+547>    pop    %r12
0x1000411 <__startup_64+549>    pop    %rbp
0x1000412 <__startup_64+550>    retq
0x1000413 <__startup_64+551>    add    $0x1,%edx                    // edx=0x8, edx=0x8+1
0x1000416 <__startup_64+554>    movslq %edx,%r8                     // r8=0x09
0x1000419 <__startup_64+557>    cmp    %rax,%r8                     // rax=0x13
0x100041c <__startup_64+560>    ja     0x10003ce <__startup_64+482> // no jump
0x100041e <__startup_64+562>    lea    (%r10,%r8,8),%r8             // r8=(0x220d000+0x8*8)=0x220d040, 0x220d040:0x00000000010001e3
0x1000422 <__startup_64+566>    mov    (%r8),%rsi                   // rsi=0x10001e3
0x1000425 <__startup_64+569>    test   $0x1,%sil                    // sil=0xe3
0x1000429 <__startup_64+573>    je     0x1000413 <__startup_64+551> // no jump
0x100042b <__startup_64+575>    add    %rdi,%rsi                    // rsi=0x10001e3+0x0
0x100042e <__startup_64+578>    mov    %rsi,(%r8)                   // r8=0x220d040,0x220d040:0x00000000010001e3
0x1000431 <__startup_64+581>    jmp    0x1000413 <__startup_64+551> // jump 0x1000413
0x1000433 <__startup_64+583>    mov    $0xffffffff8262c000,%rax
0x100043a <__startup_64+590>    shr    $0x15,%rax
0x100043e <__startup_64+594>    and    $0x1ff,%eax
0x1000443 <__startup_64+599>    mov    %rsi,%r8
0x1000446 <__startup_64+602>    mov    $0x0,%edx
0x100044b <__startup_64+607>    jmp    0x100041e <__startup_64+562>

kernel version : 5.4

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/xiaozhiwise/article/details/163855092

文章来源crawl

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--