基本工具使用

lab通关记录

MIT-6.828实验通关记录

首先清楚我们的实验大致流程:

  1. 编写代码(可能)
  2. 编译内核
  3. 调试或者查看os

因此给出以下基本工具/文件的介绍和基本使用

编译makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1.在你的clone文件夹下
make qemu
编译你的内核并运行qemu硬件模拟你的os,如果没有新改动,会编译非常快,

make clean
清除你的编译内核,以便于重新编译

make qemu-nox
与上面的唯一区别就是上面的会给出一个窗口,下面这个几乎没什么显示内容,ssh时候方便用

make qemu-gdb
一开始的实验最常用,他会等待接受gdb的到来

make qemu-nox-gdb
等同于 make-gdb && make-nox

make run-name
运行用户进程:usr/hello.c 下的编译运行,lab3后会使用

make run-name-nox, run-name-gdb, run-name-gdb-nox,
nox含义等同于前面

make V=1 ...
列出所有的执行命令和参数

make V=1 grade
grade失败后退出,日志在jos.out可以查看

make QEMUEXTRA='args' ...
指定给qemu额外的参数

qemu

硬件模拟器,你可以认为你的os在qemu上运行。想要退出:ctrl + a 和 x,需要注意ctrl 与 a同时按住抬起后再按c,不要三个键同时按

同时qemu也类似gdb可以给你一些调试信息查看:ctrl+a和c进入qemu模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
xp/Nx paddr
从指定的物理地址开始显示N个字,默认N=1

info registers
寄存器的信息,例子:CS =0008 10000000 ffffffff 10cf9a00 DPL=0 CS32 [-R-]
cs选择子 段基址 段限长 线性地址 权限 32位 只读

info mem
lab2+内存信息,例子:ef7c0000-ef800000 00040000 urw
efbf8000-efc00000 00008000 -rw

info pg
lab2+多进程页表结构,PDE做base,PTE做offset找到一个页表。进程页表查找过程:cr3-PDE-PTE。例子:
VPN range Entry Flags Physical page
[00000-003ff] PDE[000] -------UWP//一个进程
[00200-00233] PTE[200-233] -------U-P 00380 0037e 0037d 0037c 0037b 0037a ......
[00800-00bff] PDE[002] ----A--UWP//另一个进程
[00800-00801] PTE[000-001] ----A--U-P 0034b 00349
[00802-00802] PTE[002] -------U-P 00348


make QEMUEXTRA='-d int' ...
记录所有int中断信息,举例:
4: v=30 e=0000 i=1 cpl=3 IP=001b:00800e2e pc=00800e2e SP=0023:eebfdf28 EAX=00000005
EAX=00000005 EBX=00001002 ECX=00200000 EDX=00000000
ESI=00000805 EDI=00200000 EBP=eebfdf60 ESP=eebfdf28
...

JOS内核

内核编译之后,额外会产生一些文件:比如反汇编得到汇编文件等,让你更方便查看内核具体的情况。

obj目录下,分别有一些值得关注的目录:usr, boot, kernel

你可以使用gdb单独调试他们,来获得更短小方便的调试体验

GDB

当你第一次使用make qemu-gdb后,你应该再开一个同样路径的窗口运行make-gdb,这样就开始了第一次的实验调试。给出以下常见的gdb调试命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
b function or b file:line (or breakpoint)
设置一个断点,运行后会停在这里中断执行,例子:b main

b *addr (or breakpoint)
也可以指定指令的地址,例子:b * 0x7c00

c(or continue
运行

si(or stepi)
单汇编指令执行

<回车键>
重复执行上一条指令

quit
退出gdb

//接下来是稍微复杂一点的命令
set命令
set print address on/off 显示/不显示进入函数的地址,默认开袋
set print pretty on/off 打开或者关闭pretty模式,这样会影响结构体显示的美观程度
set print array on/off 打开则一个元素一行
show命令:如果只是想查看上述显示的效果,替换set,删除on/off即可

info registers
显示寄存器的值

i r eip/eax
更精准显示寄存器的值

x/Nx addr
显示地址开始的N个字,1.如果想要以字节形式,在末尾x加b,2.如果想使用寄存器,比如esp/ebp,将addr替换为$esp即可查看指向的指令字

x/Ni addr
以指定地址开始显示N条汇编指令(instructions)

symbol-file file
lab3开始:转向执行指定的文件,例子:symbol-file obj/usr/hello,或者你直接简写为file obj/usr/hello

//线程部分
thread n
关注某个线程(0开始)

info threads
线程信息

Objdump

反汇编工具,包括但不限于:提供反汇编代码文件,查看完整的ELF,查看ELF头,查看ELF section table等功能,给出以下代码,但是忘了可以通过 man objdump来回忆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
obdjump -d file反汇编文件代码部分
objdump -h file查看ELF文件头:魔数,main入口,
objdump -x file查看ELF所有头:file header, section headers, program headers,不建议一开始用
objdump -h file查看ELF节头:section个数,地址,等信息

补充:ELF格式:我们关注两个个header,section header,(programheader是section header的执行文件层面的一体两面表述)
1.ELF header文件头:所有section headers的base/offset等
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x1050
Start of program headers: 64 (bytes into file)
Start of section headers: 14768 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 11
Size of section headers: 64 (bytes)
Number of section headers: 29
Section header string table index: 28
2.ELF section header:所有布局上section的信息
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 00008154 000154 000019 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 00008170 000170 000020 00 A 0 0 4
[ 3] .note.gnu.build-i NOTE 00008190 000190 000024 00 A 0 0 4
[ 4] .gnu.hash GNU_HASH 000081b4 0001b4 000024 04 A 5 0 4
[ 5] .dynsym DYNSYM 000081d8 0001d8 000040 10 A 6 1 4
[ 6] .dynstr STRTAB 00008218 000218 00003c 00 A 0 0 1
[ 7] .gnu.version VERSYM 00008254 000254 000008 02 A 5 0 2
[ 8] .gnu.version_r VERNEED 0000825c 00025c 000020 00 A 6 1 4
[ 9] .rel.dyn REL 0000827c 00027c 000008 08 A 5 0 4
[10] .rel.plt REL 00008284 000284 000018 08 A 5 12 4
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2024 环烷烃
  • Visitors: | Views:

我很可爱,请我喝一瓶怡宝吧~

支付宝
微信