操作系统入门(四)痛并学习中

通过修改CR0寄存器绕过SSDT驱动保护 为了安全起见,Windows XP及其以后的系统将一些重要的内存页设置为只读属性,这样就算有权力访问该表也不能随意对其修改,例如SSDT、IDT等。但这种方法很容易被绕过,我们只要将这些部分修改为可写属性就可以了,不过当我们的事情做完后记得把它们恢复为只读属性,不然会造成一些很难预料到的后果。 cr0是系统内的控制寄存器之一。控制寄存器是一些特殊的寄存器,它们可以控制CPU的一些重要特性。 阅读详情
前面的教程已经说了怎么由机器启动然后转到执行我们自己的代码,现在已经可以显示出一个粗糙的图形界面了,我们的程序可以先启动loader,然后再由loader里面的代码把放在磁盘里面的kernel文件载入到一个指定的位置,再转到kernel里面执行,这样一来,代码就可以突破512个字节的限制,任意由你爱写多长就写多长了,但是如果所有的代码都用汇编来写的话,我想你首先尝到的是身体上病痛的折磨,而不是完成一个自己操作系统雏形的喜悦。
那么,我们就需要一个好用的工具来代替汇编。
C语言是一个非常好的工具,全世界使用者都有很多,虽然也可以用basic来写,但是它的面好像没有C那么广泛,既然流行,我们也就随波逐流吧。据说UNIX后来就是用C写的。
 
    要用C的话,那么就要看看它和汇编混合起来的情况。
错了,在使用C之前,我们应该把系统转换成32位的模式(人家intel都出了64位的cpu现在讲32位不知道还有没有前途),因为在系统启动的时候就是16位的模式
为什么?
“在8086/8088时代,处理器只存在一种操作模式,而到了286、386的时代处理器增加了两种操作模式――保护模式(Protected Mode)和系统管理模式(System Management Mode),而以前的模式就被称为实地址模式(Real address Mode),保护模式可以使处理器支持所有的指令和所有的体系结构,提供最高的性能和兼容性,而当主机被启动(开机或者重启动)的时候处理器处于RM状态下”
为什么用小字体,因为看着会头晕,干脆就不要看了,说的是计算机在启动的时候是处于16位的RM状态下的,而C编译出来的代码是32位的,你想在一个16位系统里面运行32位的程序似乎是行不通的,所以,我们先要把系统置为32位的PM状态。好处先不说了一大堆的,先看看怎么进去。(因为我也不懂,大家一起学习)
文章说只要设置一个位就可以进入保护模式了:
; 准备切换到保护模式
       mov    eax, cr0
   or    eax, 1
   mov    cr0, eax
这里的CR0要说一下:它是cpu的控制寄存器
包括工作方式的控制位,
包含分页管理机制的控制位,
包含浮点协处理器的控制位
CR0
PG
0000000000000000
ET
TS
EM
MP
PE
位
31
5~30
4
3
2
1
0
保护控制位 PG/PE控制分段和分页管理机制的操作
PG
PE
处理器工作方式
0
0
实模式
0
1
保护模式,禁用分页机制
1
0
非法组合
1
1
保护方式,启用分页机制
控制浮点协处理器的操作:
MP(算术存在位)
EM(模拟位)
TS(任务切换位)
ET(扩展类型位)。
…
or eax, 1
这句话的意思就是把pe置1,应该就是处在保护模式下面了,但是是不是分页先不管了。
我们原来16位的时候使用地址是这样的:
   Segment:Offset
Segment的最大可以表示的值就是64k,16位嘛(0x0000~0xffff)
Offset 也一样64k
得到的线性地址就是Segment * 0x10 + Offset = 0x00000 ~0xfffff
算来就是20位有效长度的地址1MB的内存可以访问
 
下来到了32位的PM模式,顾名思义保护模式就要有保护模式的样子,靠什么东西保护呢?就需要为它设置一个
这个内存地方的访问权限
Access
因为是32位的所以
Segment(0xffffffff)
是32位的
还有一个界限
   Limit
限制所使用的内存大小,不知道是干什么用的,好像是不让你占用过多的内存
三个最主要的东西构成了一个数据结构
 
GDT(Global Descriptor Table)全局描述表
 
64位长度据说这个表可以放在内存的任何位置只要用GDTR指令让cpu知道在哪里找GDT就可以了。
怎么操作这样的地址呢?
在段寄存器里装入
       Segment Selector(段选择器)
通过这个选择器里面的内容在全局描述表里面找到相应的段描述内容,实际上段选择器相当于一个索引目录,比如说我有一本书,开头一页是总纲,就有目录(GDT),你想要找哪一章,就打开总纲找,然后在目录下面有章,每一章能指示从书的哪一页开始(Base address),看到第几页(Offset)
先看一个GDT的例子
gdtr :
dw gdtend - gdt - 1 ; gdt的长度
dd gdt ; gdt的物理地址
gdt:
   gdt0:
   dw 0,0,0,0    ; 据说是一定要为0否则会有错
codesel_gdt:
   dw    0xffff     ; 界限Limit值 = 0x100000 * 0x1000 = 4GB
   dw 0           ; 基地址 = 0
   dw     0x9A00     ; 表示代码段可读可执行
   dw    0x00CF     ; 粒度(不知道是什么意思)
 datasel_gdt:
   dw    0xffff ; 4GB
   dw    0x0    ; 基地址
   dw     0x9200 ; 数据段可读可写
   dw     0x00CF ; 粒度
gdtend:
 
codesel equ codesel_gdt - gdt
datasel equ datasel_gdt – gdt
 
先试一下,完整的程序如下:
;======================
; 操作系统入门(四) -痛并学习中
; 进入保护模式的测试
; 2006年4月19日
; http://blog.youkuaiyun.com/flyback
; fly-back@163.com
;======================
org 0x7c00
entry:     
       jmp short begin
begin:
       cli                  ; 关中断,防止意外中断打断程序执行
       mov ax,cs       ;
       mov ds, ax      ; 设置数据段
      mov es, ax    ;
 
       lgdt [cs:gdtr]
 
       mov eax, cr0
       or eax,1
       mov cr0, eax
 
       jmp codesel:pmnow
 
bits 32
pmnow:
       mov ax, cs
       mov ds, ax     
       mov ax, datasel
      mov es, ax
       mov byte [es:0xb8000], 'p'
       jmp $
 
gdtr :
dw gdtend - gdt - 1 ; gdt的长度
dd gdt ; gdt的物理地址
gdt:
       gdt0:
       dw 0,0,0,0  ; 据说是一定要为0否则会有错
codesel_gdt:
       dw       0xffff             ; 界限Limit值 = 0x100000 * 0x1000 = 4GB
       dw   0                     ; 基地址 = 0
       dw        0x9A00          ; 表示代码段可读可执行
       dw       0x00CF          ; 粒度(不知道是什么意思)
 datasel_gdt:
       dw       0xffff      ; 4GB
       dw       0x0         ; 基地址
       dw        0x9200    ; 数据段可读可写
       dw        0x00CF   ; 粒度
gdtend:
 
codesel equ codesel_gdt - gdt
datasel equ datasel_gdt - gdt
 
times 510-($-$$) db 0
dw 0x0aa55
 
试一下,启动后屏幕上出现了一个白色的P字,不相信的话可以把
lgdt
…
mov cr0,eax
删除再试一下,应该什么反映都没有了。完了之后我们就可以在loader或者kernel里面加上进入保护模式的代码了,以后才能用C来做工作。
Linux和操作系统从入门到进阶2020最新书单大佬力荐 转载自网站导航(全部书单资源导航页):书单目录网站链接 前言:1.很多时候,是否好好看完一本好书,对一个人的提升往往能达到质的区别。就算不好好看完一本好书,马马虎虎看完,只要书是真的好书,也肯定会有很大的提高。2.好书和坏书的差别,从本质上,就是学习效率和大方向的差别。一本烂书可以浪费你半年的时间,但一本好书却可以为你带来真正扎实的基础和开阔的视野。人们常常用“内功”来形容扎实的基础,认为学好... 阅读详情

相关推荐

Linux操作系统学习

一、操作系统 1、什么是操作系统(OS)? 用来管理计算机硬件与软件资源的计算机程序,是计算机的核心和基石。 是连接用户和计算机的媒介 是所有硬件设备组装后的第一层软件,能够让用户使用硬件设备的软件。 2、常见的操作系统 桌面操作系统:Windows、macOS、Linux 移动端操作系统:iOS、Android 服务器操作系统:Linux、Windows server 嵌入式操作系统:Android(底层是Linux) 二、Linux系统的介绍 与服务器设备进行交互 1、Linux操作

Echo_165的博客 8996

x86从实模式到保护模式 pdf_【自制操作系统04】从实模式到保护模式

通过前三章的努力,我们成功将控制权转交给了 loader.asm 这个程序。具体说就是 bios 通过加载并跳转到 0x7c00(IMB大叔们定的) 把控制权转交给了我们操作系统的第一个汇编程序 mbr.asm,然后 mbr.asm 里做的事就是通过加载 loader 程序并跳转到 0x900(这个是我们自己定的)把控制权转交给了 loader.asm 程序,目前这个程序里还只是向屏幕输出一行字符...

weixin_39765697的博客 492

ROS操作系统入门学习

ROS操作系统入门(https://www.bilibili.com/video/av24585414/?p=5) 一、系统工程目录图 1、catkin+工作空间 catkin是ros定制的编译构建系统,对cmake的扩展 所有代码都存在catkin workspace catkin_make初始化工作空间 (编译) 在终端中 mkdir -p ~/catkin_ws/src c...

weixin_42662525的博客 7444

保护模式_2

 [原创] 操作系统DIY - 进入保护模式 预备知识: 熟悉 i386 CPU寄存器,了解实模式及保护模式模式; 了解A20门 文本模式下直接显存操作涉及工具:  NASM,一个文本编辑器(我用的是ConText + NASM语法高亮),QEMU/VMWARE虚拟机前言:  近期确实很忙,论坛里有一位朋友写的代码进入不了保护模式;

feijj2002_的专栏 2355

linux操作系统入门教学

文章目录第一章、Linux基础知识为什么学习Linux?什么是服务器端?什么是操作系统?第二章、Linux安装教程1.下载和安装VMware(虚拟机)2.Linux版本介绍和ubuntu下载总结 第一章、Linux基础知识 为什么学习Linux? Linux一般是用来做服务器端的操作系统。 什么是服务器端? 不管是我们上网看新闻,打游戏等等,都需要服务器端为我们提供服务。而我们所使用的手机、电脑等接受服务的一端就是客户端。 什么是操作系统? 从图中我们可以看出,操作系统是计算机系统中位于计算机硬件和应

m0_51764537的博客 3408

手把手教你用Python处理MAHNOB-HCI多模态数据集(含脑电EEG/眼动/视频数据同步实战)

本文详细介绍了如何使用Python处理MAHNOB-HCI多模态数据集,涵盖脑电(EEG)、眼动追踪和视频数据的同步解析与对齐。通过MNE-Python、pandas和OpenCV等工具,实现从BDF、TSV到XML格式的高效处理,解决时间轴对齐难题,助力情感计算与人机交互研究。

weixin_30998797的博客 367

《操作系统真象还原》学习笔记:第五章 保护模式进阶,向内核迈进

;loader.s %include "boot.inc" section loader vstart=LOADER_BASE_ADDR LOADER_STACK_TOP equ LOADER_BASE_ADDR ;构建gdt及其内部的描述符 GDT_BASE: dd 0x00000000 dd 0x00000000 CODE_DESC: dd 0x0000FFFF dd

取个名字太难了a的博客 759

UniApp实战:从文件下载到本地保存与预览的一站式解决方案

本文深入解析了UniApp开发中文件下载、保存与预览的完整流程,提供了基于uni.downloadFile、uni.saveFile和uni.openDocument API的一站式实战解决方案。文章详细拆解了核心API的使用方法、多平台(App、H5)的兼容性处理、常见坑点(如文件路径、权限、格式支持)以及进阶优化技巧(如进度提示、文件管理),旨在帮助开发者构建健壮、用户体验良好的跨平台文件处理功能。

d3e4f的博客 614

【逆向初级】独树一帜

逆向 题干 题目地址:https://ctf.pediy.com/itembank.htm 是一个验证器,也可以叫做注册机。 题意是让我们拿到用户 :CTFHUB的Code 0x1 查壳 0x2 OD调试 我第一想法就是下消息断点,断在按钮类上 点击 “check” 后断下,但是消息断点的知识掌握的还不是很好,我没能追溯到消息处理后跳回的地址。 所以换了思路 有 EditText ,所以想到了...

Tigger.run 独立开发者 热爱逆向工程 714

中国IP发展之面面观

谢学军/邱善勤2006-1-25 9:29:28电子经理世界       IP远没有我们当初想象的那么简单   当SoC设计方法学刚刚传到国内的时候,学界为之欢呼雀跃,由于IP/SoC设计技术的使用,可以将发达国家用几年甚至十几年积累起来的设计技术直接为我所用,使中国的集成电路跳过漫长的积累阶段,迅速站到较高的起点上。因此在当时看来,IP/SoC设计技术是我国提升设计水平、发展

klxdmm305的专栏 1188

K-means算法代码实现(python)

K-means算法代码实现以及解决质心选择问题 计算距离 距离通常使用欧几里得距离来衡量 def euclDistance(vector1, vector2): return np.sqrt(sum((vector2 - vector1) ** 2)) 初始化质心 def initCentroids(data, k): numSamples, dim = data.shape ...

江南小帅瓜的博客 1万+

小白如何学习操作系统?

很多读者问我如何学习操作系统?推荐几本操作系统可以看的书?操作系统都需要学什么?有哪些视频可以看吗?下面我就针对性的对这些问题做一下我自己的阐述。 学习操作系统不是为了让你设计一个操作系统,而是为了让你更好的了解其运行原理。 如果你觉得操作系统有些难度的话,强烈推荐看一下我的这本 PDF。 程序员必知核心基础知识 这个 PDF 能让你对计算机的硬件和运行原理有基本的入门。 这本 PDF 可以说是对任何小白都适用了,如果你能看完,就说明你有一定的基础了,可以正式入门操作系统了。 我学习操作系统是根据机械工业出

程序员cxuan的个人主页 1万+

XXL-Job 分布式定时任务

XXL-JOB是一款轻量级分布式定时任务调度框架,采用调度中心与执行器分离架构,解决单机任务宕机、重复执行等问题。核心模块包括调度中心(管理任务配置、触发调度)和执行器(执行任务逻辑),支持集群部署保证高可用。框架提供丰富的任务触发规则、路由策略、阻塞策略及完善的运维能力,适用于多种业务场景如数据同步、定时推送等。安装时需准备MySQL数据库并初始化表结构,通过Docker部署调度中心服务。相比其他定时框架,XXL-JOB具有轻量化、可视化等优势,是中小企业的首选方案。

郭宝的博客 698

小白如何学习操作系统?附零基础入门学习路线 + 操作系统教程

学习操作系统,一方面能帮助我们了解程序执行的原理、熟悉更多计算机的概念(比如内存、CPU、文件系统、磁盘);另一方面,操作系统中的结构设计、算法设计、解决问题的思路和方案都非常优秀,可以帮助我们开拓思路,从而在自己编写程序、设计算法时有了更多的选择和考量(比如死锁问题的处理)。

努力做最接地气的编程干货分享,感谢关注 6449

YOLOv8改进 | Neck篇 | Slim-Neck替换特征融合层实现超级涨点 (又轻量又超级涨点)

本文给大家带来的改进机制是Slim-neck提出的Neck部分,Slim-neck是一种设计用于优化卷积神经网络中neck部分的结构。在我们YOLOv8中,neck是连接主干网络(backbone)和头部网络(head)的部分,负责特征融合和处理,以便提高检测的准确性和效率。亲测在小目标检测和大尺度目标检测的数据集上都有大幅度的涨点效果(mAP直接涨了大概有0.4左右。同时本文对Slim-Neck的框架原理进行了详细的分析,不光让大家会添加到自己的模型在写论文的时候也能够有一定的参照。

Snu77的博客 1万+

R语言Dunnett’s检验实战:寻找差异组之间的效果

总结起来,本文以R语言为工具,演示了如何使用Dunnett’s检验来找出单因素方差分析中不同组之间的效果差异。在本篇文章中,我们将通过R语言实战演示如何使用Dunnett’s检验来寻找不同组之间的效果差异。在分析结果时,通常我们会关注具有显著差异的组别,并基于Dunnett’s检验结果进行进一步的解释和讨论。首先,我们需要准备一组数据,假设我们有一个实验,涉及到四个不同的处理组和一个对照组。当我们发现方差分析结果显示存在显著差异时,我们可以进一步进行Dunnett’s检验来确定具体哪些组之间存在差异。

CoderExtra的博客 1104

学习操作系统,都有哪些硬核网站?

一般很少有人推荐操作系统的网站吧。。。。。。这几个网站来源于我平常的学习总结,也有一些是来源于网上优秀的回答,希望这几个网站能够助力你对操作系统有更深的认识。 studytonight studytonight 简直太棒了!!! studytonight 会包括 operationg system,但是并不是说 studytonight 就是一个单纯的 OS 学习网站,它是一个基础教程网,它的首页是这样的,不仅限于 os ,还会包括 Java、C、CSS、OS、Computer network 等。 这个

程序员cxuan的个人主页 5560

【芯片设计- RTL 编译与仿真 1.2 -- Visualizer 常用使用命令】

打开波形后,如果想要看到所有信号的数据,可以点击下图中红框中的按钮,因为默认verdi 默认并不是显示所用信号。如果想统计某一个信号中有多少笔数据时,可以使用 Expression->Edege Count 功能。如下图所示,如果没有打开前导0的功能时,当某一笔数据位0时,只会显示1个0。如果需要将波形的数据导出到文本文件时,可以按照下面步骤进行。打开前导0功能之后,会根据数据位宽来显示对应0的个数。

CodingCos的博客 2046

如何学习操作系统这门课程?

大家好,我是轩辕。 今天跟大家深度聊一下,操作系统这门课,怎么学,才能更牛逼? 一、做好前置功课 千万不要一上来就啃书,学任何课程之前,都需要做好功课: 这是一门什么课程?讲什么东西的? 位于整个计算机技术知识体系的哪个位置,有哪些相关联的课程? 学了这门课有什么用?如果一上来直接就啃书,一不小心就会掉入枯燥的技术名词海洋中,什么也学不进去。 首先来了解一下,操作系统到底是个啥?为什么会有操作系统这个东西出现? 在二十世纪中叶,计算机刚刚诞生之初的那二三十年里,是

xuanyuan_fsx的专栏 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

操作系统作业四

设备驱动与文件系统

十二间记,知不足而奋斗,望远山而前行。千里不辞行路远,时光早晚到天涯。 8168

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

嵌入式学习二:怎么学习Linux操作系统

2. 怎么学习嵌入式Linux操作系统 本文假设您是零基础,以实用为主,用最快的时间让你入门;后面也会附上想深入学习时可以参考的资料。 在实际工作中,我们从事的是“操作系统”周边的开发,并不会太深入学习、修改操作系统本身。 ①操作系统具有进程管理、存储管理、文件管理和设备管理等功能,这些核心功能非常稳定可靠,基本上不需要我们修改代码。我们只需要针对自己的硬件完善驱动程序 ②学...

JiandaoStudio 6671

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ROS2 机器人操作系统学习与四足机器人仿真

本文分享了基于ROS2机器人操作系统的学习路线及实践经历。首先介绍了Ubuntu系统环境搭建中常见的网络连接、权限、硬盘扩容等问题及解决方法。随后详细讲解了ROS2节点创建时的头文件报错和CMake构建问题,并给出解决方案。文章重点分析了ROS2四大核心通信方式,包括话题通信、服务通信等,提供了具体代码示例和调试技巧,帮助读者快速上手机器人开发。针对学习过程中可能遇到的各类问题,文中都给出了详细的排查步骤和解决方案。

teddyyang66的博客 1101

Linux操作系统(CentOS Linux)入门学习

Linux的入门学习;Linux的发展过程;CentOS与Ubuntu区别;Vim的使用;虚拟机网络配置;系统管理操作;程序运行级别;Linux基本命令;用户与权限;文件,目录,命令的搜索;压缩与打包;磁盘查看与分区挂载;进程状态查看;软件包管理;shell脚本,变量,表达式,条件判断,循环;函数;正则表达式;文本处理工具.

2301_82291365的博客 2474

献给初学者:谈谈如何学习Linux操作系统

本文出自 “技术成就梦想” 博客,请务必保留此出处http://ixdba.blog.51cto.com/2895551/569329。为了能把这篇不错的文章分享给大家。所以请允许我暂时用原创的形式展现给大家一、 选择适合自己的linux发行版谈到linux的发行版本,太多了,可能谁也不能给出一个准确的数字,但是有一点是可以肯定的,linux正在变得越来越流行, 面对这么多的Linux 发行版,打

曹胜欢 15万+

Linux操作系统的入门

Linux操作系统是一种开源的、基于Unix的操作系统,其稳定性和安全性备受认可,广泛应用于服务器、嵌入式系统等领域。

NSAcbba的博客 1837

操作系统入门(一)痛并学习中

;;   文件:boot.asm;;   作用:从7c00h处启动,显示载入系统信息"Loading System...";;   没有文件系统,1.44M 512bits/80sec 软盘启动,;;   创建日期:2004/01/30 flyback;;   fly-back@163.com;;      ===================================

魔芋的专栏 2286
上一篇: 警自录-由超女想到学校教育
下一篇: 操作系统入门(五) - 载入32位保护模式代码为c做准备
魔芋
博客等级 码龄26年 37粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值