日期: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
char buff [256];

static
char* string;

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的更多相关文章

  1. ## ucore Lab0 一些杂记

    ucore Lab0 一些杂记 前一阵子开始做 MIT 6.828,做了两三个实验才发现清华的 ucore 貌似更友好一些,再加上前几个实验也与6.828 有所重叠,于是决定迁移阵地. 文章计划分两类 ...

  2. 随想录(关于ucore)

    [ 声明:版权全部,欢迎转载.请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 之前用过一段时间skyeye,也对开发skyeye的陈渝有一些了解.近期在github上闲逛的 ...

  3. 操作系统:ucore的部分Bug&挑战练习

    ucore是清华大学提供的一个学习操作系统的平台.ucore有完整的mooc视频与说明文档. https://objectkuan.gitbooks.io/ucore-docs/content/# 本 ...

  4. ucore lab1 bootloader学习笔记

    ---恢复内容开始--- 开机流程回忆 以Intel 80386为例,计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CS:EIP确定,此时CS和IP的值分别是0xF000和0xFFF0 ...

  5. ucore lab1练习2 qemu+gdb 不能协作调试的问题make lab1-mon

    本练习是qemu结合gdb调试,但是我做实验的时候并不能像视频输入make lab1-mon那样顺利调试,期间有各种error,后来我找到原因,请看解决方法. 请先把ucore_lab文件删除,以下全 ...

  6. ucore文件系统详解

    最近一直在mooc上学习清华大学的操作系统课程,也算是复习下基本概念和原理,为接下来的找工作做准备. 每次深入底层源码都让我深感操作系统实现的琐碎,即使像ucore这样简单的kernel也让我烦躁不已 ...

  7. (五)bootloader 启动 ucore os

    Lab1 : bootloader 启动 ucore os 一.内容提要 x86启动顺序 C函数调用 gcc内联汇编(inline assembly) x86-32下的中断处理 小结 二.x86启动顺 ...

  8. 清华大学教学内核ucore学习系列(1) bootloader

    ucore是清华大学操作系统课程的实验内核,也是一个开源项目,是不可多得的非常好的操作系统学习资源 https://github.com/chyyuu/ucore_lab.git, 各位同学可以使用g ...

  9. ucore实验Lab1知识点总结

    Intel 80386 ucore目前支持的硬件环境是基于Intel 80386以上的计算机系统. Intel 80386是80x86系列中的第一种32位微处理器.80386的内部和外部数据总线都是3 ...

  10. 《ucore lab1 exercise5》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_s ...

随机推荐

  1. ajax 简介0

    WEB项目总是发生些新的变化,过去每个人都会抱怨WEB项目功能不如CS程序丰富,相应速度不够快速.但现在由于Ajax的出现有了很大的改观,具有快速的高响应性的用户界面.在传统的Web 应用程序中,当用 ...

  2. Epson Pos Printer for .net

    注:因发现各网站爬虫随意收集文章,故做此声明:版权归原作者(Leaf.Duan)所有,转载还请著名出处,谢谢 设备信息 Epson TM-T88IV Thermal Printer,爱普生 TM-T8 ...

  3. mysql里几个超时配置参数wait_timeout,net_read_timeout等

    以下这些配置项单位都是秒,在mysql命令行中可以使用show global variables like '变量名';可查询配置值. connect_timeout:连接响应超时时间.服务器端在这个 ...

  4. unity3DGI

    Realtime GI,实时全局光照, 1.构成 : 可实时更新的lightmap + 可实时更新的光照探头(light probe)+ 可实时更新的cubemap(Reflection probe) ...

  5. hadoop web管理界面不能打开问题

    centos 7 安装好hadoop的,hadoop和yarn都正常启动,但是yarn的web界面(8088),hdfs的web界面(50070)都不能打开,防火墙是处于关闭状态. 修改默认启动级别, ...

  6. s5-15 开放的最短路径优先_OSPF

    L-S路由协议的实例—OSPF 开放的路径优先(Open Shortest Path First) 使用图(graph)来表述真实的网络 - 每个路由器/Lan都是一个节点 - 测量代价/量度(met ...

  7. Jpa 报错 :HTTP Status 400 - Required String parameter 'xx' is not present

    一.问题描述 使用Springboot JPA 做分页查询,报错Required String parameter 'xx' is not present,后端未接受到请求 二.解决方案: 使用的请求 ...

  8. 华为机试-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,以下每行的每个数,是恰好是它上面的数,左上角数 ...

  9. usb_ctrl

    IFCLK应该是clkout,与数据同步 flagd就是就是slcs FPGA的系统时钟用FX2LP的clkout时钟,个人觉得关键点在时钟是48M,别的异步时钟也是可以的. 模式配置 使用的模式是从 ...

  10. ckeditor粘帖上传图片控件-更新-2.0.15版本

    泽优Word图片上传产品测试 泽优Word图片上传控件WordPaster2,基于php开发环境测试. 泽优软件官网Word图片上传产品介绍页面: http://www.ncmem.com/webap ...