【OS学习笔记】三十七 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----主引导扇区代码

本文是以下几篇文章对应的主引导扇区代码汇编代码:

  • 【OS学习笔记】三十四 保护模式十:中断和异常区别
  • 【OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门
  • 【OS学习笔记】三十六 保护模式十:通过中断发起任务切换----中断任务
         ;代码清单17-1;文件名:c17_mbr.asm;文件说明:硬盘主引导扇区代码 ;创建日期:2012-07-13 11:20        ;设置堆栈段和栈指针 core_base_address equ 0x00040000   ;常数,内核加载的起始内存地址 core_start_sector equ 0x00000001   ;常数,内核的起始逻辑扇区号 ;===============================================================================
SECTION  mbr  vstart=0x00007c00         mov ax,cs      mov ss,axmov sp,0x7c00;计算GDT所在的逻辑段地址mov eax,[cs:pgdt+0x02]             ;GDT的32位物理地址 xor edx,edxmov ebx,16div ebx                            ;分解成16位逻辑地址 mov ds,eax                         ;令DS指向该段以进行操作mov ebx,edx                        ;段内起始偏移地址 ;跳过0#号描述符的槽位 ;创建1#描述符,保护模式下的代码段描述符mov dword [ebx+0x08],0x0000ffff    ;基地址为0,界限0xFFFFF,DPL=00 mov dword [ebx+0x0c],0x00cf9800    ;4KB粒度,代码段描述符,向上扩展 ;创建2#描述符,保护模式下的数据段和堆栈段描述符 mov dword [ebx+0x10],0x0000ffff    ;基地址为0,界限0xFFFFF,DPL=00mov dword [ebx+0x14],0x00cf9200    ;4KB粒度,数据段描述符,向上扩展 ;初始化描述符表寄存器GDTRmov word [cs: pgdt],23             ;描述符表的界限   lgdt [cs: pgdt]in al,0x92                         ;南桥芯片内的端口 or al,0000_0010Bout 0x92,al                        ;打开A20cli                                ;中断机制尚未工作mov eax,cr0                  or eax,1mov cr0,eax                        ;设置PE位;以下进入保护模式... ...jmp dword 0x0008:flush             ;16位的描述符选择子:32位偏移;清流水线并串行化处理器[bits 32]               flush:                                  mov eax,0x00010                    ;加载数据段(4GB)选择子mov ds,eaxmov es,eaxmov fs,eaxmov gs,eaxmov ss,eax                         ;加载堆栈段(4GB)选择子mov esp,0x7000                     ;堆栈指针;以下加载系统核心程序mov edi,core_base_addressmov eax,core_start_sectormov ebx,edi                        ;起始地址call read_hard_disk_0              ;以下读取程序的起始部分(一个扇区);以下判断整个程序有多大mov eax,[edi]                      ;核心程序尺寸xor edx,edxmov ecx,512                        ;512字节每扇区div ecxor edx,edxjnz @1                             ;未除尽,因此结果比实际扇区数少1dec eax                            ;已经读了一个扇区,扇区总数减1@1:or eax,eax                         ;考虑实际长度≤512个字节的情况jz pge                             ;EAX=0 ?;读取剩余的扇区mov ecx,eax                        ;32位模式下的LOOP使用ECXmov eax,core_start_sectorinc eax                            ;从下一个逻辑扇区接着读@2:call read_hard_disk_0inc eaxloop @2                            ;循环读,直到读完整个内核pge:;准备打开分页机制。从此,再也不用在段之间转来转去,实在晕乎~ ;创建系统内核的页目录表PDTmov ebx,0x00020000                 ;页目录表PDT的物理地址;在页目录内创建指向页目录表自己的目录项mov dword [ebx+4092],0x00020003 mov edx,0x00021003                 ;MBR空间有限,后面尽量不使用立即数;在页目录内创建与线性地址0x00000000对应的目录项mov [ebx+0x000],edx                ;写入目录项(页表的物理地址和属性)      ;此目录项仅用于过渡。;在页目录内创建与线性地址0x80000000对应的目录项mov [ebx+0x800],edx                ;写入目录项(页表的物理地址和属性);创建与上面那个目录项相对应的页表,初始化页表项 mov ebx,0x00021000                 ;页表的物理地址xor eax,eax                        ;起始页的物理地址 xor esi,esi.b1:       mov edx,eaxor edx,0x00000003                                                      mov [ebx+esi*4],edx                ;登记页的物理地址add eax,0x1000                     ;下一个相邻页的物理地址 inc esicmp esi,256                        ;仅低端1MB内存对应的页才是有效的 jl .b1;令CR3寄存器指向页目录,并正式开启页功能 mov eax,0x00020000                 ;PCD=PWT=0mov cr3,eax;将GDT的线性地址映射到从0x80000000开始的相同位置 sgdt [pgdt]mov ebx,[pgdt+2]add dword [pgdt+2],0x80000000      ;GDTR也用的是线性地址lgdt [pgdt]mov eax,cr0or eax,0x80000000mov cr0,eax                        ;开启分页机制;将堆栈映射到高端,这是非常容易被忽略的一件事。应当把内核的所有东西;都移到高端,否则,一定会和正在加载的用户任务局部空间里的内容冲突,;而且很难想到问题会出在这里。 add esp,0x80000000                 jmp [0x80040004]  ;-------------------------------------------------------------------------------
read_hard_disk_0:                           ;从硬盘读取一个逻辑扇区;EAX=逻辑扇区号;DS:EBX=目标缓冲区地址;返回:EBX=EBX+512 push eax push ecxpush edxpush eaxmov dx,0x1f2mov al,1out dx,al                          ;读取的扇区数inc dx                             ;0x1f3pop eaxout dx,al                          ;LBA地址7~0inc dx                             ;0x1f4mov cl,8shr eax,clout dx,al                          ;LBA地址15~8inc dx                             ;0x1f5shr eax,clout dx,al                          ;LBA地址23~16inc dx                             ;0x1f6shr eax,clor al,0xe0                         ;第一硬盘  LBA地址27~24out dx,alinc dx                             ;0x1f7mov al,0x20                        ;读命令out dx,al.waits:in al,dxand al,0x88cmp al,0x08jnz .waits                         ;不忙,且硬盘已准备好数据传输 mov ecx,256                        ;总共要读取的字数mov dx,0x1f0.readw:in ax,dxmov [ebx],axadd ebx,2loop .readwpop edxpop ecxpop eaxret;-------------------------------------------------------------------------------pgdt             dw 0dd 0x00008000     ;GDT的物理/线性地址
;-------------------------------------------------------------------------------                             times 510-($-$$) db 0db 0x55,0xaa

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

过滤JSON中的特殊字符

过滤方法用的是Discuz中的过滤方法&#xff01; /// <summary>/// 加载事件/// </summary>/// <param name"sender"></param>/// <param name"e"></param>protected void Page_Load(object sender, EventArgs e){if(!…

【OS学习笔记】三十八 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----微型内核汇代码

本文是以下几篇文章对应的微型内核代码汇编代码&#xff1a; 【OS学习笔记】三十四 保护模式十&#xff1a;中断和异常区别【OS学习笔记】三十五 保护模式十&#xff1a;中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十&#xff1a;通过中断发起任务切换----中断…

小议传统分层与新式分层,抑或与DDD分层

引言本文提到的分层只是软件架构上的分层。文中的传统分层指的是传统的三层结构&#xff1a;UI&#xff08;界面表现层&#xff09;,BLL&#xff08;业务逻辑层&#xff09;,DAL&#xff08;数据访问层&#xff09;。文中提出的观点也都是个人的一点认识&#xff0c;与任何组织…

【OS学习笔记】三十九 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务一代码

本文是以下几篇文章对应的动态加载的用户程序/任务一代码&#xff1a; 【OS学习笔记】三十四 保护模式十&#xff1a;中断和异常区别【OS学习笔记】三十五 保护模式十&#xff1a;中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十&#xff1a;通过中断发起任务切…

WCF 第八章 安全 客户端认证

一个服务的客户端认证是通过向服务提供一系列信赖的声明。声明可以是任何形式&#xff0c;只要客户端和服务端理解这个格式并信赖它的来源就可以。 如果客户端和服务端共享一个秘密信息&#xff0c;比如一个用户名和密码&#xff0c;只要客户端通过一个合法认证发送数据&#x…

前端学习(205):animation动画库

动画库 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" conte…

【OS学习笔记】四十 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务二代码

本文是以下几篇文章对应的微型动态加载的用户程序/任务二代码&#xff1a; 【OS学习笔记】三十四 保护模式十&#xff1a;中断和异常区别【OS学习笔记】三十五 保护模式十&#xff1a;中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十&#xff1a;通过中断发起任…

JS调用后台方法大全

javascript函数中执行C#代码中的函数&#xff1a;方法一&#xff1a; 1、首先建立一个按钮&#xff0c;在后台将调用或处理的内容写入button_click中;    2、在前台写一个js函数&#xff0c;内容为document.getElementById("btn1").click();    3、在前台或后…

【OS修炼指南目录】----《X86汇编语言-从实模式到保护模式》读书笔记目录表

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 本文是将个人的关于《X86汇编语言-从实模式…

C语言编译全过程剖析

内容摘要 C语言编译的整个过程是非常复杂的&#xff0c;里面涉及到的编译器知识、硬件知识、工具链知识都是非常多的&#xff0c;深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的&#xff0c;希望大家可以多了解一些&#xff0c;在遇到问题时多思考、多实践。 一…

【剑指offer - C++/Java】7、斐波那契数列

在线题目链接&#xff1a;斐波那契数列 文章目录1、题目描述2、题目分析3、代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1、题目描述 大家都知道斐波那契数列&#xff0c;现在要求输入一个整数n&a…

母版事件中注册javascript脚本

母版事件中注册javascript脚本 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ Title :㈠母版等事件中注册javascript脚本 Description: version : 1.0 Date :8:46 2008-3-26 Author : Tia…

【剑指offer - C++/Java】8、跳台阶

在线题目链接&#xff1a;跳台阶 文章目录1、题目描述2、题目分析3、代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1、题目描述 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳…

【剑指offer - C++/Java】9、变态跳台阶

题目链接&#xff1a;变态跳台阶 文章目录1 题目描述2 题目分析3 代码3.1 动态规划算法3.11 Java代码3.12 C代码3.2 递归算法3.21 Java代码3.22 C代码3.3 直接求解 公式&#xff1a;f(n)2^(n-1)^3.31 Java代码3.32 C代码4 总结1 题目描述 一只青蛙一次可以跳上1级台阶&#xf…

在Linux上构建ASP.NET环境-asp.net关注

在Linux上安装mono,xsp,mod_mono后&#xff0c;可以构建一个ASP.NET环境&#xff0c;Mono项目是由Novell支持的。mono官网地址&#xff1a;mono下载页面&#xff1a;/mono-downloads/download.htmlXSP是一个轻量级的Web服务器&#xff0c;它是用100%的C#代码写成的纯.Net应用程…

【剑指offer - C++/Java】10、矩形覆盖

在线题目链接&#xff1a;矩形覆盖 文章目录1 题目描述2 题目分析3 代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划算法3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形…

C++ primer 笔记(二)

第9章 sequential container 顺序容器: vector 快速随机访问 list快速插入删除 deque双端&#xff0c;随机访问 C<T> c; C c(c2); C c(b,e); //迭代器,数组,指针&#xff0c;不要求两个容器类型相同 C<T> c(n,t); //只适用与顺序容器 C<T> c(n…

【剑指offer - C++/Java】11、二进制中1的个数

在线题目链接&#xff1a;二进制中1的个数 文章目录1 题目描述2 题目分析2.1 方法12.11 Java代码2.12 C代码2.2 方法22.21 Java代码2.22 C代码3 总结1 题目描述 输入一个整数&#xff0c;输出该数二进制表示中1的个数。其中负数用补码表示。 2 题目分析 2.1 方法1 这道题看起…

IIS 启动不了(服务没有及时响应启动或控制请求)解决

以前用360时为了加快开机速度,经常禁用一些服务, 就是这样 Eventlog WorldWideWebPublishing Remote Procedure Call IIS Admin Service 把这些服务都启动了就能启动iis网站了转载于:https://www.cnblogs.com/x4646/articles/1948780.html

【剑指offer - C++/Java】12、数值的整数次方

在线题目链接&#xff1a;数值的整数次方 文章目录1 题目描述2 题目分析2.1 方法1 循环2.11 Java代码2.12 C代码2.2 方法2 递归2.21 Java代码2.22 C代码3 总结1 题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 2 题目分析 2.1 方…