任务:阅读实验一makefile 搞清楚ucore.img是如何构建的

$@  $<  $^  这三个变量分别是什么意思 https://blog.csdn.net/YEYUANGEN/article/details/36898505

=和:=的区别 https://stackoverflow.com/questions/448910/what-is-the-difference-between-the-gnu-makefile-variable-assignments-a

dd命令 http://www.runoob.com/linux/linux-comm-dd.html

call命令

通配符

$(call create_target,ucore.img)不懂,create_target是内置函数?

makefile教程:https://blog.csdn.net/special00/article/details/51084619  包含call 函数调用的说明

找到一个TsingHua大佬在github的实验:https://github.com/dongyp13/os_lab/blob/master/labcodes/lab1/lab1-%E8%91%A3%E8%83%A4%E8%93%AC.md

GCC的-fno-builtin选项 https://blog.csdn.net/baiyu9821179/article/details/73007124

-gstabs
此选项以stabs格式声称调试信息,但是不包括gdb调试信息.

-gstabs+
此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.

-ggdb
此选项将尽可能的生成gdb的可以使用的调试信息.

GCC选项-g和-ggdb的区别 https://my.oschina.net/moooofly/blog/493859

Linux 中的 cc 命令 https://blog.csdn.net/candy060403/article/details/7519370

-nostdinc不要在标准系统目录中寻找头文件.只搜索`-I'选项指定的目录(以及当前目录,如果合适).

结合使用`-nostdinc'和`-I-'选项,你可以把包含文件搜索限制在显式指定的目录.

GCC 4.1 中三个与堆栈保护有关的编译选项

-fstack-protector:

启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码。

-fstack-protector-all:

启用堆栈保护,为所有函数插入保护代码。

-fno-stack-protector:

禁用堆栈保护。

有关堆栈保护内容 https://www.ibm.com/developerworks/cn/linux/l-cn-gccstack/index.html

-Idir在头文件的搜索路径列表中添加dir 目录.

-I-任何在`-I-'前面用`-I'选项指定的搜索路径只适用于`#include "file"'这种情况;他们不能用来搜索`#include <file>'包含的头文件.

如果用`-I'选项指定的搜索路径位于`-I-'选项后面,就可以在这些路径中搜索所有的 `#include'指令. (一般说来-I选项就是这么用的.)

还有, `-I-'选项能够阻止当前目录(存放当前输入文件的地方)成为搜索`#include "file"'的第一选择.没有办法克服`-I-'选项的这个效应.你可以指定 `-I.'搜索那个目录,它在调用编译器时是当前目录.这和预处理器的默认行为不完全一样,但是结果通常 令人满意.

`-I-'不影响使用系统标准目录,因此, `-I-'和`-nostdinc'是不同的选项.

-Ldir在`-l'选项的搜索路径列表中添加dir目录.

关于fno-builtin和fno-builtin-function编译选项

https://blog.csdn.net/SstudentT/article/details/52910696

CLI https://en.wikipedia.org/wiki/Interrupt_flag

CLD https://en.wikipedia.org/wiki/Direction_flag#cite_note-1

A20地址线 https://blog.csdn.net/ruyanhai/article/details/7181842

gdb 跳过当前断点进入下一个断点时别忘了输入 c

fwrite和fread函数的用法小结 https://blog.csdn.net/sky_qing/article/details/12783045

100个gdb小技巧  https://wizardforcel.gitbooks.io/100-gdb-tips/print-registers.html

(伪,不确定)代码说明指令行为:x86 Instruction Set Reference https://c9x.me/x86/

Makefile 中命令的@,-@,+@符号 作用 https://blog.csdn.net/elfprincexu/article/details/51886620

实模式切换到保护模式,为什么要开启A20地址线(系统升级产生的兼容性问题)https://blog.csdn.net/PacosonSWJTU/article/details/48005813

某位大佬ucore实验1-3  https://blog.csdn.net/winkar/article/details/40017573

(硬件信息比较详细)ucore操作系统实验笔记 - Lab1-3   https://segmentfault.com/a/1190000009386091

某位大佬ucore实验1-8 https://blog.csdn.net/qq_19876131/article/details/51706973

ucore实验之操作系统启动流程 http://blog.xiaohansong.com/2015/10/02/ucore%E5%AE%9E%E9%AA%8C%E4%B9%8B%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B/

ucore实验结构和ex实验?http://os.cs.tsinghua.edu.cn/oscourse/ucore/2016

某位大佬ucore实验1-8 https://blog.csdn.net/ni9htmar3/article/category/6793322

ucore的makefile部分解释 https://blog.csdn.net/u013484370/article/details/50638353

ucore 1-8 https://blog.csdn.net/tangyuanzong/article/category/7110079

ucore2,3,4,6 https://blog.csdn.net/th_num/article/category/6148598

ucore1-8 https://blog.csdn.net/cs_assult/article/category/3273629

操作系统:ucore的部分Bug&挑战练习 https://blog.csdn.net/He11o_Liu/article/details/54028501

全局描述符表格式:https://blog.csdn.net/yuzhihui_no1/article/details/42386915

分段模式:https://www.csie.ntu.edu.tw/~wcchen/asm98/asm/proj/b85506061/chap2/segment.html

asm.h中 .word是什么意思:.word就是在这个地方放一个值。相当于在这里定义一个数据变量。用.word定义了一个16bit的数据。http://sdnydubing.blog.163.com/blog/static/13747057020112904958830/

.byte应该就是8bit的数据变量吧?http://qvb3d.iteye.com/blog/1172510

段描述符:https://blog.csdn.net/longintchar/article/details/50489889

段描述符:http://guojing.me/linux-kernel-architecture/posts/segment-descriptor/

初始化各种段描述符:https://www.cnblogs.com/pacoson/p/4893177.html

关于asm.h 中的汇编宏

#define SEG_ASM(type,base,lim) \
.word (((lim) >> 12) & 0xffff), ((base) & 0xffff); \
.byte (((base) >> 16) & 0xff), (0x90 | (type)), \
(0xC0 | (((lim) >> 28) & 0xf)), (((base) >> 24) & 0xff)

这个是声明了两个16bit的数据变量和4个8bit的数据变量

段描述符是上下两条 一共64bit

关于上面这个汇编宏是考虑了大小端的,此处考虑x86是小端模式,即高位高地址,低位低地址,然后存的时候我们默认先从内存的低地址开始存

ljmp的含义:

0xffff0: ljmp $0xf000,$0xe05b 也就是说,BIOS开始的地址应该是 $cs << 4 | 0xe05b = 0xfe05b

# ljmp <imm1>, <imm2>
# %cs ← imm1
# %ip ← imm2

关于ljmp:

(7)

远程的转移指令和子程序调用指令的操作码名称,在AT&T格式中为“ljmp”和“lcall气而 在Intel格式中,则为"JMP FAR"和"CALL FAR"。当转移和调用的目标为直接操作数时, 两种不同的表示如下:

CALL FAR SECTION:OFFSET (Intel格式)

JMP FAR SECTIOM:OFFSET (Intel格式)

lcall $section, $offset (AT&T格式)

ljmp $section,$offset (AT&T格式)

与之相应的远程返回指令,则为:

RET FAR STACK_ADJUST(Intel格式)

lret $stack_adjust (AT&T格式)

由于我们要将实模式切换为保护模式,所以要关掉A20地址线,A20地址线的关闭要通过与Intel 8042控制器进行通信来实现

主要用到8042的两个端口

PS/2 compatibles.

IO Port Access Type Purpose
0x60 Read/Write Data Port
0x64 Read Status Register
0x64 Write Command Register

然后0x64是命令端口,0x60是数据端口

进行操作时要首先考虑该设备的状态信息,即缓冲区是否为空

Bit Meaning
0 Output buffer status (0 = empty, 1 = full)

(must be set before attempting to read data from IO port 0x60)

1 Input buffer status (0 = empty, 1 = full)

(must be clear before attempting to write data to IO port 0x60 or IO port 0x64)

2 System Flag

Meant to be cleared on reset and set by firmware (via. PS/2 Controller Configuration Byte) if the system passes self tests (POST)

3 Command/data (0 = data written to input buffer is data for PS/2 device, 1 = data written to input buffer is data for PS/2 controller command)
4 Unknown (chipset specific)

May be "keyboard lock" (more likely unused on modern systems)

5 Unknown (chipset specific)

May be "receive time-out" or "second PS/2 port output buffer full"

6 Time-out error (0 = no error, 1 = time-out error)
7 Parity error (0 = no error, 1 = parity error)

流程是,检查状态,缓冲区为空就写入命令端口,再次检查状态,缓冲区为空就写入数据端口将A20地址线标志位置位关闭

BIOS是系统自己的固件,不用管,当BIOS启动后的某一个阶段会将ucore.img?load 到0x7c00,然后将控制权交给0x7c00

而0x7c00后面就是我们的bootasm.S以及后面调用的bootmain.c合并之后的汇编代码

bootasm.S将A20关闭,定义了代码段和数据段的GDT表项,然后将栈空间定义为0x0000到0x7c00并且在这里呼叫了bootmain.c中的bootmain函数

bootmain在干什么尚不清楚,稍后研究。更新:bootmain是用来将文件kernel(elf格式)加载到内存中去,也就是解析elf格式的内核文件,elf:executable linkable file

bootmain连续加载了磁盘扇区(位于bootloader后面的连续的四个扇区),然后进行elf的解析

系统启动流程

1.系统加电 BIOS初始化硬件

2.BIOS读取主引导扇区代码

3.主引导扇区的代码读取活动分区的引导扇区代码

4.引导扇区的代码读取文件系统中的加载程序

加载程序bootloader

1.从文件系统中读取启动配置信息(加载程序)

2.启动菜单:可选的操作系统内核列表和加载参数

3.依据配置加载指定内核并跳转到内核执行

IRQ Numbers:https://www.webopedia.com/quick_ref/IRQnumbers.asp

中断向量符表:http://guojing.me/linux-kernel-architecture/posts/interrupt-descriptor-table/

又一位大佬(UESTC)的ucore实验1:http://xr1s.me/2018/05/15/ucore-lab1-report/

貌似gdb target链接qemu之后只能si调试了???https://github.com/chyyuu/ucore_os_lab/issues/39

calltree 查看函数调用 http://blog.51cto.com/chenqin/977113

各种段寄存器:https://wiki.osdev.org/CPU_Registers_x86#EFLAGS_Register

pusha指令:https://blog.csdn.net/ross1206/article/details/72831209  https://c9x.me/x86/html/file_module_x86_id_270.html

trapframe数据结构:http://www.cnblogs.com/fanzi2009/archive/2011/04/07/2008144.html

IBM内联汇编教程:https://www.ibm.com/developerworks/cn/linux/sdk/assemble/inline/index.html

中断指令以及中断和异常控制在x86手册的位置:https://c9x.me/x86/html/file_module_x86_id_142.html

关于ucore实验一的资料查找的更多相关文章

  1. Python多线程问题的资料查找与汇总

    Python多线程问题的资料查找与汇总 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途. 2)若本文档内有侵权文字或图片等内容,请联系作者bitpea ...

  2. ucore实验Lab1知识点总结

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

  3. lab_0 清华大学ucore实验环境配置详细步骤!(小白入)

    实验步骤 1.下载项目 从github上 的https://github.com/kiukotsu/ucore下载 ucore lab实验: git clone https://github.com/ ...

  4. Java web 实验三部分资料上传

    花好月圆系列 貂蝉 黄月英 孙尚香 甄姬 标准包 魏 曹操 司马懿 郭嘉 甄姬 张辽 许褚 夏侯惇 蜀 刘备 关羽 张飞 诸葛亮 黄月英 赵云 马超 吴 孙权 孙尚香 周瑜 大乔 甘宁 吕蒙 群 吕布 ...

  5. 《ucore lab6》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1: 使用 Round Robin 调度算法(不需要编码) 题目 完成练习0后,建议大家比较一下(可用kdiff3等文件比较软件) 个人完成 ...

  6. 《ucore lab1 exercise5》实验报告

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

  7. 《ucore lab7》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1: 理解内核级信号量的实现和基于内核级信号量的哲学家就餐问题(不需要编码) 题目 完成练习0后,建议大家比较一下(可用meld等文件dif ...

  8. 《ucore lab5》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1: 加载应用程序并执行(需要编码) 题目 do_execv函数调用load_icode(位于kern/process/proc.c中) 来 ...

  9. 《ucore lab2》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1:实现 first-fit 连续物理内存分配算法 题目 在实现first fit 内存分配算法的回收函数时,要考虑地址连续的空闲块之间的合 ...

随机推荐

  1. 解决ubuntu获取root账号并开通ssh

    1.设置root密码 sudo passwd root 2.修改etc/ssh/sshd_config文件 su - root vi /etc/ssh/sshd_config LoginGraceTi ...

  2. scrapy的大文件下载(基于一种形式的管道类实现)

    scrapy的大文件下载(基于一种形式的管道类实现) 爬虫类中将解析到的图片地址存储到item,将item提交给指定的管道 在管道文件中导包:from scrapy.pipelines.images ...

  3. Py装饰器

    装饰器: 1.定义,什么是装饰器 装饰器本质是一个函数,它是为了给其他函数添加附加功能 2.装饰器的两个原则 原则1   不修改被修饰函数的源代码原则2   不修改被修饰函数的调用方式 3.首先来看一 ...

  4. slice 切片实现 Slice object interface

    1.Python切片对象可以为任意类型 https://github.com/python/cpython/blob/master/Include/sliceobject.h /* Slice obj ...

  5. 一:Spring Boot 的配置文件 application.properties

    Spring Boot 的配置文件 application.properties 1.位置问题 2.普通的属性注入 3.类型安全的属性注入 1.位置问题 当我们创建一个 Spring Boot 工程时 ...

  6. Grafana+Prometheus通过node_exporter监控Linux服务器信息

    Grafana+Prometheus通过node_exporter监控Linux服务器信息 一.Grafana+Prometheus通过node_exporter监控Linux服务器信息 1.1nod ...

  7. 天天写同步,5种SpringMvc异步请求了解下!

    引言 说到异步大家肯定首先会先想到同步.我们先来看看什么是同步? 所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作. 简单来说,同步就是必须一件一件事做,等前一件 ...

  8. Java JDBC 模糊查询 避免输入_,%返回全部数据

    Java JDBC 模糊查询 避免输入_,%返回全部数据 "SELECT * FROM employees WHERE INSTR(first_name,?)>0 " 仅供参 ...

  9. .NET使用DinkToPdf将HTML转成PDF

    0.介绍 C# .NET Core wrapper for wkhtmltopdf library that uses Webkit engine to convert HTML pages to P ...

  10. Jenkins(1)安装

    前言 jenkins的环境搭建方法有很多,本篇使用docker快速搭建一个jenkins环境. 环境准备: mac/Linux docker docker拉去jenkins镜像 先下载jenkins镜 ...