初始化GDT 和 IDT

//初始化GDT 和 IDT
void Init_GDT_IDT(void)
{//将0x00270000开始的地址 存放GDT表 0x270000-0x27ffffstruct SEGMENT_DESCRIPTOR *pGDT_Add = (struct SEGMENT_DESCRIPTOR *) 0x00270000;//将0x0026f800开始的地址 存放GDT表 0x26f800-0x270000struct GATE_DESCRIPTOR *pIDT_Add = (struct GATE_DESCRIPTOR *) 0x0026f800;int i;//将GDT表全置0for(i = 0; i < 8192; i++){SetSegmDesc(pGDT_Add+i , 0, 0, 0);}//将IDT表全置0for(i = 0; i < 8192; i++){SetGateDesxc(pIDT_Add+i , 0, 0, 0);}SetSegmDesc(pGDT_Add+1 , 0xffffffff, 0x00000000, 0x4092);SetSegmDesc(pGDT_Add+2 , 0x0007ffff, 0x00280000, 0x409a,);load_gdtr(0xffff, 0x00270000);load_idtr(0x7ff, 0x0026f800);return ;
}

设置段描述符

//设置段描述符
void SetSegmDesc(struct SEGMENT_DESCRIPTOR *pSd,unsigned int unLimit, int nBase, int nAccessRight)
{if(unLimit > 0xfffff)//如果先要设置G位为1 每次访问1页{nAccessRight |= 0x8000;//G = 1unLimit /= 0x1000;//0x1000 = 4096 = 4KB}pSd->sLimitLow = unLimit & 0xffff;//获取偏移地址的低16位pSd->sBaseLow = nBase & 0Xffff; //获取段基址的低16位pSd->cBaseMid = (nBase >> 16) & 0xff; //获取段基址的中8位pSd->cAccessRight = nAccessRight & 0xff;//访问权限8位//拓展访问权限4位 偏移地址的高4位pSd->cLimitHigh = ((unLimit >> 16) & 0x0f) | ((nAccessRight >> 8) & 0xf0);pSd->cBaseHigh = (nBase >> 24) & 0xff;//获得高8位return;
}

设置门描述符

//设置门描述符
void SetGateDesxc(struct GATE_DESCRIPTOR *pGd, int nOffest,int nSelector, int nAccessRight)
{pGd->sOffsetLow = nOffest & 0xffff;pGd->sSelector = nSelector;pGd->cDwCount = (nAccessRight >> 8) & 0xff;pGd->cAccessRight = nAccessRight & 0xff;pGd->sOffsetHigh = (nOffest >> 16) & 0xffff;return;
}

Day_05初始化GDT和IDT相关推荐

  1. CPU实模式和保护模式、全局描述符表GDT、Linux内核中GDT和IDT的结构定义

    一 计算机实模式和保护模式 实模式 在实模式下,内存被限制为仅有1M字节(220 字节).有效的地址从00000到FFFFF (十六进制). 这些地址需要用20位的数来表示.一个20位的数不适合任何一 ...

  2. 操作系统之GDT和IDT(三)

    一.CPU的工作模式(寻址方式) 说GDT需要从CPU的工作模式开始说,在IA32架构(或称i386.X86-32或X86架构)下,CPU有多种工作模式:实模式和保护模式. CPU复位(reset)或 ...

  3. linux内核gdt,第三天:Linux内核完全剖析之GDT+LDT+IDT

    GDTR: 保存全局描述符表的32位基址和16位表长度值 IDTR:中断描述符表的32位线性基址和16位表长度值 lDTR:由两部分组成, 当使用LLDT把含有LDT表段的选择符加载到LDTR时,LD ...

  4. UEFI下windows启动过程

    引导文件  在UEFI安装完操作系统后,Windows至少使用两个分区,一个叫做ESP分区(EFI SYSTEM PARTITION),用于存放启动文件,另一个则是BIOS下正常的系统分区,不同的是, ...

  5. MIT-OS实验-lab1

    Lab 1 Part 1:PC Bootstrap 1.预备知识: BIOS: 第一代PC处理器是16位字长的Intel 8088处理器,这类处理器只能访问1MB的地址空间,即0x00000000-0 ...

  6. UEFI下Windows引导过程

    引导文件 在UEFI安装完操作系统后,Windows至少使用两个分区,一个叫做ESP分区(EFI SYSTEM PARTITION),用于存放启动文件,另一个则是BIOS下正常的系统分区,不同的是,B ...

  7. haribote bootpack.c 主任务程序代码阅读注释

    [ 1] haribote ipl09.nas 引导程序阅读注释. [ 2] haribote asmhead.nas 从实模式进入保护模式程序阅读注释. [ 3] haribote dsctbl.c ...

  8. Linux 0.00简单多任务内核head.s超详注释

    # head.s包含32位保护模式初始化设置代码.时钟中断代码.系统调用中断代码和两个任务的代码. # 在初始化完成之后程序移动到任务0开始执行,并在时钟中断控制下进行任务0和1之间的切换操作. LA ...

  9. jenkin swindows启动_windows启动过程

    展开全部 认真看完这个也许你会有收获的: Windows启动e68a84e8a2ad62616964757a686964616f31333231626165过程介绍 相信不少人碰到过装了个什么东西之后 ...

  10. 一个简单的多任务内核实例

    多任务程序结构和工作原理 本文给出的内核文件由两个文件构成.一个使用as86语言编制而成的引导启动程序boot.s,用于在计算机上电时从启动盘上把内核代码加载到内存中:另一个是使用GNU as 汇编语 ...

最新文章

  1. shiro+redis实现session共享
  2. windows server 2003 AD
  3. c语言字符串67ASDSff,(指针编程题目.doc
  4. 第二章mapper接口 和模糊查询
  5. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序
  6. 在县城投资买一辆出租车,一个月能收入多少钱?
  7. 【线性基】彩灯(luogu 3857/金牌导航 线性基-1)
  8. 防火墙迁移:提高安全弹性与可用性的5种方
  9. Node JS Buffer使用理解
  10. everything html修改,在HTML 5视频标签上更改源
  11. 2020华为软挑热身赛
  12. Listary基本操作
  13. 在条码打印软件中怎样批量导入图片
  14. 常用三角公式、变形及图形
  15. 经典Java题目:输入一个数字,输出它的大写汉字(阿拉伯数字转汉字)
  16. 管理Linux 系统的用户与用户组
  17. 【安卓】电脑执行脚本控制安卓手机
  18. 教你快速爬取哔哩哔哩整部番剧的视频弹幕
  19. scanf与getchar的区别
  20. JavaWeb-13 (购物车项目2)

热门文章

  1. linux chmod命令
  2. php使用redis作为消息队列
  3. fastDFS引入jar包后日志冲突
  4. Spring Cloud:Security OAuth2 自定义异常响应
  5. jdk动态代理异常处理分析,UndeclaredThrowableException
  6. netzapper操作
  7. 有关table的几个问题
  8. 【Python之旅】第一篇:基于文件处理的登陆接口
  9. python网络编程学习笔记(5):socket的一些补充
  10. 微信小程序微商城(二):电商首页轮播、分类导航和新品特卖实现