热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

30天自制操作系统第06天分割编译与中断处理

1.分割源文件(06_dayharib03a)  bookpack.c 拆分为以下三个文件:     graphic.c:绘画处理     dsctbl.c:GD

1.分割源文件(06_day/harib03a)

    bookpack.c  拆分为以下三个文件:

         graphic.c:绘画处理

         dsctbl.c : GDT,IDT等的处理

         bootpack.c 其他处理 

2.整理 makefile(06_day/harib03b)

      前一节c 语言文件变多,原有文件增加多个单个文件的处理脚本,以后每增加新的C文件,都要去修改 MaleFile,不利于维护,现在将两种类型单个文件的处理抽象成两个一般规则:

      %.gas : %.c MakeFile

           $(cc1) -o $*.gas $*.c

      %.nas : %.gas MakeFile

          $(GAS2NASK) $*.gas  $*.nas

       Make.exe  首先寻找普通规则,再去找一般规则

3.整理头文件

  将前述三个C文件中重复声明的函数和变量抽出来,生成一个bookpack.h文件,然后,各个c文件加上#include "bootpack.h"

4.naskfunc.nas里的_load_gdtr函数:

   _load_gdtr:                                 ;void load_gdtr(int limit,int addr)

               MOV   AX,[ESP + 4]         ;limit

               MOV   [ESP+6],AX          ;作者使用了技巧,[ESP + 8]存放的是地址

               LGDT  [ESP+6]                ;给GDTR赋值,从指定地址(此处[ESP+6])读取六字节

               RET

GDTR寄存器:48b(6字节),低16b是段上限‘

5.GDT结构和初始化代码的再次说明:

1) struct SEGMENT_DESCRIPTOR {

//只定义了与本书内容相关部分
short limit_low, //段上限低16b

short base_low; //段基址的低16b
char base_mid,//段基址的中8b,与前面低16b的组成段基址的低24b;

char access_right;  //高4b称为扩展访问权
char limit_high, //段上限高8b

char base_high; //段基址的高8b
}; //GDT 8字节内容

2) void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar)
{
if (limit > 0xfffff) {
ar |= 0x8000; /* G_bit = 1  如果为1,则limit的单位是页,一页4kb*/ 
limit /= 0x1000;
}
sd->limit_low = limit & 0xffff; 
sd->base_low = base & 0xffff;  //段基址的低16b
sd->base_mid = (base >> 16) & 0xff; //段基址的中8b,与前面低16b的组成段基址的低24b
sd->access_right = ar & 0xff;
sd->limit_high = ((limit >> 16) & 0x0f) | ((ar >> 8) & 0xf0);
sd->base_high = (base >> 24) & 0xff;
return;
}

3)ar的解释:

高4b:称为扩展访问权,"GD00",G指的是G bit,为1的话,段大小的单位不是字节,是页,一页4kb;D指段模式,1指32b,0代表16b

低8b:

       0x00:未使用

       0x92:系统专用,可读写,不可执行

       0x9a:系统专用,可执行,可读不可写

       0xf2:程序用,可读写,不可执行

       0xfa:程序用,可执行,可读不可写

6.初始化PIC(06_day/harib03d)

  PIC:可编程中断器

  要移动鼠标,必须使用中断,欲用中断,先必须初始化GDT和IDT

   

    

   

   



推荐阅读
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 如何查找和管理计算机中的C盘临时文件
    本文详细介绍了如何在计算机中找到和管理C盘的临时文件,包括其具体路径、环境变量设置方法以及清理这些文件对系统性能的影响。对于希望优化系统性能和释放磁盘空间的用户来说,这是一篇非常有价值的参考。 ... [详细]
author-avatar
兰毛zg
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有