从零开始制作 MyOS(四)

news/2025/10/30 10:09:48/文章来源:https://www.cnblogs.com/wanghao-boke/p/19176051

从零开始制作 MyOS(四)—— 跳转到 C 语言编写的小型内核

目标

在引导加载器准备好后,用 C 语言编写一个小型内核并实现从引导加载器跳转到内核执行。

代码

引导程序文件

org 0x7C00
bits 16start:; 初始化段寄存器xor ax, axmov ds, axmov es, axmov ss, axmov sp, 0x7C00; 显示启动信息mov si, msg_loadingcall print_string; 加载内核到 0x10000mov ax, 0x1000mov es, axxor bx, bxmov ah, 0x02    ; 读扇区mov al, 4       ; 4个扇区mov ch, 0       ; 柱面0mov cl, 2       ; 扇区2mov dh, 0       ; 磁头0mov dl, 0x80    ; 驱动器int 0x13jc disk_error; 切换到保护模式clilgdt [gdt_descriptor]; 启用A20in al, 0x92or al, 2out 0x92, almov eax, cr0or eax, 1mov cr0, eaxjmp CODE_SEG:init_pmdisk_error:mov si, msg_errorcall print_stringjmp $print_string:lodsbtest al, aljz .donemov ah, 0x0Eint 0x10jmp print_string
.done:retbits 32
init_pm:mov ax, DATA_SEGmov ds, axmov es, axmov ss, axmov esp, 0x90000; 跳转到内核jmp 0x10000; 数据区
msg_loading db "Booting...", 0xD, 0xA, 0
msg_error db "Disk error!", 0; GDT
gdt_start:dq 0
gdt_code:dw 0xFFFFdw 0db 0db 10011010bdb 11001111bdb 0
gdt_data:dw 0xFFFFdw 0db 0db 10010010bdb 11001111bdb 0
gdt_end:gdt_descriptor:dw gdt_end - gdt_start - 1dd gdt_startCODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_starttimes 510-($-$$) db 0
dw 0xAA55

内核入口文件

section .text
global _start_start:mov esp, 0x90000  ; 设置栈指针extern kernel_maincall kernel_main   ; 调用C内核hlt

小型内核文件

void kernel_main(void) {char *vga = (char*)0xB8000;// 清屏for (int i = 0; i < 80 * 25 * 2; i += 2) {vga[i] = ' ';vga[i + 1] = 0x07;}// 显示字符串char *msg = "Hello from C Kernel!";for (int i = 0; msg[i]; i++) {vga[i * 2] = msg[i];vga[i * 2 + 1] = 0x07;}while(1) asm("hlt");
}

链接器

ENTRY(_start)SECTIONS
{. = 0x10000;.text : { *(.text) }.data : { *(.data) }.bss : { *(.bss) }
}

Makefile

CC = gcc
LD = ld
ASM = nasmCFLAGS = -m32 -ffreestanding -nostdlib -c
ASFLAGS = -f elf32
LDFLAGS = -m elf_i386 -T linker.ld -nostdliball: os.imgos.img: boot.bin kernel.bindd if=/dev/zero of=os.img bs=512 count=2880dd if=boot.bin of=os.img conv=notruncdd if=kernel.bin of=os.img bs=512 seek=1 conv=notruncboot.bin: boot.asm$(ASM) -f bin boot.asm -o boot.binkernel.bin: kernel.elfobjcopy -O binary kernel.elf kernel.binkernel.elf: entry.o kernel.o$(LD) $(LDFLAGS) -o kernel.elf entry.o kernel.okernel.o: kernel.c$(CC) $(CFLAGS) kernel.c -o kernel.oentry.o: entry.asm$(ASM) $(ASFLAGS) entry.asm -o entry.oclean:rm -f *.o *.bin *.elf os.imgrun: os.imgqemu-system-x86_64 -drive format=raw,file=os.img.PHONY: all clean run

编译运行

# ubuntu 中,VGA 显示
make clean && make run

运行结果

当终端打印出来“Hello from C Kernel!”,就表示运行成功了

跳转 C 内核成功

问题

本节遇到最大的问题是内核跳转不过来,目前只找到以下一些可能:

磁盘问题

  1. 段寄存器设置顺序错误

    • 先设置ES再操作磁盘
  2. 缺少错误重试机制​
    +

  3. 扇区数不足

A20地址线启用问题

  1. and al, 0xFE会错误清除bit 0(可能影响系统重启)

  2. 缺少状态检查​:未验证A20是否真正启用成功

保护模式跳转问题

  1. 无效跳转指令,jmp 0x10000未使用段选择子,在保护模式下会崩溃
  2. 缺少段寄存器初始化​:未正确设置DS/ES/SS等数据段寄存器

内核入口对齐问题

  1. 未声明全局符号​:_start未在entry.asm中声明为global
  2. ​栈未对齐​:x86要求栈指针按16字节对齐

编译链接问题

  1. 缺少内核地址指定​:链接脚本未强制指定内核加载地址为0x10000
  2. 未处理BSS段​:未清零未初始化数据段

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年10月压力监测厂家对比榜:五强评测与选型参考

进入2025年,水务、热力及工业管网对“压力监测”的实时性、耐久性与数据闭环能力提出更高要求。用户常见场景有三类:一是水务集团需要长寿命、毫秒级水锤捕捉终端,以降低爆管率;二是热力公司希望在高温高湿环境下获…

2025年质量好的洗菜盆厨房水槽优质厂家推荐榜单

2025年质量好的洗菜盆厨房水槽优质厂家推荐榜单 随着现代厨房设计的不断升级,洗菜盆和水槽作为厨房的核心功能部件,其质量、设计和功能性越来越受到消费者的重视。优质的洗菜盆不仅能提升厨房的使用体验,还能延长使…

基于VC++和ObjectARX开发的AutoCAD曲线交点打断功能实现代码

// CurveIntersectionBreaker.h #pragma once #include "dbents.h" #include "dbsymtb.h" #include "gecurv.h"class CCurveIntersectionBreaker { public:CCurveIntersectionBreaker()…

12个单词

client 客户端 process 进程 request 请求 headers 请求头/响应头 breakpoints 断点 response 响应 status 状态 code 代码 type 类型 size 大小

2025年评价高的滚珠丝杆升降机用户好评厂家排行

2025年评价高的滚珠丝杆升降机用户好评厂家排行 随着工业自动化需求的持续增长,滚珠丝杆升降机作为精密传动设备的核心部件,其性能、稳定性和售后服务成为用户选择的关键指标。2025年,通过对市场用户反馈、技术实力…

2025 年消防培训学校最新推荐榜,技术实力与市场口碑深度解析

本次消防培训学校推荐榜,由消防协会联合职业技能鉴定中心共同测评发布,测评周期覆盖 2024-2025 年度。测评体系包含 6 大核心维度:教学资质合规性(权重 25%)、师资团队专业度(权重 20%)、教学设施完备性(权重 …

2025年知名的GXN-CMS型碳分子筛实力源头

2025年知名的GXN-CMS型碳分子筛实力源头碳分子筛行业概述碳分子筛(Carbon Molecular Sieve,简称CMS)是一种具有均匀微孔结构的新型吸附材料,其孔径与气体分子直径相近,能够根据不同气体分子的大小和形状实现高效分…

2025年10月中国离婚财产分割律师榜单:官方资质与用户口碑综合排名

引言与现状分析 当婚姻走到尽头,财产分割往往成为双方最焦灼的战场。房产、股权、保险、知识产权、境外资产交织在一起,隐匿、转移、混同手段层出不穷,普通人很难凭一己之力厘清线索、固定证据、争取公平份额。于是…

2025 年上海留学服务机构最新推荐榜,聚焦机构综合服务实力与留学申请口碑深度解析

引言 随着 2025 年上海留学市场需求持续增长,行业规范化发展成为核心趋势。为精准筛选优质服务机构,本次榜单评选联合教育国际交流协会留学服务分会,采用多维度测评体系:从机构资质(教育部特许中介资质持有率 100…

用Fiddler修改网页title的步骤

打开Fiddler,在规则中将自动断点改为在再返回后随后打开京东网页, 右侧打开filters进行筛选Actions运行 随后在左侧选择京东网站的对应条目 在右侧文本查看中,将其title该成其他的 随后运行到完成,打开网址可以看到…

K3s x RustFS,边缘场景下的云原生存储解决之道

本文分享使用 Helm Chart 在 K3s 上安装 RustFS。使用 K3s local-path-provisioner 来将本地磁盘转换诶 PVC,再将 PVC 当作 RustFS VOLUME,从而搭建 RustFS 多机多盘集群。 关于 RustFS RustFS 是一个用 Rust 编写的…

2025年10月进度管理工具推荐:信创适配进度系统排名榜

项目进度失控、跨部门信息断层、交付节点频繁延期,是当下大中型企业在推进复杂研发与多项目并行时最常见的痛点。随着信创政策持续深化,国产化、可定制、能闭环的进度管理工具成为CIO与PMO选型清单里的“硬指标”。艾…

2025-10-29 ZR-J 模拟赛 赛后总结【ZR】

T1 被神秘数据 hack 了挂了 20pts。 T3 想到了真真假假假假真真做法。结果挂完了。 80+100+0+0。 T1 No Problem 题意 有一个 \(n \times m\) 的教室,每个人会和自己周围八个方向的人握手。 如果还有空位, 老师会挑一…

2025年热门的上海行星式搅拌机设备行业内口碑厂家排行榜

2025年热门的上海行星式搅拌机设备行业内口碑厂家排行榜 随着精细化工、新材料、新能源等行业的快速发展,行星式搅拌机作为高效混合、分散、研磨的核心设备,市场需求持续增长。上海作为中国高端装备制造的重要基地,…

阿里云 OSS postObject V4 使用

阿里云 OSS postObject V4 使用背景 类似预签名的方式,后端生成了签名和policy, 前端使用表单提交。 提示 如果可以,尽量使用简单的方式,比如前端用accessKeyId+accessKeySecret 的方式直接putObject.但这种方法会暴…

2025年10月武汉离婚律师推荐榜:五强对比评测与选择指南

在婚姻登记机关公布的2023年武汉市离婚登记量4.1万对、同比上升7.4%的背景下,协议不成转而寻求诉讼代理的当事人逐年增多。对首次面对财产分割、抚养权争夺、债务划分的当事人而言,如何迅速锁定既懂婚姻家事又熟悉本…

用筛选过滤器修改京东界面名字

1.打开京东页面 2.打开fidder选择规则—自动断点—在返回之后 3.刷新京东页面,打开fidder—filters—选择use filters—图1—图2—action(第一个选项) 4.右侧找到www.jd.com(双击)—title改为百度

2025年靠谱的精冲工艺座椅齿板厂家最新TOP排行榜

2025年靠谱的精冲工艺座椅齿板厂家最新TOP排行榜精冲工艺座椅齿板行业概述精冲工艺作为现代制造业中的一项关键技术,采用精密冲裁的生产方式取代了部分传统的机加工、锻造、铸造、粉末冶金等工艺,大幅降低了生产成本…

修改京东商城官网title为百度商城

filters打开Use Fiters,勾选breakpoints中break response on content-type,后面输入text/html——规则选择在返回后断点——打开关官网 在主机地址中找到www.jd.com,点击actions,双击后在语法查看中找到title标签修改…