日期: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. GC收集器种类

    转载:https://wangkang007.gitbooks.io/jvm/content/la_ji_shou_ji_qi.html 收集器 1.1 Serial(串行)收集器 Serial收集器 ...

  2. mysql explain中的type列含义和extra列的含义

    很多朋友在用mysql进行调优的时候都肯定会用到explain来看select语句的执行情况,这里简单介绍结果中两个列的含义. 1 type列 官方的说法,说这列表示的是“访问类型”,更通俗一点就是: ...

  3. centos 7 搭建pip源

    一.安装pip2pi工具: pip install pip2pi 或编译: git clone https://github.com/wolever/pip2pi cd pip2pi python s ...

  4. 2019.01.16 bzoj4399: 魔法少女LJJ(线段树合并)

    传送门 线段树合并菜题(然而findfindfind函数写错位置调了好久) 支持的操作题目写的很清楚了,然后有一个神奇的限制c≤7c\le7c≤7要注意到不然会去想毒瘤线段树的做法. 思路: 这题只有 ...

  5. 2018.12.18 bzoj2242: [SDOI2011]计算器(数论)

    传送门 数论基础题. 对于第一种情况用快速幂,第二种用exgcdexgcdexgcd,第三种用bsgsbsgsbsgs 于是自己瞎yyyyyy了一个bsgsbsgsbsgs的板子(不知道是不是数据水了 ...

  6. hdu 1540(线段树区间合并)

    题目链接:传送门 参考文章:传送门 题意:n个数字初始连在一条线上,有三种操作, D x表示x号被摧毁: R 表示恢复剩下的通路 Q表示查询标号为x所在的串的最长长度. 思路:线段树的区间合并. #i ...

  7. win/mac平台搭建ionic开发环境教程(转)

    出处:http://www.ionic-china.com/doc/ionic-winmac.html#preface 前言 ionic中文网为大家准备了绿色版的nodejs和androidSDK以及 ...

  8. TCP粘包问题分析和解决(全)

    TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送 ...

  9. C++STL deque

    deque双端数组 deque<int> dq; deque<int>::iterator it; dq.push_back();//尾部插入元素 dq.push_front( ...

  10. linux命令详解之useradd命令使用方法[linux下 添加用户、删除用户、修改用户密码、用户组管理]

    http://www.jb51.net/article/45848.htm Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...