手写操作系统 - 汇编实现进入保护模式

前言

  1. 在了解段页门得基础上,理解如何从实时模式进入保护模式
  2. 如何引入C语言得开发与调试
    • 生成内核:汇编与C语言如何生成内核
    • 调试C语言
    • 汇编、C语言如何互调

手写64位操作系统内核规划图:

boot程序起始0扇区,共占1个扇区
setup程序起始1扇区,共占一个扇区2个扇区
x86内核起始 3扇区,共占一个扇区大于30个扇区

在这里插入图片描述

1、从实时模式进入保护模式

  1. 关中断

    cli:是一个汇编指令,用于清除(禁用)中断标志位(IF位)在eflags寄存器中。当IF位被清除时,处理器将不响应可屏蔽的硬件中断,这常用于临界区代码,以避免在执行关键任务时被中断。
    sti:用于设置(启用)中断标志位在eflags寄存器中。执行sti后,处理器将开始响应可屏蔽的硬件中断。这通常用于完成关键任务后重新启用中断。
    eflags.IF:一个寄存器,其中的IF(Interrupt Flag)是eflags中的一个位,用于控制处理器是否响应可屏蔽的硬件中断。cli和sti指令分别用于清除和设置这个标志位。
    
  2. 开A20总线

    考虑为什么要开A20?
    ; 开A20
    in    al,  92h
    or    al,  00000010b
    out   92h, al
    
  3. 设置段寄存器、加载gdt表

    内核态
    	代码段、数据段
    	2
    -----------------------------
    x64长模式
    	4
    
    tss
    	用户态切内核态
    
    8个
    ------------------------------
    调用门
    
  4. cr0寄存器,cr0.pe = 1

    cr0 :   pe位(进入保护模式)、pg(开启分页)
    cr1:
    cr2:	内存异常			4G     0x10000000    页机制
    cr3:	页表的基址
    
  5. 来一个练习:32位,0-4g,代码段
    在这里插入图片描述

    Base;0
    Limit::0xfffff
    G:1        ;为0时Segment Limit单位为字节 2^20*1Byte = 1M  为1时单位4K 2^20*4K =4G
    D/B:1
    AVL:0
    P:1
    DPL:0		
    S:1		;代码段
    TYPE:1000   ;Execule Only
    -------------------------------------
    高32位:0000 0000 1100 1111 1001 1000 0000 0000  ---> 0x00cf9800
    低32位:0000 0000 0000 0000 1111 1111 1111 1111  ---> 0x0000ffff
    

2、如何引入C语言得开发与调试

  1. 生成内核:汇编与C语言如何生成内核

    ${BUILD}/kernel.bin: ${BUILD}/boot/head.o ${BUILD}/init/main.o
    ld -m elf_i386 $^ -o $@ -Ttext 0x1200
    
    非常重要:-Ttext 0x1200,指定代码入口,调试时候需要用
    调试的时候,要选kenel.bin,因为这里面有调试符号,如果说你编译.o文件的时候,不带-g,那内核就是没办法调试
    
    ${BUILD}/system.bin: ${BUILD}/kernel.bin
    objcopy -O binary ${BUILD}/kernel.bin ${BUILD}/system.bin
    nm ${BUILD}/kernel.bin | sort > ${BUILD}/system.map(不是必须的)
    
  2. 调试C语言

    1、内核依赖的所有文件编译的时候应该要带-g,生成调试符号
    2、指定入口-Ttext 0x1200
    3、要用qemu调试模式运行
    		-s -S   socket  lo
    		127.0.0.1:1234
    
    		gdb kernel.bin
    		target remote:1234
    
  3. 汇编、C语言如何互调

    • 汇编如何调用C语言中的函数

      以汇编中掉调用C语言中c_test()函数,核心全局函数
      汇编代码中增加:
      	extern c_test
      	gq_ctest:
      		 call c_test
      
      C语言中:
      	void c_test(void) {
      	    int a = 0;
      	    char* video = (char*)0xb8000;
      	    *video = 'Z';
      	}
      
    • 汇编如何访问C语言中的全局变量

      
      
    • C语言如何调用汇编语言的函数

      C语言中调用gq_ctest()函数,核心是要将汇编中的void gq_ctest(void) 申明成全局函数
      

      在这里插入图片描述

    • C语言如何访问汇编中定义的变量:地址
      在这里插入图片描述

总结

代码地址

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字化时代背景下服装表演创新研究

服装表演是一门独具魅力的艺术,它既高于生活,又来源于生活。这一艺术形式通过舞台上的服装、音乐、舞蹈和表演艺术家的表现力,将时尚与创意融为一体,向观众传递着独特的美感和情感。然而,如今,我们生活在一个飞速发展的数字化时代,这为服装表演的教育带来了前所未有的机遇和挑战…

NCNN环境部署及yolov5pt转ncnn模型转换推理

该内容还未完整,笔记内容,持续补充。 〇开发环境版本 vs2022 cmake3.21.1 ncnn20231027发行版 yolov5s v6.2 vunlkan1.2.198.1 Protobuf3.20.0 Opencv3.4.1 一、模型转换 yolov5s v6.2训练的pt模型,直接导出tourchscript&#xff0c…

帆软报表中定时调度中使用自己的短信平台,并且不使用官方商城里的模板

1 当我们在定时调度里中完成某些任务后,需要通过短信平台来发送一些短信,此时的配置界面是这样的: 此时需要帆软市场,并且短信模板只能使用帆软市场里配置的短信模板。 限制太多,使用起来非常不方便,如果我们想要使用自己的短信签名,并且使用自己的短信发送平台。那么可…

ebay会员收费吗,ebay会员活动的权益有哪些?-站斧浏览器

ebay会员收费吗? 是的,ebay会员是需要付费的。不过,ebay也提供了免费试用期,让你可以在成为正式会员之前先行体验各项权益。 试用期结束后,你可以选择是否继续付费成为正式会员。对于经常使用ebay购物的用户来说&…

前端使用高德api的AMap.Autocomplete无效,使用AMap.Autocomplete报错

今天需要一个坐标拾取器,需要一个输入框输入模糊地址能筛选的功能 查看官方文档,有一个api可以直接满足我们的需求 AMap.Autocomplete 上代码 AMapLoader.load({"key": "你的key", // 申请好的Web端开发者Key,首次调…

linux cuda环境搭建

1,检查驱动是否安装 运行nvidia-smi,如果出现如下界面,说明驱动已经安装 记住cuda版本号 2,安装cudatoolkit 上官网CUDA Toolkit Archive | NVIDIA Developer 根据操作系统选择对应的toolkit 如果已经安装了驱动,选…

win32 WM_MENUSELECT消息学习

之前写了一些win32的程序,处理菜单单击都是处理WM_COMMAND消息,通过 LOWORD(wParam) 获取菜单ID,判断单击的是哪个菜单项; 还有一些其他菜单消息; 当在菜单项中移动光标或鼠标,程序会收到许多WM_MENUSELEC…

Hive讲课笔记:内部表与外部表

文章目录 一、导言二、内部表1.1 什么是内部表1.1.1 内部表的定义1.1.2 内部表的关键特性 1.2 创建与操作内部表1.2.1 创建并查看数据库1.2.2 在park数据库里创建student表1.2.3 在student表插入一条记录1.2.4 通过HDFS WebUI查看数据库与表 三、外部表2.1 什么是外部表2.2 创建…

Arduino stm32 USB CDC虚拟串口使用示例

Arduino stm32 USB CDC虚拟串口使用示例 📍相关篇《STM32F401RCT6基于Arduino框架点灯程序》🔖本开发环境基于VSCode PIO🌿验证芯片:STM32F401RC⌛USB CDC引脚: PA11、 PA12🔧platformio.ini配置信息&…

Spring 是如何解决循环依赖的

1.什么是循环依赖? 所谓的循环依赖是指,A 依赖 B,B 又依赖 A,它们之间形成了循环依赖。或者是 A 依赖 B,B 依赖 C,C 又依赖 A。它们之间的依赖关系如下: 2.通过手写代码演示理解Spring循环依赖 DEMO: pu…

Mini MyBatis-Plus(下)

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 最核心的内容前两篇已经…

docker 安装可视化工具 Protainer 以及 汉化

一、创建保存数据的卷 安装网址:Install Portainer BE with Docker on Linux - Portainer Documentation docker pull portainer/portainer二、根据portainer镜像创建容器 docker run -d -p 8000:8000 -p 9000:9000\ --name portainer --restartalways \ -v /var/r…

【Python_PySide2学习笔记(二十)】消息对话框QMessageBox类的基本用法

消息对话框QMessageBox类的基本用法 消息对话框QMessageBox类的基本用法前言正文1、警告对话框 QMessageBox.warning()2、消息对话框 QMessageBox.information()3、提问对话框 QMessageBox.question()4、错误对话框 QMessageBox.critical()5、关于对话框 QMessageBox.about()6、…

小白进公司不会用Jenkins,一文带你流利使用

起因 需要将应用从阿里云迁移到微软云,重新部署应用。 一. 前置知识学习 CI/CD 是一组经常在现代软件开发中提到的实践,代表持续集成(Continuous Integration)和持续交付/部署(Continuous Delivery/Deployment&…

(JAVA)-(多线程)-线程池

线程池,顾名思义就是存放线程的池子,当有任务时能够随时取用线程,任务结束后能够放回线程池中。如果把线程比成碗,线程池就像一个碗柜一样。 使用线程池的好处: 1.当有大量线程对象时,减少了线程创建销毁…

ssm基于vue的大学生社团管理系统的设计与实现+vue论文

基于vue的大学生社团管理系统的设计与实现 计算机科学与技术 2022届 姓名 学号 摘要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。传统的大学生社团信息管理模式,采用人工登…

【Vue2+3入门到实战】(13)插槽<slot>详细示例及自定义组件的创建与使用代码示例 详解

目录 一、学习目标1.插槽2.综合案例:商品列表 一、插槽-默认插槽1.作用2.需求3.问题4.插槽的基本语法5.代码示例6.总结 二、插槽-后备内容(默认值)1.问题2.插槽的后备内容3.语法4.效果5.代码示例 三、插槽-具名插槽1.需求2.具名插槽语法3.v-s…

Apache Flink连载(二十):Flink On Yarn运行 - Yarn Per-Job模式(弃用)

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. 任务提交命令 2. 任务…

使用electron属性实现保存图片并获取图片的磁盘路径

在普通的网页开发中,JavaScript由于安全性的考虑,通常是无法直接获取到客户端的磁盘路径的。浏览器出于隐私和安全原因对此类信息进行了限制。 在浏览器环境下,JavaScript主要通过Web APIs来与浏览器进行交互,而这些API通常受到浏…

lottie 动画在 vue 中的使用

前言 最近我所负责的项目中采用了动画效果,最早使用 gif 来实现。然而,在实践过程中,我发现 gif 格式的动画在 git 中出现了明显的锯齿感,这让我非常困扰。为了追求更完美的表现效果,我最终选择了 lottie 来实现我的动…