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

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

前言

  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指令分别用于清除和设置这个标志位。
  1. 开A20总线
考虑为什么要开A20?
; 开A20
in    al,  92h
or    al,  00000010b
out   92h, al
  1. 设置段寄存器、加载gdt表
内核态
  代码段、数据段
  2
-----------------------------
x64长模式
  4
tss
  用户态切内核态
8个
------------------------------
调用门
  1. cr0寄存器,cr0.pe = 1
cr0 :   pe位(进入保护模式)、pg(开启分页)
cr1:
cr2:  内存异常      4G     0x10000000    页机制
cr3:  页表的基址
  1. 来一个练习: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(不是必须的)
  1. 调试C语言
1、内核依赖的所有文件编译的时候应该要带-g,生成调试符号
2、指定入口-Ttext 0x1200
3、要用qemu调试模式运行
    -s -S   socket  lo
    127.0.0.1:1234
    gdb kernel.bin
    target remote:1234
  1. 汇编、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语言如何访问汇编中定义的变量:地址

总结

代码地址

相关文章
|
6月前
|
存储 Java C语言
手写操作系统 --汇编执行流(一)
手写操作系统 --汇编执行流(一)
|
算法 Unix BI
操作系统(5.2)--请求分页储存管理模式
在请求分页系统中所需要的主要数据结构是页表。为支持请求分页,须在页表中再增加若干项,供程序(数据)在换进、换出时参考。
330 0
|
2月前
|
机器学习/深度学习 Dart 前端开发
移动应用与系统:构建现代数字生态的基石在当今这个高度数字化的社会中,移动应用与操作系统已成为我们日常生活不可或缺的一部分。它们不仅改变了我们的沟通方式,还重塑了我们的工作、学习和娱乐模式。本文将深入探讨移动应用开发的基础、移动操作系统的功能以及这两者如何共同塑造了我们的数字世界。
随着智能手机和平板电脑的普及,移动应用与系统的重要性日益凸显。它们不仅为用户提供了便捷的服务和丰富的功能,还为开发者提供了广阔的创新平台。本文将介绍移动应用开发的基本概念、技术栈以及最佳实践,并探讨主流移动操作系统的特点和发展趋势。通过分析移动应用与系统的相互作用,我们可以更好地理解它们在现代社会中的重要地位。
|
1月前
|
存储 Java C语言
MacOS环境-手写操作系统-04-实模式进入保护模式
MacOS环境-手写操作系统-04-实模式进入保护模式
14 1
|
2月前
|
安全
探索操作系统的心脏:内核与用户模式的交互之旅
【9月更文挑战第12天】在数字世界的海洋中,操作系统扮演着灯塔的角色,指引着每一条数据流的方向。本文将深入探讨操作系统的核心机制——内核与用户模式,揭示它们如何协同工作以保障计算机系统的高效与安全。我们将从基础概念出发,逐步深入到实际代码示例,旨在为读者呈现一幅清晰的操作系统工作原理图景。
|
1月前
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
19 0
|
1月前
|
存储 iOS开发 C++
MacOS环境-手写操作系统-05-保护模式超强寻址
MacOS环境-手写操作系统-05-保护模式超强寻址
24 0
|
2月前
|
安全
探索操作系统的心脏:内核与用户模式的奥秘
在数字世界的海洋中,操作系统如同一艘巨轮,承载着无数数据的流动。本文将揭开这艘巨轮的核心机密——内核与用户模式,带你领略它们如何协同工作,确保系统的稳定与安全。通过浅显易懂的语言和生动的比喻,我们将一探究竟,看看这两种模式如何在幕后默默支撑着我们的日常计算体验。准备好了吗?让我们启航,深入操作系统的心脏地带!
|
3月前
|
安全 调度 开发者
探索操作系统的心脏:内核与用户模式
【8月更文挑战第30天】在数字世界的每一次跳动中,操作系统扮演着至关重要的角色。本文将深入浅出地探讨操作系统的核心概念——内核与用户模式,通过生动的比喻和直观的解释,带领读者理解这一复杂主题。我们将从内核的定义和功能出发,逐步揭示用户模式的秘密,并通过代码示例,展示如何在实际应用中区分和利用这两种模式。无论你是计算机科学的初学者还是资深开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
3月前
|
安全 Linux Windows
探索操作系统的心脏:内核与用户模式的奥秘
本文将深入探讨操作系统的核心组件——内核,以及它如何通过用户模式和内核模式的切换来管理资源和保护系统安全。我们将从基础概念出发,逐步深入到内核的设计原理,最后讨论现代操作系统中用户模式与内核模式的交互机制。通过这篇文章,读者将获得对操作系统内核工作原理的深刻理解,并认识到它在计算机系统中的重要性。