• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Linux内核系列—12.b.操作系统开发之从Loader跳入保护模式,12.bloader

Linux内核系列—12.b.操作系统开发之从Loader跳入保护模式,12.bloader

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了Linux内核系列—12.b.操作系统开发之从Loader跳入保护模式,12.bloader等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Linux内核系列—12.b.操作系统开发之从Loader跳入保护模式,12.bloader


现在,内核已经被我们加载进内存了,该是跳入保护模式的时候了。

首先是GDT以及对应的选择子,我们只定义三个描述符,分别是一个0~4GB的可执行段、一个0~4GB的可读写段和一个指向显存开始地址的段:

; GDT
;                            段基址     段界限, 属性
LABEL_GDT:	    Descriptor 0,            0, 0              ; 空描述符
LABEL_DESC_FLAT_C:  Descriptor 0,      0fffffh, DA_CR|DA_32|DA_LIMIT_4K ;0-4G
LABEL_DESC_FLAT_RW: Descriptor 0,      0fffffh, DA_DRW|DA_32|DA_LIMIT_4K;0-4G
LABEL_DESC_VIDEO:   Descriptor 0B8000h, 0ffffh, DA_DRW|DA_DPL3 ; 显存首地址

GdtLen		equ	$ - LABEL_GDT
GdtPtr		dw	GdtLen - 1				; 段界限
		dd	BaseOfLoaderPhyAddr + LABEL_GDT		; 基地址

; GDT 选择子
SelectorFlatC		equ	LABEL_DESC_FLAT_C	- LABEL_GDT
SelectorFlatRW		equ	LABEL_DESC_FLAT_RW	- LABEL_GDT
SelectorVideo		equ	LABEL_DESC_VIDEO	- LABEL_GDT + SA_RPL3

在之前学习保护模式时,大部分描述符的段基址都是运行时计算后填入相应位置的,因为那时我们的程序是由BIOS或者DOS加载的,我们不知道段地址,于是也就不知道程序运行时在内存中的位置。

如今,Loader是由我们自己加载的,段地址已经被确定为BaseOfLoader,所以在Loader中出现的标号(变量)的物理地址可以用下面的公式来表示:

标号(变量)的物理地址=BaseOfLoader*10h+标号(变量)的偏移

我们把它以及相应的声明放在load.inc中。

BaseOfLoader	    equ	 09000h	; LOADER.BIN 被加载到的位置 ----  段地址
OffsetOfLoader	    equ	  0100h	; LOADER.BIN 被加载到的位置 ---- 偏移地址

BaseOfLoaderPhyAddr equ	BaseOfLoader*10h ; LOADER.BIN 被加载到的位置 ---- 物理地址

BaseOfKernelFile    equ	 08000h	; KERNEL.BIN 被加载到的位置 ----  段地址
OffsetOfKernelFile  equ	     0h	; KERNEL.BIN 被加载到的位置 ---- 偏移地址

我们定义了一个宏BaseOfLoaderPhyAddr用以代替BaseOfLoader*10h,它在loader.asm中被用到一次,用来计算GDT的基址。

运行结果如下:

 

一个码农的日常 

【源码】

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Linux内核系列—12.b.操作系统开发之从Loader跳入保护模式,12.bloader

相关文章

  • 2017-05-26android studio 继承AppCompatActivity后标题栏隐藏问题,appcompatactivity
  • 2017-05-26Android中button点击后字体的变色效果,androidbutton
  • 2017-05-26Android View体系之从源码解析Scroller的相关内容
  • 2017-05-26Android应用自定义View绘制方法手册
  • 2017-05-26Android Studio多渠道打包,androidstudio打包
  • 2017-05-26Android TabHost使用,androidtabhost使用
  • 2017-05-26Android实战简易教程-第六十六枪(服务器端搭建和服务器端Json数据交互)
  • 2017-05-26Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知),android.qq5.0
  • 2017-05-26Socket for android 简单实例,socketandroid
  • 2017-05-26购物车动画(Android),购物车动画android

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 1.8 工程相关解析(各种文件,资源访问)
    • TextView 实现跑马灯效果,textview实现跑马灯
    • Android ViewPager使用详解
    • Java虚拟机 JVM,java虚拟机jvm
    • Volley 源码解析,volley源码解析
    • 谷歌电子市场3--应用,谷歌电子市场3--
    • Android5.0开发范例大全 读书笔记(六),android5.0范例
    • Android Gson使用入门及GsonFormat插件的使用
    • android:常用的AlertDialog对话框及自定义对话框
    • 基于zookeeper的主备切换方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有