images/logo.jpg

枕石的个人博客

C语言:x86 64_Linux汇编笔记


x86-64 Linux 汇编笔记(Intel 语法,System V ABI)

本文结合实际 ELF 二进制反汇编输出,整理出常见指令、字段、操作类型,以及它们在函数、初始化、PLT/ GOT 中的作用。

内存管理:堆

本文本文参考OSDev Wiki上关于CPU缓存的介绍,原文地址:https://wiki.osdev.org/CPU_Caches


Introduction(介绍)

最初,内存的速度和 CPU 一样快。随着时间推移,CPU 的速度越来越快。内存速度也在提升,但无法跟上 CPU 提升的速度,这意味着 CPU 需要花越来越多的时间等待来自 RAM 的数据(这会对性能造成严重影响)。

内存管理:堆

本文参考OSDev Wiki上关于“堆”的介绍及实现,原文地址:https://wiki.osdev.org/Heap

堆内存

Heap(堆)

堆是应用程序和内核都离不开的重要组成部分。通常,它位于更高层次的内存管理机制之下,而高层机制负责处理更大粒度的内存块。在大多数操作系统中,内存是按页(page)或其他较大的块进行分配的。在 X86 和 X64 架构中,一页通常是 4KB,但也可能更大。然而,对于较小的分配需求,如果直接占用整页会造成大量浪费。例如,只需要 24 字节却分配整整 4KB 页,将导致严重的内存浪费。因此,大多数应用程序和内核都会实现第二层内存管理:在以 4KB(或更大)为单位分配得到的内存块基础上,根据需求将这些一组页面或单独页面拆分成更小的部分进行分配。

内存管理:概述与介绍(译文)

本文译自 OSDev Wiki 上的一篇文章,原文链接为 Memory management - Overview and Introduction

内存管理是任何操作系统内核中的关键组成部分。为程序提供一种快速、可重复地分配和释放内存的机制是内核的一项主要职责。针对物理内存的分配存在多种实现方法,包括位图法、伙伴分配算法,以及基于树结构或队列/栈的内存管理方式。

内存管理:Brendan's Memory Management Guide(译文)

本文译自 OSDev Wiki 上的一篇文章,原文链接为 Brendan’s Memory Management Guide

概述

内存管理是所有操作系统开发者迟早都需要处理的问题。这个主题非常广泛;起初看起来似乎很简单,但往往会演变成比最初预想的更复杂的内容。这就容易导致人们在操作系统规模较小时做出一些看似合理(并且最初运行良好)的设计决策,但这些决策在系统变大后可能会成为严重的问题。

Linux实时调度策略:SCHED_FIFO、SCHED_RR和SCHED_DEADLINE设置示例

一、前言

Linux 支持多种任务调度策略(Scheduling Policy),其中:

  • 普通任务(SCHED_NORMAL) 是普通分时调度;
  • 实时任务(SCHED_FIFO、SCHED_RR、SCHED_DEADLINE) 适用于对响应延迟、执行周期有严格要求的系统(如工业控制、音视频处理等)。

二、实时调度策略简介

调度策略类型优先级范围时间片机制特点典型应用
SCHED_FIFO实时调度1–99无时间片高优先级任务永不主动让出 CPU,直到阻塞或结束电机控制、传感器采样
SCHED_RR实时调度1–99有时间片(默认 100ms)多个相同优先级任务轮流执行多任务实时控制
SCHED_DEADLINE实时调度无优先级通过 runtime/deadline/period 控制执行预算最严格的周期性任务调度视频渲染、实时信号处理

三、三种调度策略设置代码示例

SCHED_FIFO 测试程序

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/prctl.h>
#include <pthread.h>
#include <sched.h>

int main() {
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(0, &mask);
    if (sched_setaffinity(0, sizeof(mask), &mask) != 0)
        perror("sched_setaffinity");

    // 设置实时调度
    struct sched_param param = { .sched_priority = 80 };
    if (sched_setscheduler(0, SCHED_FIFO, &param) != 0)
        perror("sched_setscheduler");

    printf("Running under SCHED_FIFO with priority %d on CPU 0\n", param.sched_priority);
    while (1) {
        for (volatile int i = 0; i < 100000000; i++);
        printf(".");
        fflush(stdout);
        usleep(500000); // 防止完全占满CPU
    }
}

编译与运行: