内核雏形——跳入保护模式

2023-10-06 03:42

本文主要是介绍内核雏形——跳入保护模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

源于《自己动手写操作系统》

内核已经被我们加载进内存了,现在要跳入保护模式了~在拉出.asm文件之前,有几个inc文件必须说明一下

lib.inc

; ------------------------------------------------------------------------
; 显示 AL 中的数字
; ------------------------------------------------------------------------
DispAL:push	ecxpush	edxpush	edimov	edi, [dwDispPos]mov	ah, 0Fh			; 0000b: 黑底    1111b: 白字mov	dl, alshr	al, 4mov	ecx, 2
.begin:and	al, 01111bcmp	al, 9ja	.1add	al, '0'jmp	.2
.1:sub	al, 0Ahadd	al, 'A'
.2:mov	[gs:edi], axadd	edi, 2mov	al, dlloop	.begin;add	edi, 2mov	[dwDispPos], edipop	edipop	edxpop	ecxret
; DispAL 结束-------------------------------------------------------------; ------------------------------------------------------------------------
; 显示一个整形数
; ------------------------------------------------------------------------
DispInt:mov	eax, [esp + 4]shr	eax, 24call	DispALmov	eax, [esp + 4]shr	eax, 16call	DispALmov	eax, [esp + 4]shr	eax, 8call	DispALmov	eax, [esp + 4]call	DispALmov	ah, 07h			; 0000b: 黑底    0111b: 灰字mov	al, 'h'push	edimov	edi, [dwDispPos]mov	[gs:edi], axadd	edi, 4mov	[dwDispPos], edipop	ediret
; DispInt 结束------------------------------------------------------------; ------------------------------------------------------------------------
; 显示一个字符串
; ------------------------------------------------------------------------
DispStr:push	ebpmov	ebp, esppush	ebxpush	esipush	edimov	esi, [ebp + 8]	; pszInfomov	edi, [dwDispPos]mov	ah, 0Fh
.1:lodsbtest	al, aljz	.2cmp	al, 0Ah	; 是回车吗?jnz	.3push	eaxmov	eax, edimov	bl, 160div	bland	eax, 0FFhinc	eaxmov	bl, 160mul	blmov	edi, eaxpop	eaxjmp	.1
.3:mov	[gs:edi], axadd	edi, 2jmp	.1.2:mov	[dwDispPos], edipop	edipop	esipop	ebxpop	ebpret
; DispStr 结束------------------------------------------------------------; ------------------------------------------------------------------------
; 换行
; ------------------------------------------------------------------------
DispReturn:push	szReturncall	DispStr			;printf("\n");add	esp, 4ret
; DispReturn 结束---------------------------------------------------------; ------------------------------------------------------------------------
; 内存拷贝,仿 memcpy
; ------------------------------------------------------------------------
; void* MemCpy(void* es:pDest, void* ds:pSrc, int iSize);
; ------------------------------------------------------------------------
MemCpy:push	ebpmov	ebp, esppush	esipush	edipush	ecxmov	edi, [ebp + 8]	; Destinationmov	esi, [ebp + 12]	; Sourcemov	ecx, [ebp + 16]	; Counter
.1:cmp	ecx, 0		; 判断计数器jz	.2		; 计数器为零时跳出mov	al, [ds:esi]		; ┓inc	esi			; ┃; ┣ 逐字节移动mov	byte [es:edi], al	; ┃inc	edi			; ┛dec	ecx		; 计数器减一jmp	.1		; 循环
.2:mov	eax, [ebp + 8]	; 返回值pop	ecxpop	edipop	esimov	esp, ebppop	ebpret			; 函数结束,返回
; MemCpy 结束-------------------------------------------------------------


loader.inc

BaseOfLoader		equ	 09000h	; LOADER.BIN 被加载到的位置 ----  段地址
OffsetOfLoader		equ	  0100h	; LOADER.BIN 被加载到的位置 ---- 偏移地址BaseOfLoaderPhyAddr	equ	BaseOfLoader * 10h	; LOADER.BIN 被加载到的位置 ---- 物理地址 (= BaseOfLoader * 10h)BaseOfKernelFile	equ	 08000h	; KERNEL.BIN 被加载到的位置 ----  段地址
OffsetOfKernelFile	equ	     0h	; KERNEL.BIN 被加载到的位置 ---- 偏移地址

loader.asm

org  0100hjmp	LABEL_START		; Start; 下面是 FAT12 磁盘的头, 之所以包含它是因为下面用到了磁盘的一些信息
%include	"fat12hdr.inc"
%include	"load.inc"
%include	"pm.inc"; GDT ------------------------------------------------------------------------------------------------------------------------------------------------------------
;                                                段基址            段界限     , 属性
LABEL_GDT:			Descriptor          

这篇关于内核雏形——跳入保护模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/152754

相关文章

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

Ubuntu22.04回退系统内核

文章目录 起因回退操作卸载内核禁止内核升级 起因 最近因为系统内核自动升级,导致显卡驱动检测不到,炼丹环境被破坏。无奈只能重装驱动,于是跟着手册操作发现驱动要求的是内核版本是5.15.0-25-generic,而我通过uname -r发现这时候的内核版本是6.8.0-40-generic,看来只能回退了。 我搜索了网上很多的文章,没有一篇文章能够完全解决这个问题,所以在我多次尝

跟我一起玩《linux内核设计的艺术》第1章(四)——from setup.s to head.s,这回一定让main滚出来!(已解封)

看到书上1.3的大标题,以为马上就要见着main了,其实啊,还早着呢,光看setup.s和head.s的代码量就知道,跟bootsect.s没有可比性,真多……这确实需要包括我在内的大家多一些耐心,相信见着main后,大家的信心和干劲会上一个台阶,加油! 既然上篇已经玩转gdb,接下来的讲解肯定是边调试边分析书上的内容,纯理论讲解其实我并不在行。 setup.s: 目标:争取把setup.

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

linux 内核提权总结(demo+exp分析) -- 任意读写(四)

hijack_modprobe_path篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     原理同hijack_prctl, 当用户执行错误格式的elf文件时内核调用call_usermod