尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
交流最小内核的学习和实现方法
什么是操作系统操作系统是一种控制计算机系统及其资源运行的软件。说到底一个操作系统在无依托的环境运行是任务重要的工作因为上面所有的应用都在OS(操作系统简称)里面运行。需要的必备知识初次接触操作系统的学习应该掌握不用太多的知识现学现用和保持兴趣比一开始的完美更重要所有直接开始这个不太困难的学习吧。怎样的开发环境这个看你第一次接触是选择32位的、还是64位的操作系统开始写需要提醒的是32位是一切开发操作系统的理解底层虽然现在的64位操作系统是日常使用的主流。GCC 交叉编译器交叉编译器是需要经常接触的朋友在现在的编译已经由Makefile来组织可还能使用build.sh这样的Shell脚本文件来使用算是一个专业的组织、一个临时的运行。接下来进入正式的学习下载需要的编程环境Windows、macOS(苹果电脑)、Linux(开源操作系统)WSL(Linux环境的Windows子系统)安装需要工具的麻烦程度不同这个自己找AI去安装需要的开发工具环境多样、命令复杂、习惯不同就不浪费篇幅了。引导程序是什么东西[bits 16] [org 0x7c00] start: mov ax, 0 mov es, ax mov bx, 0x1000 mov ah, 0x02 mov al, 1 mov ch, 0 mov cl, 2 mov dh, 0 int 0x13 jc disk_error cli lgdt [gdt_desc] mov eax, cr0 or eax, 1 mov cr0, eax jmp 0x08:pm_entry [bits 32] pm_entry: mov ax, 0x10 mov ds, ax mov es, ax mov ss, ax mov esp, 0x7c00 mov edi, 0x2000 mov ecx, 1024 xor eax, eax rep stosd mov dword [0x2000], 0x3003 mov edi, 0x3000 mov ecx, 1024 xor eax, eax rep stosd mov ebx, 0x3000 mov eax, 0x00000003 mov ecx, 1024 fill_pt: mov [ebx], eax add ebx, 4 add eax, 0x1000 loop fill_pt mov eax, 0x2000 mov cr3, eax mov eax, cr0 or eax, 0x80000000 mov cr0, eax jmp 0x08:0x1000 disk_error: cli hlt gdt_start: dq 0 gdt_code: dw 0xffff dw 0 db 0 db 0x9a db 0xcf db 0 gdt_data: dw 0xffff dw 0 db 0 db 0x92 db 0xcf db 0 gdt_end: gdt_desc: dw gdt_end - gdt_start - 1 dd gdt_start times 510 - ($-$$) db 0 dw 0xaa55语法讲解NASM 汇编Intel 风格1. 方括号开头的三条是 编译指示伪指令不是 CPU 指令[bits 16]/[bits 32]告诉 NASM 生成 16 位还是 32 位机器码。代码前半段是实模式16 位后半段切到保护模式32 位所以一文件两段[org 0x7c00]声明代码的加载地址。BIOS 约定把引导扇区放到 0x7C00NASM 依据它计算所有标号的绝对地址2. 标号labelstart:、disk_error:、gdt_start:、pm_entry:都是地址符号供jmp、loop、jc定位。pm_entry前面没有分隔指令靠jmp 0x08:pm_entry这个远跳转直接跨过去。3. 数据定义伪指令db/dw/dd/dq依次定义 1/2/4/8 字节数据。GDT 的三个描述符就是用手写的 8 字节拼出来的times 510 - ($-$$) db 0填充语句。$ 当前位置$$ 本段起始$-$$ 已写入字节数整体意思是 把扇区填满到 510 字节dw 0xaa55引导扇区魔数55 AABIOS 靠它确认这是个可启动盘4. GDT 手工构造gdt_start: dq 0空描述符gdt_codegdt_data。lgdt [gdt_desc]把 GDTR 加载。两个描述符都是扁平模型base0limit4GB代码段类型 0x9A、数据段 0x92。0x08是代码段选择子index 1RPL00x10是数据段选择子index 2。5. 关键指令表格指令作用int 0x13AH0x02BIOS 磁盘服务读扇区。AL 数量、CH/CL 柱面 / 扇区、DH 磁头、ES:BX 目标地址 → 读 loader.bin 到 0x1000jc disk_error进位标志 CF1读取失败则跳转cli/lgdt关中断 / 加载全局描述符表mov eax,cr0; or eax,1; mov cr0,eax读 - 改 - 写 CR0置 PE 位 进入保护模式rep stosd把 EAX 反复写入 ES:EDI每次 4ECX 递减到 0用于快速清零 4KB 区域mov dword [0x2000], 0x3003页目录第 0 项 页表地址 0x3000 | 0x3Present 可写loop fill_ptECX-1不为 0 则跳回循环填 1024 个页表项每项映射一页 4KB共 4MB恒等映射mov cr3, eax/or eax, 0x80000000载入页目录基址 / 置 CR0 的 PG 位 开启分页属于什么编程风格Intel 语法 NASM 方言操作数顺序是 目的在前、源在后mov ds, ax这是 Intel 语法与 GNU 汇编的 ATT 语法movl %ax, %ds正好相反。[org]、times、$/$$这些是 NASM 特有的写法。要怎么能打印 颜色字符void kernel_main() { char *video_memory (char*) 0xb8000; video_memory[0] H; video_memory[1] 0x0e; video_memory[2] e; video_memory[3] 0x0e; video_memory[4] l; video_memory[5] 0x0e; video_memory[6] l; video_memory[7] 0x0e; video_memory[8] o; video_memory[9] 0x0e; video_memory[10] ; video_memory[11] 0x0e; video_memory[12] W; video_memory[13] 0x0e; video_memory[14] o; video_memory[15] 0x0e; video_memory[16] r; video_memory[17] 0x0e; video_memory[18] l; video_memory[19] 0x0e; video_memory[20] d; video_memory[21] 0x0e; video_memory[22] !; video_memory[23] 0x0e; while(1); }ENTRY(kernel_main) SECTIONS { . 0x1000; .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } }为什么能打印 颜色字符因为 0xB8000 是 VGA 文本模式显存而写的是 字符 颜色属性 对不是普通字符串。内存映射 I/O0xB8000 是显卡的显存基址显卡硬件会持续扫描这块内存并把它渲染到屏幕上。CPU 往这个地址写数据 直接改屏幕不需要任何输出函数。每 2 字节 1 个屏幕字符低字节video_memory[0] 字符的ASCII 码H 0x48高字节video_memory[1]颜色属性0x0E属性字节的位含义低 4 位前景色16 色、中间 3 位背景色8 色、最高位闪烁 / 亮度。0x0E 0000 1110→ 前景111014 亮黄、背景000黑→黑底黄字所以代码里的H和0x0e必须成对出现—— 前者决定显示什么字后者决定显示成什么颜色。24 个赋值正好是 12 个字符 × 2 字节。这就是裸机编程里的 最原始输出没有 printf、没有系统调用直接写显存。改一下属性字节比如 0x1e、0x07字色就变。这个链接脚本的作用是什么它的作用是告诉链接器 代码放在哪个物理地址、段怎么排、入口在哪—— 因为裸机内核没有操作系统来帮你加载。怎么编译运行nasm -f bin entry.asm -o entry.bin gcc -m32 -ffreestanding -fno-pic -c loader.c -o loader.o ld -m elf_i386 -Ttext 0x1000 --oformat binary -o loader.bin loader.o dd if/dev/zero ofos.img bs512 count100 dd ifentry.bin ofos.img bs512 count1 convnotrunc dd ifloader.bin ofos.img bs512 seek1 convnotrunc qemu-system-x86_64 -drive formatraw,fileos.img编译的运行结果
RELATED

相关推荐

python multiprocessing多进程变量共享与加锁的实现

python multiprocessing多进程变量共享与加锁的实现

多进程变量共享与加锁的实现更新时间是2019年10月02日10:00:11, 作者是京酱玫瑰。这篇文章的核心内容是介绍如何实现多进程中的变量共享以及相关的加锁机制。文章内部提供了示例代码, 并且对这些示例代码的解释是非常细致的。这种详细程度的讲解, 对于大家在实际学习与工作当中…

📅 2026/10/1 10:22:57
2026年了,前端还能转全栈吗?Java路线+AI辅助干活全攻略

2026年了,前端还能转全栈吗?Java路线+AI辅助干活全攻略

2026年, 前端转全栈这件事, 已经从个人选择变成了企业刚需。最近不少同行反馈说, 公司开始主动推动前端同学向全栈方向发展, 尤其是Java后端的需求依然很旺盛。不过, 大家现在都提出了一个问题, 那就是前端到底该怎么走这条路? Java的学习路线究竟要怎么安排比较好? AI技术能…

📅 2026/10/1 10:22:57
华为AI开发者空间

华为AI开发者空间

在网络请求当中, 请求超时这种情况是不可避免的, 如果不设置好相关的参数, 那么你的程序很有可能会出现一直无法响应的状态。关于超时这一情况, 还可以将其分为连接超时和读取超时这两种类型, 从比较简单的角度出发去理解的话, 所谓连接超时, 指的就是在客户端发出请求直至与服…

📅 2026/10/1 10:22:57
MORE NEWS

更多资讯

📰

CTF新手入门指南:赛制、五大方向与练习平台全解析

我是从Web方向入坑CTF的,后来为了补短板又把杂项、密码学、逆向都摸了一遍,现在回过头来看,新手阶段最痛苦的不是“不会做题”,而是“不知道该学什么、按什么顺序学”。网上的入门资料要么太散,要么直接甩一脸高难度赛…

📰

用Java从零搭建P2P视频通话系统:信令、RTP与NAT穿透实战

1. 视频通话的Java世界观:先搞懂我们要做什么 很多Java开发者一听到“视频通话”就头大,心里冒出的全是WebRTC、音视频编解码、回声消除这类听起来就复杂的专业术语,似乎这个东西天然就应该属于C开发者。实际上,纯用Java做一套可运…

📰

OpenClaw本地智能体部署实战:8分钟跑通Skill机制

说实话,我第一次看到“ OpenClaw(Clawdbot) ”这名字的时候,第一反应是又一个套壳的AI玩具。但真正花了一晚上把它跑起来,又把两个自定义 Skill 挂上去之后,我得承认,这玩意儿在“本地智能体…

📰

C++与SDL2复刻金庸群侠传:2D游戏引擎开发实践指南

简介:这是一份以SDL2为基础、用C实现的2D游戏引擎源码,目标是复刻DOS经典《金庸群侠传》,并提供一个实际可运行的移植范例,适合具备C基础、对游戏开发或老游戏移植感兴趣的开发者。压缩包内共186个文件,其中h/cpp/hpp源…

📰

SDL2+C++自制2D游戏引擎:复刻金庸群侠传实战指南

简介:这是一份以SDL2为基础实现的2D游戏引擎源码,以复刻经典DOS游戏《金庸群侠传》为实战目标。适用于已掌握C基础、希望深入游戏框架设计与SDL2应用的开发者,也适合对早期国产RPG实现方式感兴趣的爱好者。压缩包共186个文件,体积…

📰

遗传算法优化BP神经网络:解决预测模型过拟合与局部极小值问题

简介:这份资源面向需要做时间序列或函数拟合预测的MATLAB用户,尤其是想摆脱BP网络易陷入局部极小、收敛慢等困扰的初学者与工程实践者。它用遗传算法对BP神经网络的初始权值与阈值进行全局寻优,再交由BP完成精细训练,从而提升预测…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬