ucore实验
Posted Nullan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ucore实验相关的知识,希望对你有一定的参考价值。
实验目的
了解操作系统开发实验环境
熟悉命令行方式的编译、调试工程
掌握基于硬件模拟器的调试技术
熟悉C语言编程和指针的概念
了解X86汇编语言
实验概述
lab1:硬件层实现,中断等
lab2:物理内存管理
lab3:虚拟内存管理
lab4:内核线程管理,CPU进程、线程管理
lab5:用户态进程管理
lab6:进程调度,进程运行选择
lab7:同步互斥
lab8:文件系统
X86-32理解
运行模式
有实模式、保护模式、SMM模式和虚拟8086模式
实模式:加电启动就是实模式,但是访问的物理内存空间不超过1GB,lab1就是从实模式到保护模式
保护模式:寻址空间从1GB到4GB,分页分段机制,这两种机制可以让程序间分级运行,让应用程序运行在低级,让操作系统运行在最高的0级,这样可以保证程序间的正常运行、互不干扰
32位处理器,所以能够访问到的就是2^32次方就是4GB
内存空间
物理地址:就是计算机在总线上访问计算机内存和外设的最终地址,计算机中内存条的地址就是物理地址。访问物理地址就是把内存条就是某一个单元的内容读出来
线性地址:由于段模式,让某一个应用程序有相对独立的地址空间,这个程序认为自己独占了计算机整个地址空间,每个运行的程序都认为自己独占整个计算机空间,所以保证计算机正常运行。这个空间叫做线性地址空间。
逻辑空间:应用程序直接使用的地址空间
段机制开启,页机制未开启:逻辑地址->段机制模式->线性地址=物理地址
段机制和页机制都开启:逻辑地址->段机制->线性地址->页机制->分页->物理地址
实际上就是一个地址映射关系,A映射到B,B映射到C,ABC内容是不一样的
通用寄存器:
寄存器内容就偷个懒…
段寄存器
用来访问各个段中的数据
指令寄存器等
ucore数据结构
双向链表
struct list_entry{
struct list_entry *prev,*next;
}list entry_t;
然后定义free_area
typedef struct{
list_entry_t free_list;
usigned nr_free;
}free area t;
然后定义page
struct Page{
…………
list_entry_t page_link;
}
这样page_link和free_list可以互相连接,这是一种通用的双向结构表示
访问节点所在数据结构
free area_t free_area;
list_entry_t* le = &free_area.free_list;
while((le != list_next(le))!=free_area.free_list){
struct Page*p = le2page(le,page_link);
}
运用了le2page宏,看一下怎么定义
#define le2page(le,member) to_struct((le),struct Page,member)
//le是链表数据结构所在的指针,member是它的名字,交给另一个宏实现,struct Page说明这个宏的执行需要另一个特定结构体实现
#define to_struct(ptr,type,member)
((type*)((char*)(ptr)-offsetof(type,member)))
//是这个page的地址,减去一个偏移值,得到宿主头指针
#define offsetof(type,member)
((size_t)(&((type*)0)->member))
//得到member在这个结构中的偏移
以上是关于ucore实验的主要内容,如果未能解决你的问题,请参考以下文章