日期: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. .net使用NPOI的XSSFWorkbook进行web开发中导出Excel

    之前也使用过NPOI导出excel,这次是因为在导出的excel里新增了几个列,正好超出了255的限制,所以又要改了. 今天主要出了4个问题: 1. Invalid column index (256 ...

  2. barcode(index)

    在很多情况下,我们需要把多个样本混合在一起,在同一个通道(lane)里完成测序.像转录组测序.miRNA测序.lncRNA测序.ChIP测序等等,通常每个样本所需要的数据量都比较少,远少于HiSeq一 ...

  3. java JNI 实现原理 (二) Linux 下如何 load JNILibrary

    在博客java JNI (一)虚拟机中classloader的JNILibrary 中讨论了java中的Library 是由classloader 来load的,那我们来看看 classloader是 ...

  4. org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403

    爬取网站的时候 conn = Jsoup.connect(url).timeout(5000).get();直接用get方法,有些网站可以正常爬取. 但是有些网站报403错误,403是一种在网站访问的 ...

  5. 2019.01.20 bzoj2238: Mst(kruskal+树链剖分)

    传送门 树链剖分菜题. 题意简述:给一个无向图,边有边权,每次询问删一条边(对后面的询问无影响)之后的最小生成树. 思路: 先跑一次kruskalkruskalkruskal并把跑出来的最小生成树给链 ...

  6. 2018.12.22 spoj7258 Lexicographical Substring Search(后缀自动机)

    传送门 samsamsam基础题. 题意简述:给出一个串,询问第kkk大的本质不同的串. 然而这就是弦论的简化版. 我们把samsamsam建出来然后贪心选择就行了. 代码: #include< ...

  7. linux vi操作

    1.“i”键,进入编辑状态.可以看到命令的下方出现了“--INSERT--”字样,表示成功进入了编辑模式; 2.“Esc”键,退出编辑模式.并在此时输入“:wq”以退出并保存

  8. react属性绑定

    1.属性值绑定state里的数据,不用引号 class App extends Component { constructor(props){ super(props); this.state = { ...

  9. jdk1.6的配置

    执行下列命令安装jdk1.7 /usr/lib/jvm$ sudo apt-get install openjdk-7-jdk openjdk-7-jre 会得到下面这两个文件: 查看当前jdk版本: ...

  10. MODULE_DEVICE_TABLE 的作用

    pci_device_id,PCI设备类型的标识符.在include/linux/mod_devicetable.h头文件中定义.struct pci_device_id {        __u32 ...