登录社区云,与社区用户共同成长
邀请您加入社区
本文介绍使用Python脚本自动生成跨平台兼容的Makefile,解决不同操作系统及Shell对Makefile语法支持差异带来的编译配置难题。通过自动扫描项目中.c和.h文件,动态生成源文件列表与头文件路径,实现高效、可移植的编译配置,显著提升开发效率。
free释放只是告诉操作系统,这块空间不用了,可以给其他继续用,所以释放后建议直接p = NULL,如果多次free会破坏系统操作的内容。释放后这个指针称为悬空指针(悬空指针 --- 这个指针指针有有效的指向,但是后来这个指向的空间销毁 或释放了)如果后面的空间不够,就会重新找一块连续的空间,将原有空间的数据复制到新空间,再释放原有空间。在堆另外找一块满足大小的连续空间,把旧内存里的数据拷贝过去,
本文记录基于STM32ZET6的智能门禁项目开发过程,结合RT-Thread实时操作系统,实现人脸录入/删除、识别开门、温度报警等功能。通过串口与K210及语音模块通信,采用状态机+消息队列架构,提升代码可读性与可维护性。引入按键中断、定时器控制自动关门、人体红外检测防误触发等优化功能,并深入解析中断安全、多线程协作与系统设计思想,总结了对RT-Thread底层机制的理解与学习心得,为后续嵌入式开
数控系统一般是。
本文介绍了从零编写一个最小引导扇区的全过程,通过8行汇编代码实现在屏幕上显示字符'A'。核心内容包括:使用NASM编译、QEMU模拟运行,理解[bits 16]与[org 0x7c00]的作用,掌握寄存器操作(如AH/AL)、BIOS中断调用(int 0x10),以及关键的512字节对齐和0xaa55校验码机制。文章为后续内核开发(如加载更多扇区、切换保护模式)奠定基础,是学习操作系统底层原理的第
栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。(参考《函数栈帧的创建和销毁》)堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS(操作系统)回收。分配方式类似于链表
大家好,这是我的第一篇技术博客。作为一名信息安全专业的学习者,希望在这里记录自己的技术成长,分享学习心得,和同领域的小伙伴一起交流进步。我是一名大三学生,专业为信息安全技术应用。在过去两年的学习里,我系统接触了计算机网络、操作系统、Web 基础、密码学基础等课程,对网络攻防、漏洞挖掘方向产生了浓厚兴趣。目前还处在基础积累阶段,深知信安领域知识庞杂、需要持续打磨,所以打算通过写博客的方式,倒逼自己梳
题目:如果不检查的返回值是否出错,会发生什么?一句话:不检查,就是把"文件打不开"这个很容易处理的小问题,变成一个难以追查的大问题。从零理解:打开文件要靠操作系统帮忙,而操作系统可能拒绝你,原因很多:同样的树,用 Mermaid 画一遍:fopen 失败的原因文件不存在没有权限路径写错打开文件太多磁盘或系统问题这些情况在实际运行中一定会遇到,所以"文件打不开"不是例外,而是正常情况之一。 本质上是
本文系统阐述程序从源码到运行的全过程,涵盖翻译环境与运行环境。翻译环境包括预处理(宏替换、头文件展开、删除注释等)、编译(词法、语法、语义分析生成汇编代码)和链接(合并目标文件,解决符号引用),最终生成可执行程序。运行环境则由操作系统将程序载入内存,执行main函数,利用运行时堆栈管理局部变量与返回地址,直至程序终止。整个流程体现了程序从代码到执行的完整生命周期。
本文分析了Project Loom通过在JVM用户态实现Continuation与ForkJoinPool调度器,将虚拟线程(VirtualThread)与操作系统线程解耦,构建M:N调度模型。其核心是stackChunkOop堆内栈结构,支持动态链式扩容,实现纳秒级上下文切换。挂起(Freeze)时保存执行状态至堆内存,恢复(Thaw)时重建栈帧并跳转指令地址,由GC通过OopMap扫描栈帧引用
C 与 Go 并非简单的替代关系,而是面向不同问题的解决方案。C 追求极致的性能与硬件控制力,适合底层系统开发;Go 追求开发效率与工程化便利,适合现代云原生应用。选择哪种语言,取决于你的应用场景、性能要求与团队技术栈。若你正在开发操作系统或嵌入式系统,C 是必然之选;若你在构建微服务或云原生基础设施,Go 将是更高效的选择。
在上一章中,我们让OS能够加载并运行GCC编译的ELF文件。但此时的用户程序仍处于“原始状态”:每次系统调用都要手写int $0x80内联汇编,没有内存分配器,没有字符串处理函数,更没有printf。这就像给了你一辆能发动的汽车,却没有方向盘、油门和仪表盘。本章我们将构建一个,它是用户程序与内核之间的“标准翻译层”。从此,你的用户程序将使用熟悉的open()malloc()printf()等C标准
1972 年,贝尔实验室的丹尼斯·里奇(Dennis Ritchie)为重写 UNIX 操作系统设计了 C 语言。50 多年过去,它依然是"底层之王"。
REST API,官方CLI,官方hcloudTerraform provider和Ansible integration,所有这些都是为他们的云系列编写的。涵盖公共云、裸机、VPS和IAM的官方CLI,以及一家官方Terraform提供商,该提供商提供裸机特定的操作系统安装指南和通过API进行iPXE引导配置。Rackspace仍然在一些事情上做得很好,它的SLA是可靠的,它的支持组织是庞大的。
难度项目语言核心学习点入门TinyhttpdC网络编程、多线程入门CJSONC指针、数据结构入门2048 游戏C数组、状态机进阶SQLiteCB-Tree、SQL 解析进阶RedisC事件驱动、数据结构进阶LevelDBC++RAII、跳表挑战Linux 内核C操作系统核心挑战FFmpegC音视频、模块组织挑战C++张量、算子调度选择项目时,建议遵循「跳一跳够得着」的原则:选一个比当前水平略高、但
操作系统是控制计算机硬件与资源的核心软件,所有应用在其上运行。学习需掌握基础编程与汇编知识,推荐从32位环境入手,使用GCC交叉编译器与NASM汇编。通过编写引导程序、实现保护模式、开启分页,并直接操作显存(如0xB8000)显示彩色字符,可实现裸机输出。借助链接脚本指定内存布局,最终用QEMU模拟运行。整个过程涵盖底层开发关键技能,是理解操作系统本质的实践路径。
C语言程序从源码到运行需经历翻译环境与执行环境。翻译环境包括预处理(展开宏、包含头文件)、编译(词法、语法、语义分析生成汇编)、汇编(生成目标文件)和链接(解决符号引用,重定位地址)。多个.c文件分别编译为.o或.obj文件后,由链接器整合成可执行程序。运行时,操作系统将程序载入内存,调用main函数,使用栈存储局部变量,静态变量保留在静态内存中,最终执行完毕退出。
小编让大家利用本篇内容,对c语言有个全貌的认识都感知一下,然后接下来才是细致的学习,后面的阶段才是细枝末节,希望大家明白小编的设计思路。C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。(在应用层下面的东西就是底层,所以c语言特别擅长写操作系统和驱动)
系统调用:普通的应用程序在用户空间运行,总是需要可以和内核空间之间交换数据。一些IO指令都被限制在只有内核模式可以执行,为了操作系统的安全,操作系统有必要提供封装了系统调用的接口函数来尾应用层提供诸如读取磁盘某位置的数据的功能,这些接口被称为系统调用函数,简称系统调用库函数:如果我们把系统调用封装成抽象的功能函数,就可以起到隔离保护的作用。库函数是在函数内部调用该系统的系统调用接口,并封装入库供用
短期先把 C 语言学扎实,吃透指针、结构体这些重难点,同时打好数学基础,多刷算法题,慢慢培养写代码的感觉。中期啃下数据结构、操作系统、计算机网络这些专业课,试着自己动手做一些小项目,攒点作品,为之后的学习和求职铺路。长远来看,想做一名靠谱的后端开发,能写出干净稳定的代码,有能力解决真实场景里的工程问题。打算用写博客的方式记录学习过程,一方面巩固自己学到的东西,另一方面也希望能在这里认识更多一起学编
本文详解C语言中“Hello, World!”程序的每一行代码:#include <stdio.h>引入标准输入输出头文件,提供函数声明;int main()为程序入口,返回整数状态码(0表示成功);printf("Hello, World!\n");输出内容;return 0;告知操作系统程序正常结束。文中还解释了头文件与库的区别、void main()的非标准性及return 0的必要性与可省
替代选择排序由E.H. Friend提出,Knuth系统化并证明其平均归并段长为2M。该算法在磁带时代用于外部排序,通过最小堆动态生成有序段,显著减少归并轮次。其核心是:输出堆顶后,若新元素≥前一输出则续接当前段,否则冻结至下一段。适用于内存受限场景,提升外排序效率,成为数据库与操作系统中外部排序的理论基石。
你简历中明确写了:EtherCAT 任务本地/SSH 执行。实际上就是:程序占着这个终端。你可能无法直接继续使用当前终端。但真正的工程部署通常不会简单依靠。systemd这就会进入真正的工程部署。这才是你真正应该建立的 Linux 思维。
本文介绍 HRTOS 向产品化持续迈进的思路。通过真实硬件验证、持续测试、文档完善和工程优化,不断沉淀已有功能,努力打造一个让用户放心使用、能够长期维护的 8051 操作系统。未来 HRTOS 将以存量打磨为主、必要增量为辅,示例主要围绕基础案例展开,在控制系统规模和复杂度的同时,持续提升稳定性与可维护性。
int main 特点:运行完毕后要给操作系统返回一个整数(故以 return 0 结束,以return 非零 结束=程序出错)2、main argv:字符串数组,存命令行传入的参数。今天主要介绍主函数(main)以及小白注意事项。老式写法void main(不推荐)1、main argc:参数个数。2、一条结束语后要有分号。1、代码不能用中文字符。四、以及小白注意事项。四、以及小白注意事项。
编程最吸引我的地方,不是语法本身,而是它提供了一种拆解问题的秩序:把模糊需求拆成模块,把复杂逻辑拆成函数,把一次失败拆成可验证的假设。与其把它写成一份自我介绍,不如把它当成一份公开的学习契约:从今天起,我会用写作记录编程路上的思考、项目与踩坑。真正让我决定认真学编程的,是一个很朴素的理由:我想拥有把想法变成产品的能力。我希望自己不只是“能跑就行”,而是能解释为什么这样设计,能读懂别人的代码,也能让
C 语言并不是凭空出现的,它是从一门更早的语言"B 语言"演化来的。B 语言诞生于 1971 年,运行在一台叫 PDP-11 的大型机器上,作者是贝尔实验室的研究员 Ken Thompson,他还用 B 语言写出了 UNIX 操作系统。但是 B 语言功能太简单,很多事情做不了,所以 1972 到 1973 年间,同样在贝尔实验室工作的 Dennis Ritchie 在 B 语言的基础上,设计出了
8月份开始接触到了华为的欧拉系统和可以在欧拉系统使用的虚拟化技术jailhouse。使用后不仅感叹虚拟化技术的精妙与国产开源系统的强大。因此想要介绍下欧拉系统和系统中经常使用的jailhouse技术openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、LoongArch、Po
这些问题的答案,都藏在 C 程序的内存分区里。本文用最直白的方式,把 C 程序的内存布局讲清楚。每次调用一个函数,系统就会在栈上压入一个「栈帧」,用来存放这个函数的局部变量、参数和返回地址。默认栈大小通常在 1MB 到 8MB 之间(取决于操作系统),所以递归过深或定义过大的局部数组,很容易导致栈溢出。修饰局部变量时,变量的作用域仍然是函数内部,但存储位置从栈区移到了全局区,所以它的值在多次函数调
本文深入解析C语言在嵌入式Linux开发中的核心难点,涵盖指针、内存管理、结构体布局、多文件工程、进程线程及资源生命周期等关键概念。强调从“类型与内存”关联入手,厘清数组、指针、字符串的本质区别,掌握malloc/free的所有权逻辑,理解static/extern的链接属性,并通过fork/exec、守护进程等实例,建立对操作系统交互的底层认知。最终目标是实现从“会写代码”到“写得稳、可维护”的
上次我们简单介绍了一下Linux系统编程的环境搭建,这篇开始正式走进Linux系统编程的篇章。我们之前介绍操作系统的时候说过,无非是为了更好控制硬件才选择开发操作系统,人与硬件的交互无非就是人输入,硬件输出想要的结果,但是我们知道硬件有很多类型,什么硬盘,网卡,终端,串口,管道等等它们底层硬件各不相同,要实现读写操作也十分麻烦,而且我们都知道学习Linux,首要就是要有一切皆文件的思想,以这个思想
CPU处理进程与线程的核心机制是操作系统通过状态管理、任务调度和资源分配实现并发执行。进程是资源分配的最小单位,拥有独立内存空间;线程是CPU调度的最小单位,共享进程资源。进程/线程经历新建、就绪、运行、阻塞、终止五种状态流转,操作系统通过短程调度算法(如FCFS、RR、优先级)在就绪队列中选择任务分配CPU时间片。线程实现模型分用户级(轻量但无法利用多核)、内核级(支持多核但开销大)和混合级(折
SDL3— 提供图形窗口、事件处理(鼠标/键盘)能力,模拟嵌入式 LCD 显示屏FreeRTOS— 实时操作系统内核,在一个独立的 Windows 线程中启动调度器,运行 RTOS 任务LVGL— 轻量级嵌入式 GUI 库,通过 SDL3 渲染显示Nimmake— Python 编写的构建工具,自动化管理编译、链接与依赖通过这种方式,你可以在没有硬件开发板的情况下,在 PC 上直接开发、调试和验证
SylixOS 字符设备驱动框架 = 以"路径名 / 主子设备号 / fd / 设备头"为键的多级映射表,把用户的逐层路由到具体的驱动回调。核心机制就是分层映射| 映射1 rootFs路径树 路径名 -> LW_ROOTFS_NODE -> LW_DEV_HDR| (字符串) (节点) (设备头)v| 映射2 设备头字段 DEVHDR_usDrvNum -> _S_deventryTbl[DrvN
本文基于STM32F407ZGT6芯片,配置时钟至168MHz,使用HAL库生成初始化代码。设计双向链表结构用于任务管理,实现链表初始化与节点插入功能。在此基础上,构建轻量级实时操作系统内核:定义任务控制块(TCB),静态创建任务并初始化堆栈,通过伪造中断现场(设置PC、LR、xPSR等寄存器值)实现任务切换。关键在于利用PendSV异常完成上下文切换,确保任务调度的可靠性与高效性。
SylixOS 中断子系统由三层构成,各层职责清晰分离:fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;BSP移植层内核层Arch适配层硬件层IRQ异常向量号查表写入初始化控制ARM CPU异常向量地址 0x00-0x1CSoC 中断控制器具
对其他线程间通讯方式,编写测试代码,根据实测结果及系统源码机制探究,梳理所有线程间通信方式,在实例对象delete()后,阻塞wait()线程间通信方式是否可被唤醒唤醒后返回状态二进制信号量✅️计数型信号量✅️互斥信号量✅️读写信号量✅️消息队列✅️事件集✅️条件变量✅️。
RMS 的核心逻辑可以压缩为:Create:创建 RMS,状态为 INACTIVE。First Period:切换到 ACTIVE,记录周期起点。Next Period:计算已执行时间。超周期:返回 ERROR_RMS_TICK。刚好到周期:直接进入下一周期。未到周期:线程进入 DELAY 等待。Tick:等待到期后清除 DELAY,线程重新 ready。Resume:_RmsEndExpire
操作系统通过硬件时钟中断感知时间,构建软件定时器与时间片调度机制,实现进程调度、超时检测等核心功能。基于中断的节拍计数驱动调度器,结合红黑树或时间轮管理定时器,支持单次与周期性触发。时间片轮转与多级反馈队列算法平衡公平性与响应速度。进程、内存、文件系统与中断处理四大模块协同运作,支撑系统稳定运行。本文通过C语言实例演示时间获取、定时信号与调度模拟,并结合高频面试题,构建“原理—实现—考察”闭环知识
刚开始你大概率会经常写不出代码、一堆报错,怀疑自己不适合编程。所有人学 C 的时候都经历过这个阶段。C 语言不仅仅是学一门语法,它在训练你的逻辑思维。学好 C 之后,再去学 C++、Java、Python、操作系统、数据结构都会轻松很多。
句柄”对应的英文单词是 Handle。在英语中,Handle 的本意是门把手、抽屉拉手或锅把。想象一下这个场景:你想搬动一口烧得烫手的铁锅。你肯定不会直接用手去抓锅身(直接操作内存/对象),而是会去抓锅侧面的“柄”(Handle)。通过抓住这个“柄”,你不仅能安全地控制整个铁锅,而且就算铁锅在炉子上被挪了位置(内存地址改变),只要“柄”还在你手里,你就依然能稳定操作它。在软件工程中,句柄就是操作系
结构体(struct)是C语言中最核心的自定义数据类型,它允许你把不同类型的数据打包成一个整体。无论是操作系统内核、网络协议还是数据库,底层都离不开结构体。
循环链表是链表家族的最后一位成员,其特点是**首尾相接形成闭环**。单向循环链表中,尾节点的 `next` 指回头节点;双向循环链表则头尾互相指向。遍历循环链表需用 `do-while` 结构,以"回到起点"作为终止条件,而非 `NULL`。它广泛应用于**约瑟夫问题**、**操作系统进程调度**、轮流游戏等"周而复始"的场景。至此,单链表(一条路走到黑)、双向链表(双向通行)、循环链表(周而复始
众所周知,Linux是一个多用户多任务操作系统。在多处理器(SMP)情况下存在真正的并行运算,因为线程是同时执行的。而在单处理器(uniprocessor,UP)情形中,并行是通过抢占实现的,即通过临时中断一个线程以执行另一个线程的方式来实现。当存在并发访问的可能时,必须使用有效的机制来保证同步和保护资源。另外对中断的处理也会打断正在运行的任务。
UWB协议框架是一个从IEEE底层标准到FiRa互操作性规范,再到Android等操作系统实现的完整体系。它通过分层设计,将复杂的无线通信技术封装成标准的UCI命令,使得上层应用开发者可以专注于业务逻辑,而无需深陷底层硬件细节。
本文从一块主板出发,层层深入,揭示了从硬件到代码执行的完整链路:CPU、内存、硬盘构成基础;操作系统作为特权程序管理硬件;进程获得虚拟地址空间(栈、堆、数据段、代码段);线程在进程中并发运行,共享资源但栈独立;最终,操作系统将线程调度至CPU执行指令。通过代码实例与比喻,清晰串联起“进程、线程、栈、堆”的本质关系,帮助小白构建系统级认知图景。
编译工具:gcc、make(Ubuntu);MinGW‑w64‑gcc(Windows)虚拟机:Ubuntu 22.04。宿主机操作系统:Windows。