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 ...
随机推荐
- ajax 简介0
WEB项目总是发生些新的变化,过去每个人都会抱怨WEB项目功能不如CS程序丰富,相应速度不够快速.但现在由于Ajax的出现有了很大的改观,具有快速的高响应性的用户界面.在传统的Web 应用程序中,当用 ...
- Epson Pos Printer for .net
注:因发现各网站爬虫随意收集文章,故做此声明:版权归原作者(Leaf.Duan)所有,转载还请著名出处,谢谢 设备信息 Epson TM-T88IV Thermal Printer,爱普生 TM-T8 ...
- mysql里几个超时配置参数wait_timeout,net_read_timeout等
以下这些配置项单位都是秒,在mysql命令行中可以使用show global variables like '变量名';可查询配置值. connect_timeout:连接响应超时时间.服务器端在这个 ...
- unity3DGI
Realtime GI,实时全局光照, 1.构成 : 可实时更新的lightmap + 可实时更新的光照探头(light probe)+ 可实时更新的cubemap(Reflection probe) ...
- hadoop web管理界面不能打开问题
centos 7 安装好hadoop的,hadoop和yarn都正常启动,但是yarn的web界面(8088),hdfs的web界面(50070)都不能打开,防火墙是处于关闭状态. 修改默认启动级别, ...
- s5-15 开放的最短路径优先_OSPF
L-S路由协议的实例—OSPF 开放的路径优先(Open Shortest Path First) 使用图(graph)来表述真实的网络 - 每个路由器/Lan都是一个节点 - 测量代价/量度(met ...
- Jpa 报错 :HTTP Status 400 - Required String parameter 'xx' is not present
一.问题描述 使用Springboot JPA 做分页查询,报错Required String parameter 'xx' is not present,后端未接受到请求 二.解决方案: 使用的请求 ...
- 华为机试-iNOC产品部-杨辉三角的变形
题目描述 1 1 1 1 1 2 3 2 1 1 3 6 7 6 3 11 4 10 16 19 16 10 4 1以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,左上角数 ...
- usb_ctrl
IFCLK应该是clkout,与数据同步 flagd就是就是slcs FPGA的系统时钟用FX2LP的clkout时钟,个人觉得关键点在时钟是48M,别的异步时钟也是可以的. 模式配置 使用的模式是从 ...
- ckeditor粘帖上传图片控件-更新-2.0.15版本
泽优Word图片上传产品测试 泽优Word图片上传控件WordPaster2,基于php开发环境测试. 泽优软件官网Word图片上传产品介绍页面: http://www.ncmem.com/webap ...