日期: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. openssl初步使用

    centos平台 md5.c #include <stdio.h> #include <string.h> #include <stdlib.h> //#inclu ...

  2. 使用jackson美化输出json/xml

    转载:http://www.cnblogs.com/xiwang/ 如何使用jackson美化输出json/xml 1.美化POJO序列化xml 下面将POJO列化为xml并打印. Person pe ...

  3. Centos上安装phpmyadmin

    查看PHP有没有安装:php -v查看apache有没有安装:httpd -v如已经安装则想办法删除. 一.安装Apache(默认安装目录etc/httpd/) 1. 使用yum命令安装Apache ...

  4. centos上安装jdk

    今天在centos上安装jdk,总结步骤如下:1.先到oracle下载rpm包:jdk-7u80-linux-x64.rpm (下载地址在百度找找)2.把jdk-7u80-linux-x64.rpm上 ...

  5. 27 isinstance与issubclass、反射、内置方法

    isinstance与issubclass issubclass:判断子类是否属于父类,是则返回True,否则返回False isinstance:判断对象是否属于类,是则返回True,否则返回Fal ...

  6. java web各个技术细节总结

    HTML 非表单标签 1.b 粗体   u 下划线 i 斜体 del 删除效果 2.a  超链接  href  target=-blank 3.img 图片 4.frameset(frame)  框架 ...

  7. 01.Java 开发简单的计算器

    难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习一. 实验介绍1.1 实验内容本次实验利用Java开发一个可以进行简单的四则运算的图形化计算器,会使用到 Java Swing ...

  8. Python中subprocess 模块 创建并运行一个进程

     python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下: from subprocess import call import shlex ...

  9. 2019.01.26 codeforces 1096G. Lucky Tickets(生成函数)

    传送门 题意简述:现在有一些号码由000~999中的某些数字组成(会给出),号码总长度为nnn,问有多少个号码满足前n2\frac n22n​个数码的和等于后n2\frac n22n​个数码的和(保证 ...

  10. Tomcat架构解析(一)-----Tomcat总体架构

    Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助. 一.Server   1.最简单的服务器结构 最简单的服务器结构如图所示: ...