__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



