UCore-Lab0
日期:2019/3/31
内容:UCore-Lab0
一、UCore实验
实验 |
说明 |
关键词 |
Lab1 |
bootloader的实现 |
中断 |
Lab2 |
物理内存管理 |
x86分段/分页模式 |
Lab3 |
虚拟内存管理 |
缺页故障、页表替换 |
Lab4 |
内核线程管理 |
内核态线程 |
Lab5 |
用户进程管理 |
用户态进程创建、执行、切换和结束 |
Lab6 |
进度调度管理 |
CPU管理 |
Lab7 |
同步互斥 |
进程通信、死锁 |
Lab8 |
文件系统 |
IO访问、VFS |
二、AT&T语法
AT&T: asmop src, dst
Intel: asmop dst, src
AT&T |
Intel |
|
寄存器 |
%eax |
eax |
操作数顺序 |
movl %ebx, %eax |
mov eax, ebx |
立即数 |
movl $_val, %eax |
mov eax, _val |
地址 |
movl $0xd00d, %eax |
mov eax, 0xd00d |
操作数长度标识 |
movw %ax, %bx |
mov bx,ax |
寻址方式 |
imm32(base, index, scale) |
[base + index * scale + imm32] |
寻址方式对比。
AT&T |
Intel |
|
直接寻址 |
foo |
[foo] |
寄存器间接寻址 |
(%eax) |
[eax] |
变址寻址 |
_var(%eax) |
[eax + _var] |
_var(, %eax, 4) |
[eax * 4 + _var] |
|
_var(%ebx, %eax, 8) |
[ebx + eax * 4 + _var] |
三、gcc内联汇编
分两类:基本内联汇编和扩展内联汇编。
- 基本内联
单行格式:asm("inc %eax");
多行格式:
- 扩展内联
- 基本格式
__asm__ [volatile] ("asm statements" : outputs : inputs : registers-modified); |
注释:
·volatile可选,加上表示对asm编译不做处理。
·样板操作数:如下例子的%0, %1等。指令部中使用了几个样板操作数,就表明有几个变量需要与寄存器相结合,这样GCC和GAS在编译和汇编时会根据后面给定的约束条件进行恰当的处理。
·寄存器表示:%%eax。
·asm statements:写汇编指令段。
·outputs(对应dst操作数):规定输出变量如何与样板操作数进行结合的条件,每个条件称为一个"约束",必要时可以包含多个约束,相互之间用逗号分隔开。每个输出约束都以''=''号开始,然后紧跟一个对操作数类型进行说明的字后,最后是如何与变量相结合的约束。"=r"表示相应的目标操作数(指令部分的%0)可以使用任何一个通用寄存器,并且变量 __dummy存放在这个寄存器中。
·inputs(对应src操作数):输入约束的格式和输出约束相似,但不带''=''号。如果一个输入约束要求使用寄存器,则GCC在预处理时就会为之分配一个寄存器,并插入必要的指令将操作数装入该寄存器。与输入部中说明的操作数结合的寄存器或操作数本身,在执行完嵌入的汇编代码后也不保留执行之前的内容。
·registers-modified:这部分常常以"memory"为约束条件,以表示操作完成后内 存中的内容已有改变,如果原来某个寄存器的内容来自内存,那么现在内存中这个单元的内 容已经改变。乱码列表通知编译器,有些寄存器或内存因内联汇编块造成乱码,可隐式地破坏了条件寄存器的某些位(字段)。
- 例子1
int main() { int a = 10, b = 0; __asm__ __volatile__ ( "movl %1, %%eax;\\n\\r" "movl %%eax, %0;" :"=r"(b) :"r"(a) :"%eax" ); printf("Result: %d, %d\\n", a, b); } |
·函数功能:把a赋值给b ·变量b是输出操作数,通过%0来引用,而变量a是输入操作数,通过%1来引用。 ·最后一行"%eax"告诉GCC它将改变寄存器eax中的值,GCC在处理时不应使用该寄存器来存储任何其它的值。 ·由于变量b被指定成输出操作数,当内联汇编语句执行完毕后,它所保存的值将被更新。 |
- 例子2
#include <stdio.h> int count = 10; int val = 1; int buf[10]; void main() { asm ( "cld \n\t" "rep \n\t" "stosl" : :"c"(count), "a"(val), "D"(buf) ); int i = 0; for(i = 0; i < 10; i++) printf("%d ", buf[i]); } |
·函数功能:向buf写入count个val ·stosl:将EAX中的值保存到ES:EDI指向的地址 ·cld:edi+=4 ·inputs:count放入ecx,val放入eax,buf放入edi |
- 约束符
符号 |
含义 |
符号 |
含义 |
m v o |
内存单元 |
i h |
直接操作数 |
r |
任意reg |
E F |
浮点数 |
q |
eax/ebx/ecx/edx之一 |
g |
ea/b/c/dx或内存 |
a b c d |
分别表示eax,ebx,ecx,edx |
S D |
esi, edi |
I |
常数0-31 |
四、gdb
在可以使用gdb调试程序之前,必须使用 -g或-ggdb编译选项编译源文件。运行gdb调试 程序时通常使用如下的命令:
gdb progname |
- 命令分类
aliases:命令别名
breakpoints:断点定义;
data:数据查看;
files:指定并查看文件;
internals:维护命令;
running:程序执行;
stack:调用栈查看;
status:状态查看;
tracepoints:跟踪程序执行。
- 使用详细列表
break |
FILENAME:NUM 在特定源文件特定行上设置断点 |
clear |
FILENAME:NUM 删除设置在特定源文件特定行上的断点 |
run |
运行调试程序 |
step |
单步执行调试程序,不会直接执行函数 |
next |
单步执行调试程序,会直接执行函数 |
backtrace |
显示所有的调用栈帧。该命令可用来显示函数的调用顺序 |
where continue |
继续执行正在调试的程序 |
display EXPR |
每次程序停止后显示表达式的值,表达式由程序定义的变量组成 |
file FILENAME |
装载指定的可执行文件进行调试 |
help CMDNAME |
显示指定调试命令的帮助信息 |
info break |
显示当前断点列表,包括到达断点处的次数等 |
info files |
显示被调试文件的详细信息 |
info func |
显示被调试程序的所有函数名称 |
info prog |
显示被调试程序的执行状态 |
info local |
显示被调试程序当前函数中的局部变量信息 |
info var |
显示被调试程序的所有全局和静态变量名称 |
kill |
终止正在被调试的程序 |
list |
显示被调试程序的源代码 |
quit |
退出 gdb |
- 使用实例
static static int main () { printf ("Please input a string: "); gets (string); printf ("\nYour string is: %s\n", string); } |
命令行 gcc -o bug -g bug.c gdb bug |
- tui模式
进入gdb后,<Ctrl+X>,A,可显示代码窗口。
info win |
显示窗口的大小 |
layout next |
切换到下一个布局模式 |
layout prev |
切换到上一个布局模式 |
layout src |
只显示源代码 |
layout asm |
只显示汇编代码 |
layout split |
显示源代码和汇编代码 |
layout regs |
增加寄存器内容显示 |
focus cmd/src/asm/regs/next/prev |
切换当前窗口 |
refresh |
刷新所有窗口 |
tui reg next |
显示下一组寄存器 t |
ui reg system |
显示系统寄存器 |
update |
更新源代码窗口和当前执行点 |
winheight name +/- line |
调整name窗口的高度 |
tabset nchar |
设置tab为nchar个字符 |
五、qemu
参考文献
[1] https://www.cnblogs.com/feng-qi/articles/3055761.html
[2] http://blog.sina.com.cn/s/blog_51e9c0ab010099ow.html
UCore-Lab0的更多相关文章
- ## ucore Lab0 一些杂记
ucore Lab0 一些杂记 前一阵子开始做 MIT 6.828,做了两三个实验才发现清华的 ucore 貌似更友好一些,再加上前几个实验也与6.828 有所重叠,于是决定迁移阵地. 文章计划分两类 ...
- 随想录(关于ucore)
[ 声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 之前用过一段时间skyeye,也对开发skyeye的陈渝有一些了解.近期在github上闲逛的 ...
- 操作系统:ucore的部分Bug&挑战练习
ucore是清华大学提供的一个学习操作系统的平台.ucore有完整的mooc视频与说明文档. https://objectkuan.gitbooks.io/ucore-docs/content/# 本 ...
- ucore lab1 bootloader学习笔记
---恢复内容开始--- 开机流程回忆 以Intel 80386为例,计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CS:EIP确定,此时CS和IP的值分别是0xF000和0xFFF0 ...
- ucore lab1练习2 qemu+gdb 不能协作调试的问题make lab1-mon
本练习是qemu结合gdb调试,但是我做实验的时候并不能像视频输入make lab1-mon那样顺利调试,期间有各种error,后来我找到原因,请看解决方法. 请先把ucore_lab文件删除,以下全 ...
- ucore文件系统详解
最近一直在mooc上学习清华大学的操作系统课程,也算是复习下基本概念和原理,为接下来的找工作做准备. 每次深入底层源码都让我深感操作系统实现的琐碎,即使像ucore这样简单的kernel也让我烦躁不已 ...
- (五)bootloader 启动 ucore os
Lab1 : bootloader 启动 ucore os 一.内容提要 x86启动顺序 C函数调用 gcc内联汇编(inline assembly) x86-32下的中断处理 小结 二.x86启动顺 ...
- 清华大学教学内核ucore学习系列(1) bootloader
ucore是清华大学操作系统课程的实验内核,也是一个开源项目,是不可多得的非常好的操作系统学习资源 https://github.com/chyyuu/ucore_lab.git, 各位同学可以使用g ...
- ucore实验Lab1知识点总结
Intel 80386 ucore目前支持的硬件环境是基于Intel 80386以上的计算机系统. Intel 80386是80x86系列中的第一种32位微处理器.80386的内部和外部数据总线都是3 ...
- 《ucore lab1 exercise5》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_s ...
随机推荐
- GC收集器种类
转载:https://wangkang007.gitbooks.io/jvm/content/la_ji_shou_ji_qi.html 收集器 1.1 Serial(串行)收集器 Serial收集器 ...
- mysql explain中的type列含义和extra列的含义
很多朋友在用mysql进行调优的时候都肯定会用到explain来看select语句的执行情况,这里简单介绍结果中两个列的含义. 1 type列 官方的说法,说这列表示的是“访问类型”,更通俗一点就是: ...
- centos 7 搭建pip源
一.安装pip2pi工具: pip install pip2pi 或编译: git clone https://github.com/wolever/pip2pi cd pip2pi python s ...
- 2019.01.16 bzoj4399: 魔法少女LJJ(线段树合并)
传送门 线段树合并菜题(然而findfindfind函数写错位置调了好久) 支持的操作题目写的很清楚了,然后有一个神奇的限制c≤7c\le7c≤7要注意到不然会去想毒瘤线段树的做法. 思路: 这题只有 ...
- 2018.12.18 bzoj2242: [SDOI2011]计算器(数论)
传送门 数论基础题. 对于第一种情况用快速幂,第二种用exgcdexgcdexgcd,第三种用bsgsbsgsbsgs 于是自己瞎yyyyyy了一个bsgsbsgsbsgs的板子(不知道是不是数据水了 ...
- hdu 1540(线段树区间合并)
题目链接:传送门 参考文章:传送门 题意:n个数字初始连在一条线上,有三种操作, D x表示x号被摧毁: R 表示恢复剩下的通路 Q表示查询标号为x所在的串的最长长度. 思路:线段树的区间合并. #i ...
- win/mac平台搭建ionic开发环境教程(转)
出处:http://www.ionic-china.com/doc/ionic-winmac.html#preface 前言 ionic中文网为大家准备了绿色版的nodejs和androidSDK以及 ...
- TCP粘包问题分析和解决(全)
TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送 ...
- C++STL deque
deque双端数组 deque<int> dq; deque<int>::iterator it; dq.push_back();//尾部插入元素 dq.push_front( ...
- linux命令详解之useradd命令使用方法[linux下 添加用户、删除用户、修改用户密码、用户组管理]
http://www.jb51.net/article/45848.htm Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...