[OS64][027]源码调试:程序4-11 调试过程 objdump bochs: info cpu、print-stack、sreg、breakpoint

[OS64][025]源码阅读:程序4-11:运行结果,数据结构,第一个进程init_task_union

https://www.jianshu.com/p/b30fb97a1dc4

[OS64][026]源码阅读:程序4-11 程序执行过程示意图

https://www.jianshu.com/p/9bcc6d573978

程序4-11 调试过程

  • 反汇编源码 objdump -D system
[anno@localhost kernel]$ objdump -D system > system.txt
  • 使用标号名/函数名快速锁定汇编源码,将其与C源码进行对应,从system.txt文件读取线性地址,将其转换成物理地址,就可以在bochs虚拟机里设置断点b 物理地址进行调试
    switch_to.PNG

一、在什么时候寄存器RSP的值被设置成了第一个进程的栈基地址

  • 第一个进程的栈空间,本质来源于全局变量联合体init_task_union其中的数组字段,这个全局变量位于整个内核的.data.init_task段内
  • 这里可以看到标号_stack_start处就是 就是数值 第一个进程栈空间栈基地址处
ENTRY(_stack_start)
    .quad   init_task_union + 32768
  • 在源码文件 head.S可以看到代码的布局,其中movq _stack_start(%rip), %rsp设置寄存器的RSP值成了第一个进程的栈空间的基地址
#include "linkage.h"

.section .text
ENTRY(_start)
. . .
    mov $0x7E00,    %esp

//=======   load GDTR
//=======   load    IDTR
//=======   load    cr3
//=======   64-bit mode code

switch_seg:
    .quad   entry64

entry64:
. . .
    movq    _stack_start(%rip), %rsp        
    /* rsp address */

setup_IDT:                          
. . .

rp_sidt:
. . .

setup_TSS64:
. . .

go_to_kernel:
    .quad   Start_Kernel

  • 在反汇编文件里可以查出语句所在的线性地址0xffff800000100065
ffff800000100052 <entry64>:

ffff800000100065:   48 8b 25 49 01 00 00    mov    0x149(%rip),%rsp        # ffff8000001001b5 <_stack_start>
  • 设置断点 ,查看运行前后的RSP,发现从0x7E00变成了0x120000
<bochs:8> b 0x100065
<bochs:9> c
(0) Breakpoint 3, 0xffff800000100065 in ?? ()
Next at t=59413777
(0) [0x000000100065] 0008:ffff800000100065 
(unk. ctxt): mov rsp, qword ptr ds:[rip+329] ; 488b2549010000

<bochs:10> info cpu
CPU0:
rsp: 00000000_00007e00

<bochs:11> s

<bochs:12> info cpu
CPU0:
rsp: ffff8000_00120000

二、何时才将寄存器RSP的值设置成第二个进程的栈基地址

  • 刚进入switch_to(宏)的时候,寄存器RSP的值是rsp: ffff8000_0011ff58
<bochs:7> info cpu
CPU0:
rax: ffff8000_00118000 rcx: 00000000_00000000
rdx: ffff8000_00200000 rbx: ffff8000_0010d700
rsp: ffff8000_0011ff58 rbp: ffff8000_0011ffa8
rsi: ffff8000_00200000 rdi: ffff8000_00118000
r8 : 00000000_00ffffff r9 : 00000000_00000000
r10: ffff8000_00007c00 r11: ffff8000_00007c00
r12: ffff8000_00200058 r13: ffff8000_00200058
r14: ffff8000_0010d700 r15: 00000000_00000000
rip: ffff8000_0010b5b2

  • 执行完 movq %2, %%rsp之后,寄存器的RSP存入第二个进程的RSP0,成为rsp: ffff8000_00207f40
<bochs:10> s
Next at t=62987240
(0) [0x00000010b5b8] 0008:ffff80000010b5b8 
(unk. ctxt): mov rsp, qword ptr ds:[r12+16] ; 498b642410

<bochs:11> s
Next at t=62987241
(0) [0x00000010b5bd] 0008:ffff80000010b5bd 
(unk. ctxt): lea rax, qword ptr ds:[rip+13] ; 488d050d000000

<bochs:12> info cpu
CPU0:
rax: ffff8000_00118000 rcx: 00000000_00000000
rdx: ffff8000_00200000 rbx: ffff8000_0010d700
rsp: ffff8000_00207f40 rbp: ffff8000_0011ffa8
rsi: ffff8000_00200000 rdi: ffff8000_00118000
r8 : 00000000_00ffffff r9 : 00000000_00000000
r10: ffff8000_00007c00 r11: ffff8000_00007c00
r12: ffff8000_00200058 r13: ffff8000_00200058
r14: ffff8000_0010d700 r15: 00000000_00000000
rip: ffff8000_0010b5bd

  • 执行完pushq %3
<bochs:14> s
Next at t=62987243
(0) [0x00000010b5c8] 0008:ffff80000010b5c8 
(unk. ctxt): push qword ptr ds:[r13+8] ; 41ff7508

<bochs:15> info cpu
CPU0:
rax: ffff8000_0010b5d1 rcx: 00000000_00000000
rdx: ffff8000_00200000 rbx: ffff8000_0010d700
rsp: ffff8000_00207f40 rbp: ffff8000_0011ffa8
rsi: ffff8000_00200000 rdi: ffff8000_00118000
r8 : 00000000_00ffffff r9 : 00000000_00000000
r10: ffff8000_00007c00 r11: ffff8000_00007c00
r12: ffff8000_00200058 r13: ffff8000_00200058
r14: ffff8000_0010d700 r15: 00000000_00000000
rip: ffff8000_0010b5c8


<bochs:16> s
Next at t=62987244
(0) [0x00000010b5cc] 0008:ffff80000010b5cc (unk. ctxt): jmp .-1138 (0xffff80000010b15f) ; e98efbffff

<bochs:17> info cpu
CPU0:
rax: ffff8000_0010b5d1 rcx: 00000000_00000000
rdx: ffff8000_00200000 rbx: ffff8000_0010d700
rsp: ffff8000_00207f38 rbp: ffff8000_0011ffa8
rsi: ffff8000_00200000 rdi: ffff8000_00118000
r8 : 00000000_00ffffff r9 : 00000000_00000000
r10: ffff8000_00007c00 r11: ffff8000_00007c00
r12: ffff8000_00200058 r13: ffff8000_00200058
r14: ffff8000_0010d700 r15: 00000000_00000000
rip: ffff8000_0010b5cc

  • 查看当前的栈内容,栈顶[0xffff8000:0x0010b06b]
<bochs:18> print-stack
Stack address size 8
 | STACK 0xffff800000207f38 [0xffff8000:0x0010b06b]
 | STACK 0xffff800000207f40 [0x00000000:0x00000000]
 | STACK 0xffff800000207f48 [0x00000000:0x00000000]
 | STACK 0xffff800000207f50 [0x00000000:0x00000000]
. . . 
  • [0xffff8000:0x0010b06b]kernel_thread_func的入口地址,这就是为什么函数__switch_to执行完后会跳转到kernel_thread_func执行的原因
ffff80000010b06b <kernel_thread_func>:
ffff80000010b06b:   41 5f                   pop    %r15
ffff80000010b06d:   41 5e                   pop    %r14
. . .
  • 直接设置断点到函数__switch_toretq处,可见当前处于内核代码段cs:0x0008 Code segment,而retq指令可以视为等价于IP=0x0010b06b(kernel_thread_func)
<bochs:19> b 0x10b2ed
<bochs:20> c

(0) Breakpoint 3, 0xffff80000010b2ed in ?? ()
Next at t=63156040
(0) [0x00000010b2ed] 0008:ffff80000010b2ed (unk. ctxt): ret                       ; c3

<bochs:22> sreg
cs:0x0008, dh=0x00209900, dl=0x00000000, valid=1
    Code segment, base=0x00000000, limit=0x00000000, Execute-Only, Non-Conforming, Accessed, 64-bit
ss:0x0010, dh=0x00009300, dl=0x00000000, valid=1
    Data segment, base=0x00000000, limit=0x00000000, Read/Write, Accessed

  • 接着进行单步执行,就进入了函数10b06b <kernel_thread_func>,当前rip的数值就可以验证这一点
<bochs:23> s
Next at t=63156041
(0) [0x00000010b06b] 0008:ffff80000010b06b 
(unk. ctxt): pop r15                   ; 415f

<bochs:24> info cpu
CPU0:
rsp: ffff8000_00207f40 
rip: ffff8000_0010b06b
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335