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在这个结构中的偏移
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值