参考文章地址
整体加载图
汇编执行令
- mov: 赋值
- movl: mov long 四个字节,告知编译器的。
- sub : 相减
- sub a, a 清零操作
- xor: 异或
- xor a,a 清零操作
- jmpi: 段间跳转指令
- pushf: 标志寄存器压栈
- popf:标志寄存器出栈
- cld: 将寄存器DF标志位置0
- std: 将寄存器DF标志位置1
- rep: 重复
- ret: 返回
- call: 函数调用
寄存器
intel 访问内存分为:
- 代码
- 对应的寄存其为 代码段寄存器(cs)
- 数据
- 数据段寄存器(ds)
- 栈
- 栈段寄存器(ss)
白话描述:
cs:eip 表示了我们要执行哪里的代码。
ds:xxx 表示了我们要访问哪里的数据。
ss:esp 表示了我们的栈顶地址在哪里。
其它寄存器:
- idtr: 中断描述符表 idt
- gdtr:全局描述符表 gdt
- TSS:任务状态段描述符
- LDT: 局部描述符
- CR0: 机器状态字寄存器
- DF(Direction Flag): 方向控制位
- esp: 栈顶地址
- cs:eip:CPU 下一步准备执行的指令
描述表:
- idt : 中断描述表,存放在idtr中。
- gdt: 全局描述表,存放在gdtr中。
CR0:
31位:PG-分页机制标志位
30-19位: 保留位
0位:PE-保护模式开启标志位
CR3:
CR3含有存放页目录表页面的物理地址,因此CR3也被称为PDBR
专业名词
- MMU:内存管理单元 (有时也叫 PMMU,分页内存管理单元)
- IDT: Interrupt Description Table 中断描述表
- IDTR: Interrupt Description Table Register 中断描述表寄存器
- GDT: Global Description Table 全局描述表
- GDTR: Global Description Table Register 全局描述表寄存器
代码目录
. ├── Makefile ├── boot // 引导目录 (汇编代码) │ ├── bootsect.s // 移动磁盘引导程序至内存中 │ ├── head.s │ └── setup.s // 加载硬件信息,中断描述符表,全局描述符表 gdt ├── fs │ ├── Makefile │ ├── bitmap.c │ ├── block_dev.c │ ├── buffer.c │ ├── char_dev.c │ ├── exec.c │ ├── fcntl.c │ ├── file_dev.c │ ├── file_table.c │ ├── inode.c │ ├── ioctl.c │ ├── namei.c │ ├── open.c │ ├── pipe.c │ ├── read_write.c │ ├── stat.c │ ├── super.c │ └── truncate.c ├── include │ ├── a.out.h │ ├── asm │ │ ├── io.h │ │ ├── memory.h │ │ ├── segment.h │ │ └── system.h │ ├── const.h │ ├── ctype.h │ ├── errno.h │ ├── fcntl.h │ ├── linux │ │ ├── config.h │ │ ├── fdreg.h │ │ ├── fs.h │ │ ├── hdreg.h │ │ ├── head.h │ │ ├── kernel.h │ │ ├── mm.h │ │ ├── sched.h │ │ ├── sys.h │ │ └── tty.h │ ├── signal.h │ ├── stdarg.h │ ├── stddef.h │ ├── string.h │ ├── sys │ │ ├── stat.h │ │ ├── times.h │ │ ├── types.h │ │ ├── utsname.h │ │ └── wait.h │ ├── termios.h │ ├── time.h │ ├── unistd.h │ └── utime.h ├── init │ └── main.c ├── kernel │ ├── Makefile │ ├── asm.s │ ├── blk_drv │ │ ├── Makefile │ │ ├── blk.h │ │ ├── floppy.c │ │ ├── hd.c │ │ ├── ll_rw_blk.c │ │ └── ramdisk.c │ ├── chr_drv │ │ ├── Makefile │ │ ├── console.c │ │ ├── rs_io.s │ │ ├── serial.c │ │ ├── tty_io.c │ │ └── tty_ioctl.c │ ├── exit.c │ ├── fork.c │ ├── math │ │ ├── Makefile │ │ └── math_emulate.c │ ├── mktime.c │ ├── panic.c │ ├── printk.c │ ├── sched.c │ ├── signal.c │ ├── sys.c │ ├── system_call.s │ ├── traps.c │ └── vsprintf.c ├── lib │ ├── Makefile │ ├── _exit.c │ ├── close.c │ ├── ctype.c │ ├── dup.c │ ├── errno.c │ ├── execve.c │ ├── malloc.c │ ├── open.c │ ├── setsid.c │ ├── string.c │ ├── wait.c │ └── write.c ├── linux-0.11.iml ├── mm │ ├── Makefile │ ├── memory.c │ └── page.s └── tools └── build.c 14 directories, 100 files // 真巧,刚好100个文件,也不知道是不是故意为之