交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
3 GDT与段寄存器
分享
未结
0
1736
李延
LV6
2022-10-30
悬赏:20积分
# 1 GDT 前面我们介绍了段寄存器的作用。那么现在我们看一些GDT 每项的结构 ![image-20220612145631394](https://www.lioyan.cn/img/image-20220612145631394.png) - 基段地址:当前段最开始的物理地址。 - 段界限:当前段的大小。 - G : 段界限的单位 0 是为字节,1时为4KB - S : 描述符类型 0 系统段、1数据段或代码段 - DPL:特权等级 0-3级别 - P : 段存在位,表示当前段是否存在,当内存不足时,内存会被缓存在磁盘上,如果当前段不存在,就会发生中断,让操作系统来加载 - D/B: 是“ 默认 的 操作 数 大小”( Default Operation Size) 或者“ 默认 的 栈 指针 大小”( Default Stack Pointer Size), 又 或者“ 上部 边界”( Upper Bound) 标志。 - L : 64位代码段标志 - TYPE:描述符的子类型,4位分别为X E W A - AVL: 预留给操作系统使用 ## 1.1 TYPE 的含义 ![image-20220614155247869](https://www.lioyan.cn/img/image-20220614155247869.png) # 2 段寄存器 ![image-20221029170740477](https://www.lioyan.cn/img/image-20221029170740477.png) 这里我们看到分为3个部分,其中 3~15 位为描述符索引,这里我们首先只关注这几位,其他的都设置为0。 # 3 代码示例 示例代码地址:[liooyan/liyux-os at 初始化gdt (github.com)](https://github.com/liooyan/liyux-os/tree/初始化gdt) 其中标签: `初始化gdt `为本章内容。 ## 3.1 定义gdt 结构体 首先我们根据上面图中的GDT,应用对应的结构体 ```c typedef struct { u16 offset_1; // 低16位偏移地址 u16 base_address_1; //低16位基地址 u8 base_address_2; //中8位基地址 u8 type_dpl; //定义高32位中,8-15位的信息 u8 attr_offset_2; //定义高32位中,16-23位的信息 u8 base_address_3; //高8位基地址 } gdt_descriptor_t; ``` ## 3.2 加载GDT 在boot.s 中我们首先竟然的是_set_gdt 方法,如下: ```c call _set_gdt # 进入main方法 call _setup_init # 进入main方法 ``` 这里我们创建了gdt 的数组,并加载了它 ```c void _init_gdt() { set_gdt_entry(0, 0, 0, 0, 0); set_gdt_entry(1, 0, 0xfffff, GDT_DEF_ATTR, GDT_R0_CODE); set_gdt_entry(2, 0, 0xfffff, GDT_DEF_ATTR, GDT_R0_DATA); load_gdt(); } ``` 而后,将我们的段寄存器都是在为我们新的段选择子。之后再进入的_setup_init 方法
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号