人才程序员
软件:C/C++ Qt CMake 数据结构 Linux网络。C++Opencv Python 前端(HTML、CSS....) 鸿蒙软件开发ArkTS 硬件:51单片机,esp系列(esp32、esp8266、esp32-s3),stm32、freertos。openharmony。可以带徒弟:C/C++ Python Lua STM32 esp32
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
自己写操作系统之第五课:内存管理基础
它负责跟踪内存的使用情况,分配内存给需要的程序,并在不再需要时回收内存。我们将实现一个简单的内存分配器,使用一个称为"堆"的内存区域来满足内存请求。在我们的实现中,堆从内核代码结束后的地址开始(0x10000)。在下一课中,我们将学习如何实现一个简单的shell,使用户能够与我们的操作系统交互。在操作系统中,动态内存分配是一个重要的功能。它允许程序在运行时请求内存,并在不再需要时释放内存。在一个完整的操作系统中,内存管理要复杂得多。首先,我们需要实现一些基本的内存操作函数,如内存复制和设置。原创 2025-05-02 14:09:11 · 46 阅读 · 0 评论 -
自己写操作系统之第四课:中断与ISR实现
中断是一种机制,允许硬件设备或软件请求CPU的注意力。当中断发生时,CPU会暂停当前执行的程序,保存其状态,然后执行一个特殊的程序(中断服务例程)来处理中断。处理完成后,CPU恢复之前的程序执行。硬件中断:由硬件设备触发(如键盘、定时器)软件中断:由软件指令触发(如系统调用)异常:由CPU内部错误触发(如除零错误、页错误)// 在kernel.c的user_input函数中添加\n");// 触发页错误中断// 触发除零错误} else {原创 2025-05-02 14:08:32 · 67 阅读 · 0 评论 -
自己写操作系统之第三课:屏幕驱动实现
/ 在screen.h中添加更多颜色定义0xf00x0a0x09// 在screen.c中添加新函数int i = 0;= 0) {// 在kernel.c中。原创 2025-05-02 14:02:18 · 65 阅读 · 0 评论 -
操作系统之第二课:启动过程与保护模式
在下一课中,我们将学习如何实现屏幕驱动,使我们能够在保护模式下控制屏幕输出。我们将深入了解VGA文本模式,并实现一个简单的屏幕驱动程序。当你按下计算机的电源按钮时,发生了什么?全局描述符表是保护模式下内存管理的核心。让我们看看我们的GDT实现(在切换到保护模式之前,我们需要从磁盘加载内核到内存。,这是为了向后兼容最早期的8086处理器。为了使用现代CPU的全部功能,我们需要切换到32位的。如有任何问题,请随时提问。当计算机启动时,CPU处于16位的。切换到保护模式的步骤(原创 2025-05-02 14:01:31 · 45 阅读 · 0 评论 -
第一课:操作系统开发入门
大家好!欢迎来到我们的操作系统开发教程。在开始编写代码之前,让我们先了解一下什么是操作系统。操作系统是计算机最基础的软件层,它负责管理计算机硬件资源,并为用户程序提供服务。进程管理:创建、调度和终止进程内存管理:分配和回收内存资源文件系统:管理文件的存储和访问设备驱动:控制各种硬件设备用户界面:提供与用户交互的方式。原创 2025-05-02 14:00:01 · 71 阅读 · 0 评论 -
操作系统汇编第十一节:打造属于你的 Cross Compiler!
手动构建一个专门用于我们自制操作系统的交叉编译器(i386-elf-gcc),为之后的内核编译打好基础。🔁 构建过程可能会比较久,可以喝杯茶 ☕ 等一下。,让我们的内核能被精确地加载到指定内存地址!下一节我们将介绍如何编写一个。源码自行构建一个目标为。✅ 完成后,你将拥有一套。原创 2025-05-02 13:53:47 · 57 阅读 · 0 评论 -
操作系统汇编教程(第10课):从引导区跳转到 32 位 C 语言内核!
步骤内容🔧 设置堆栈初始化 SP 和 BP📥 加载内核读取硬盘扇区到内存🌀 切换模式实模式 → 保护模式💻 执行内核汇编跳转 C 函数✅ 显示成功VGA 文本输出。原创 2025-05-02 08:19:30 · 39 阅读 · 0 评论 -
操作系统汇编教程(第09课):32位模式下的 GDT(全局描述符表)实现
GDT(Global Descriptor Table,全局描述符表)是x86 架构处理器在保护模式下使用的一张段描述表定义各个内存段的起始地址、大小、权限等;替代实模式下的“段寄存器 * 16”的地址模式;实现虚拟内存、内存保护等现代操作系统功能。字节内容0-1段限长 0~15 位2-3基地址 0~15 位4基地址 16~23 位5标志和访问位(例如是否是代码段)6段限长 16~19位 + 其他标志7基地址 24~31 位加载 GDT 后,通过lgdt。原创 2025-05-02 07:11:45 · 53 阅读 · 0 评论 -
操作系统汇编教程(第08课):切换到32位保护模式并打印字符(Protected Mode Hello)
概念说明GDT全局描述符表,定义段的权限和范围lgdt加载 GDT 表地址CR0.PE位开启保护模式Far Jump刷新 CS 段寄存器0xB8000文本显存地址(80x25)字符显示。原创 2025-05-01 08:03:58 · 52 阅读 · 0 评论 -
操作系统汇编教程(第07课):引导扇区读取硬盘数据(bootsector-disk)
前面我们写的 bootloader 只是显示了简单的字符串,本节我们将真正迈入「操作系统的核心职责」之一:🚀从磁盘读取数据(读取下一阶段的加载器或内核)**扇区(Sector)**是磁盘最小的读写单位,大小通常为512 字节第 0 个扇区称为MBR(主引导记录)BIOS 启动时会自动把0号扇区加载到0x7C00,并从那开始执行。原创 2025-05-01 07:57:36 · 48 阅读 · 0 评论 -
操作系统汇编教程(第06课):引导段的分离与段寄存器的使用
寄存器名称用途CS代码段DS数据段SS栈段ES通常用于扩展数据访问📌 注意:段寄存器 + 偏移地址 = 实际内存地址mov ds, ax那么地址ds:0x0020实际指向的是物理地址。原创 2025-05-01 07:55:29 · 43 阅读 · 0 评论 -
第05课:函数与字符串!真正的子程序从这里开始!
本节我们将尝试实现一个带参数的函数(子程序),并初步处理字符串。这是构建更复杂操作系统功能的第一步。我们将开始拆分代码段与数据段,尝试更加“模块化”的引导加载器!在汇编中,没有“函数”这个语法概念,但我们可以使用。所以字符串要一个一个打印。读取字符串并逐字打印,直到遇到。非常清爽地完成了我们的字符串输出!来作为字符串结束标志。原创 2025-05-01 07:53:14 · 31 阅读 · 0 评论 -
操作系统第04课:引导栈!栈帧与压栈弹栈原来这么简单!
栈(Stack)是计算机内存中一块后进先出(LIFO)的结构。暂存变量保存函数调用返回地址实现递归或中断嵌套处理低地址 ────────────▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶ 高地址[ ... | 数据3 | 数据2 | 数据1 ] ← 当前 ESP 指向的数据↑ ESP 指向栈顶。原创 2025-05-01 07:46:33 · 43 阅读 · 0 评论 -
第03课:引导内存!我们来操作最底层的 RAM!
内存(RAM)是 CPU 用来“暂时存放”数据和指令的空间。程序运行时,所有变量、栈、代码,统统都在内存中展开!物理地址 = 段寄存器 × 16 + 偏移地址mov ds, ax;段地址是 0x0000偏移是 0x7C00。原创 2025-05-01 07:44:09 · 30 阅读 · 0 评论 -
第02课:引导打印!实现一个简易的 `puts` 函数!
puts。原创 2025-05-01 07:42:45 · 23 阅读 · 0 评论 -
第01课:引导扇区 Hello World!屏幕上输出第一个字符!
让你的自制操作系统第一次“开口说话”:在屏幕上显示一个字符!这意味着 BIOS 启动过程 → 引导扇区执行 → 屏幕输出,全链路打通!中断服务来控制屏幕,我们将用它来显示字符。我们将封装输出逻辑,写出自己的“输出函数”!在 x86 实模式中,BIOS 提供了。原创 2025-05-01 07:40:12 · 31 阅读 · 0 评论 -
第00课:准备好了吗?在 Ubuntu 下打造属于你的操作系统开发环境!
👨💻 本节目标打造一个干净利落的系统开发环境:能写汇编、能编译、能启动操作系统!这节是你 DIY 系统的第一步!📦 一条命令装全套:✅ 安装完成后,输入以下命令确认是否成功:📁 二、创建第一个操作系统引导文件夹💻 三、Hello BIOS:写一个最简单的引导扇区(boot.asm)新建一个文件:,输入如下内容:🧠 解释知识点:解释:你应该会看到一个黑屏,这就对了!因为我们只写了 (停机),系统成功启动了你的二进制文件!📄 boot.asm:🔧 编译命令:🚀 运行原创 2025-05-01 06:45:37 · 34 阅读 · 0 评论 -
【搞懂 AT&T 汇编指令格式】源 → 目标,一篇就够!
在AT&T 语法中,操作数1(源),操作数2(目标)把立即数 1 放进 %eax 中你没看错,$1是源,%eax是目标!在 AT&T 汇编中,操作数顺序是源 → 目标,寄存器加,立即数加,后缀标明大小!理解这几个“奇怪”的规则后,写起 AT&T 汇编就能轻松不少啦🎉!原创 2025-05-01 06:44:01 · 53 阅读 · 0 评论 -
【GAS 汇编常用指令速查表】Intel ↔ AT&T 对照手册
无论是需要切换语法的老手,还是刚接触汇编的新手,掌握这些基础知识,能帮助你在不同的开发环境中游刃有余🎯。要是你在使用 AT&T 汇编语法时,时常感到对比。语法时不够流畅,不用担心!,帮助你快速切换,方便你在编程过程中参照。为了方便你理解,下面列出了一些常见的。的常见指令,并理解如何将它们与。首先来个快速回顾,帮助你理解。,且内存地址可带有偏移量。:寄存器直接使用,如。原创 2025-05-01 06:43:56 · 33 阅读 · 0 评论 -
通用寄存器命名规则:`%eax`、`%ebx` 等的背后
在计算机的 CPU 中,寄存器是用来存储数据、地址等信息的高速存储单元。通用寄存器(General Purpose Registers,简称 GPR)是 CPU 中最常用的寄存器,用来执行大多数计算操作和数据传输操作。这些寄存器是处理器内部非常关键的一部分,在汇编语言中,你会看到我们直接通过这些寄存器来进行数据的存储、移动、运算等操作。在 x86 架构的汇编中,最常见的通用寄存器有 8 个,它们通常命名为eaxebxecxedx等,它们在汇编程序中扮演着重要角色。📌。原创 2025-04-30 19:02:44 · 41 阅读 · 0 评论 -
栈寄存器 `%esp` 和 `%ebp` 的作用:理解栈操作的关键
栈(Stack)是一种后进先出(LIFO)的数据结构。函数调用时的返回地址函数的局部变量保存寄存器的现场信息(如栈帧)栈的空间通常由操作系统或程序的内存管理机制来划定,它的增长方向通常是向下的——也就是说,栈顶向较低的内存地址扩展。在接下来的文章中,我们将深入探讨如何通过调试工具(如 GDB)追踪栈的变化,查看%esp和%ebp如何在运行时变化,以及如何利用这些信息进行程序调试!敬请期待!🚀。原创 2025-04-30 19:02:35 · 36 阅读 · 0 评论 -
汇编中的寄存器与指令集:让你的程序飞起来!
寄存器(Register)是 CPU 内部的超高速存储单元,它们用于临时存放指令执行时需要用到的数据或地址。简单说,寄存器就像是 CPU 手边的“小本子”,速度极快,但数量有限。原创 2025-04-30 19:02:29 · 32 阅读 · 0 评论 -
汇编高手炼成记!揭秘函数的栈帧魔术
保存老环境(保存ebp创建新环境(修改esp,开辟局部变量空间)调用完成后恢复老环境,回家(恢复ebpret标准套路(顺序必须记!留出局部变量空间...pop ebpret推导关系ebp= 本函数的栈基址[ebp + 8]= 第一个参数[ebp - 4]= 第一个局部变量。原创 2025-04-30 19:02:19 · 30 阅读 · 0 评论 -
分析 C 编译生成的汇编流程——程序的运行时行为
程序的运行过程通常是非常复杂的,我们可以通过调试工具来观察程序的行为,追踪程序的执行路径,查看内存中的数据等。栈的内存由操作系统自动管理,随着函数调用的嵌套,栈的内存会逐层增加。在本期中,我们解锁了程序从加载到执行的全流程,并且学到了如何利用调试工具查看程序内部的运行细节。是一个系统调用追踪工具,可以帮助你查看程序与操作系统的交互,捕获系统调用如文件操作、内存分配、网络请求等。通过优化数据结构,减少频繁的内存访问,可以提高程序的效率。让我们一起揭开它的神秘面纱!随着程序的执行,我们常常希望优化程序的性能。原创 2025-04-30 19:02:06 · 41 阅读 · 0 评论 -
从 C 调用汇编函数:跨越语言的神奇桥梁
通过这一期的内容,我们学习了如何从 C 语言调用汇编函数,掌握了汇编函数的编写、C 语言中的调用声明,以及如何链接和调试这两者的结合。所以,尽管 C 是一种高级语言,但通过从 C 调用汇编函数,你能够在需要时利用汇编的性能优势和硬件控制能力。在一些高性能要求的应用中,汇编语言能提供比 C 更直接的控制,让你在优化关键部分时有更多的空间。可以帮助你逐步跟踪程序的执行,检查栈的状态,并确保参数正确地传递给了汇编函数。,以及如何处理栈和寄存器的细节。这表明,我们成功从 C 调用了汇编函数,并获得了正确的返回值!原创 2025-04-30 19:02:01 · 28 阅读 · 0 评论 -
汇编调用 libc 函数(如 `printf`)并传参
printf。原创 2025-04-30 19:01:56 · 26 阅读 · 0 评论 -
汇编中的 `global` 指令:揭开符号暴露的面纱
在汇编语言的世界里,每个程序都有不同的功能模块和结构。为了让不同的模块能够顺利地互相访问和连接,我们需要一种机制来暴露符号(如函数、变量等)。这时, 指令就派上用场了。它的作用是告诉汇编器,某个符号需要在其他模块或目标文件中可见。在汇编语言中, 是一种伪指令(pseudo-op),它的作用是将某个符号标记为全局符号,使得该符号可以被链接器(linker)和其他模块引用。简单来说, 是汇编中的“公开声明”,让你指定哪些函数或变量可以被其他代码访问。:需要被暴露的符号(比如标签、函数名等)。🧐 作用与原创 2025-04-30 19:01:43 · 44 阅读 · 0 评论 -
汇编从 `_start` 到 `main`:程序的真正起点你知道是谁吗?
start如果说main()是舞台上闪耀的主角,那_start就是悄悄拉开帷幕的幕后工人,没有它,程序根本登不上场。了解_start,不仅能帮你理解 C 程序运行的全过程,也能为你深入学习操作系统、汇编、裸机开发打下基础!原创 2025-04-30 19:01:37 · 42 阅读 · 0 评论 -
初识汇编程序结构:段模型大揭秘!
段名作用是否初始化是否分配文件空间.text存放指令代码是是.data存放已初始化的变量是是.bss存放未初始化的变量否(默认为0)否这三大段是 ELF 可执行格式的基本组成部分,在 AT&T 风格的 GAS 汇编中使用频繁,也是你编写可执行汇编程序绕不开的“核心地带”!💡。原创 2025-04-30 19:01:29 · 33 阅读 · 0 评论 -
《Linux 下的 NASM 安装与使用》——从零开始玩转汇编世界!
NASM,全称,是一款超级流行的 x86 汇编语言编译器。它的优点👇✅ 开源免费✅ 支持 Intel 风格语法(是不是比 AT&T 的亲切多了😅)✅ 可输出 ELF、COFF、BIN 等多种格式,适合各种场景~项目NASM(Intel 风格)GAS(AT&T 风格)语法风格编译器nasmas难度清晰易读 😍稍显抽象 🤯✅ 推荐初学者使用 NASM(Intel 风格),更加直观、语义明确。但要深入 Linux 内核和系统编程,AT&T 风格也是迟早要碰的!💪。原创 2025-04-30 19:01:24 · 34 阅读 · 0 评论 -
汇编语言分类:Intel 与 AT&T 语法,Windows(MASM) vs Linux(NASM/GAS)
汇编语言虽然看似低级,但它直接与硬件和操作系统交互,学习它可以帮助我们更深入地理解计算机的工作原理。不同的语法和工具链能够帮助开发者在不同的操作系统上实现高效的底层开发。Intel 和 AT&T 语法的选择取决于开发环境,而 MASM 和 NASM/GAS 的使用则主要取决于操作系统和开发需求。在学习汇编语言时,了解这些差异有助于您更好地掌握汇编编程,并能够在不同平台上进行高效的开发。原创 2025-04-30 19:01:18 · 42 阅读 · 0 评论 -
手动修改汇编,重新打包二进制!(二进制小改造!)
一行源代码没动,却改了程序行为!于是,把那一段手动替换成新的十六进制!超带劲的逆向魔改,从下一章正式起航!程序,但我们要做点小动作,比如——,明明没注册,偏偏让你直接通过!真正的黑客玩法来了!的十六进制已经找到了。把程序的可读数据段(原创 2025-04-30 19:01:09 · 27 阅读 · 0 评论 -
Linux 系统调用起底!int 0x80 与 syscall 动作揭秘!
用户程序请求内核服务的一扇门。比如你调用printf,实际上它最终要靠内核的write系统调用把内容写出去。把系统调用号传给内核(告诉内核:我要干啥)把参数也传给内核(比如:我要写哪块内存,写多长)触发一次特殊的指令,让 CPU 从用户态切换到内核态!系统调用触发方式特点int 0x80老式 32 位兼容性好,但性能低syscall新式 64 位快速,现代架构推荐!手动syscall,你就真正摸到了内核的门把手!🔑。原创 2025-04-30 19:01:00 · 47 阅读 · 0 评论 -
初探 MBR 引导扇区!+ 亲手写个16位Hello World!
MBR,全称第0扇区!512字节。位置大小内容说明0x000446字节引导程序(Bootstrap)你写的启动代码就在这里跑!⚡0x1BE64字节分区表(Partition Table)描述硬盘分区信息0x1FE2字节结束标志(Boot Signature)必须是0x55AA,BIOS才认得!✅你的引导程序必须塞在前446字节内最后2字节写上 0x55AA,否则 BIOS 不理你!原创 2025-04-30 19:00:56 · 29 阅读 · 0 评论 -
ELF 格式概述
ELF(Executable and Linkable Format)格式是 Linux 系统中常见的二进制文件格式,广泛应用于可执行文件、目标文件和共享库。无论你是开发者,还是逆向工程师,掌握 ELF 格式是必须的技能!🔍。原创 2025-04-28 07:56:12 · 39 阅读 · 0 评论 -
ELF 程序头表解析
程序头表(Program Header Table)是一个结构体数组,包含了与程序相关的段的描述信息。每个表项描述了一个段的内容,告诉操作系统如何将其加载到内存中。程序头表对于可执行文件尤为重要,它为加载器提供了运行时所需的所有信息。⏳。原创 2025-04-28 07:56:05 · 47 阅读 · 0 评论 -
ELF 文件头结构解析
ELF 文件头位于 ELF 文件的最前面,它包含了多个字段,描述了整个文件的基本信息。ELF 文件头由固定大小的 52 字节组成,其中存储了 ELF 文件的标识信息、文件类型、架构类型等关键信息。操作系统在加载 ELF 文件时,首先会读取这个文件头,确保文件是合法的 ELF 文件,并且能够被正确加载和执行。原创 2025-04-28 07:55:58 · 47 阅读 · 0 评论 -
用 `objdump` + `gdb` 逆向观察 C 编译结果!
工具作用objdump查看静态编译好的汇编指令gdb动态执行/调试程序,实时观察 CPU 寄存器和内存变化学会这两个,就可以开始玩简单逆向分析了!以后再遇到奇怪的程序行为,不用瞎猜,直接 objdump/gdb 打开一看,真相一目了然!😎。原创 2025-04-28 07:55:50 · 652 阅读 · 0 评论 -
从汇编调用 C 函数:揭秘两者的神秘联动!
🎯 你可能已经知道,汇编是与硬件打交道的语言,而 C 语言是高级语言。从编写 C 函数、了解调用约定到编写汇编代码,并进行链接,我们成功实现了两者的互通。这种跨语言调用不仅增强了程序的功能,也为你提供了更大的灵活性和控制力。为了让汇编代码成功调用 C 函数,我们需要将它们链接成一个完整的程序。使用 GDB 调试程序时,你可以逐步执行程序,检查栈中的参数,确保参数正确地传递给了 C 函数,并查看返回值。首先,我们要在 C 中定义一个简单的函数。为了从汇编中调用 C 函数,我们需要了解 C 编译器使用的。原创 2025-04-28 07:55:43 · 38 阅读 · 0 评论 -
段寄存器与保护模式概览**:让你理解现代计算机体系结构的基础!
通过了解。原创 2025-04-28 07:55:36 · 30 阅读 · 0 评论