Linux 0.11(五):从键盘输入到结果显示的底层机制
导言 Linux 操作系统凭借其开源特性与强大性能,在计算机领域占据重要地位。Linux 0.11 作为 Linux 发展早期的经典版本,其源代码蕴含着操作系统核心功能的基础设计思想。 详情见品读 Linux 0.11 核心代码。 一、输入阶段:命令的获取与缓冲 1.1 键盘输入处理机制当用户在键盘上按下一个按键时,硬件会触发 0x21 号中断,进而调用keyboard_interrupt中断处理函数。此时键盘控制器发送的扫描码会经历三重处理: 扫描码转换:通过键盘映射表转换为对应的 ASCII 码 队列存储:字符被存入tty_read_q原始输入队列 终端处理:copy_to_cooked函数对字符进行规范处理,如退格删除、换行转换等,处理后的字符存入secondary规范队列 这两个关键队列的分工如下: 1tty_read_q (原始队列) ← 扫描码 → ASCII转换 → secondary (规范队列) 1.2 命令读取与阻塞控制shell...
Linux 0.11(四):操作系统核心模块解析
导言 在操作系统的演进历程中,Linux 0.11 版本作为开源操作系统发展的重要里程碑,其系统架构设计与核心功能实现对现代操作系统具有深远的研究价值。 详情见品读 Linux 0.11 核心代码。 一、核心模块解析 1.1 物理内存管理的数据结构Linux 0.11 采用mem_map数组作为物理内存管理的核心数据结构,该数组定义于mm/memory.c文件中: 123456struct page { unsigned long flags; struct page *next; struct page *prev;};struct page mem_map[MEM_MAP_SIZE]; 每个数组元素对应一个物理页面(4KB),通过flags字段记录页面状态(空闲、已分配、锁定等),next和prev指针构成双向链表,用于空闲页面的组织与管理。这种设计实现了对物理内存的精细化管理,为内存分配与回收提供了数据基础。 1.2...
Linux 0.11(三):新进程诞生全流程解析
导言 在操作系统的底层架构体系中,新进程的创建过程是一个高度精密且系统化的工程,其每一个环节均凝聚着计算机科学领域的理论精华与工程实践智慧。以经典 UNIX 系统的实现机制为研究对象,深入剖析进程创建机制,不仅有助于理解其底层运行原理,更能揭示操作系统设计者在性能优化、安全防护与资源管理之间的精妙权衡策略。 详情见品读 Linux 0.11 核心代码。 一、核心代码与整体流程:系统启动的 "生命线" 1.1 main...
Linux 0.11(二):从底层搭建到系统觉醒的深度探索
导言 在计算机系统启动过程中,操作系统的初始化工作是一项高度复杂且精密的工程,其每个环节均对系统稳定运行起着决定性作用。对于经典的 Linux 0.11 版本而言,从内存管理机制的构建到各类设备驱动的初始化配置,这些底层操作共同构成了操作系统稳定运行的核心基础。各初始化阶段虽在功能上具有独立性,但在逻辑与数据交互层面紧密耦合,协同构建起完整的操作系统底层架构。 详情见品读 Linux 0.11 核心代码。 一、main 函数:初始化的核心枢纽 1.1 参数计算与初始化链构建操作系统启动过程中,main函数通过计算ROOT_DEV、drive_info、memory_end等核心参数,完成系统资源配置的基础工作。这些参数的准确获取与计算,为后续系统组件初始化提供必要的前提条件。基于上述参数,系统依次调用mem_init、trap_init等九个关键初始化函数,构建起完整的初始化调用链。该调用链以层次化的方式完成系统资源的初始化工作,确保各子系统间的依赖关系得到妥善处理,为操作系统的稳定运行奠定基础。 1.2...
Linux 0.11(一):进入内核前的底层机制剖析
导言 在操作系统的演进历程中,Linux 0.11作为经典版本,其启动过程蕴含着深刻的底层设计哲学。从计算机通电到内核正式接管系统,这一阶段涉及硬件初始化、实模式与保护模式切换、内存重定位等核心环节,每一步都堪称现代操作系统启动流程的缩影。 详情见品读 Linux 0.11 核心代码。 一、BIOS 加载阶段:启动流程的初始阶段 1.1 启动区加载:系统引导的关键区域计算机启动时,BIOS 首先读取硬盘主引导记录(MBR),即硬盘 0 盘 0 道 1 扇区。该扇区大小为 512 字节,包含启动代码及分区表信息。启动代码被加载至内存 0x7c00 地址,扇区末尾的 0x55AA 签名作为有效性验证标识。此验证机制确保 BIOS 仅执行合法的启动代码,从而保障系统启动的安全性与可靠性。 1.2 启动代码执行:系统初始化的开端位于 0x7c00 的 bootsect.s 代码作为启动流程的初始执行模块,承担系统启动初期的环境准备工作。该模块主要负责基本硬件检测、内存环境初始化等基础功能,为后续系统启动奠定基础。 二、内存数据搬运:系统资源的迁移过程 2.1...
Linux新手入门:GNU工具链实战笔记(从“啥都不懂”到“能打能修”)
一、编译工具链:代码到可执行程序的“工业流水线”编译是将人类可读的C代码转换为计算机可执行的二进制指令的过程。GNU编译器套件(GCC)通过预处理→编译→汇编→链接四阶段流水线实现这一转换,每个阶段均有明确的功能边界与技术实现。 1.1 预处理阶段:代码的文本转换与宏展开预处理(Preprocessing)由cpp(C Preprocessor)完成,核心任务是文本级别的代码转换,为后续编译阶段提供“干净”的输入。 关键操作与技术细节 头文件包含(#include):通过递归展开头文件内容(如#include 会插入标准库头文件的完整内容),解决代码复用问题。现代编译器(如GCC)采用“头文件缓存”优化,避免重复解析。 宏替换(#define):文本替换(如#define MAX 100将所有MAX替换为100),支持带参数的宏(如#define SQUARE(x) ((x)*(x)))和条件编译(如#ifdef DEBUG)。 行控制(#line):修改编译器报告的行号与文件名(常用于生成代码的工具链)。 技术验证:通过gcc -E hello.c -o...
Linux 基础操作与核心概念详解
一、Linux 系统架构:用户空间与内核的交互桥梁Linux 系统采用分层架构,核心逻辑围绕“用户空间”与“内核空间”的协作展开。用户程序无法直接操作硬件,必须通过内核提供的接口——这一接口正是我们今天要深入理解的系统调用、库函数与Shell 命令。 1.1 层次结构概览Linux 系统的运行逻辑可简化为三层模型(从用户到内核): 层级 角色描述 典型代表/技术 应用层 用户直接使用的软件(如浏览器、文本编辑器) Vim、GCC、Python 库函数层 对系统调用的封装,提供更易用的编程接口 C 标准库(如 fopen)、GNU C 库 系统调用层 内核暴露给用户空间的“唯一入口”,直接控制硬件资源 open、read、write 内核层 管理硬件资源(CPU、内存、磁盘),实现进程调度、文件系统等核心功能 Linux 内核(进程管理、内存管理) 关键结论:所有用户程序的操作(如读写文件、启动进程),最终都必须通过系统调用请求内核完成。 1.2 系统调用:用户与内核的“翻译官”系统调用(System...
Linux:从极客玩具到全球技术基石的传奇之路
引言如果说现代计算机的世界是一片浩瀚的海洋,那么Linux无疑是其中最汹涌的浪潮之一。它不仅打破了Windows与Unix长期垄断操作系统的格局,更以“开源”为旗帜,重塑了全球软件开发的协作模式。今天,我们将沿着时间线,从Unix的诞生说起,一步步揭开Linux如何从一个芬兰学生的“个人实验”,成长为支撑云计算、AI、移动设备的核心技术。 一、土壤:Unix与自由软件运动的萌芽(1960s-1990年代初)1.1 Unix的诞生:从“太空旅行”游戏开始的革命故事要从1969年的贝尔实验室说起。那时的计算机还是“庞然大物”,程序员需要通过打孔卡输入指令,等待数小时才能得到结果。为了改变这种低效,贝尔实验室、MIT和通用电气联合启动了Multics计划(多路信息计算系统),目标是让大型主机同时支持300多个终端——这在当时堪称“科幻级”设想。 但Multics项目因资金和技术复杂度过高,1969年贝尔实验室选择退出。不过,参与项目的工程师肯·汤普森(Ken...
我的 Linux 学习计划书
一、为什么是 Linux?最近在工作中频繁接触服务器部署、自动化运维的需求,同事用一行 ssh user@ip 轻松连接远程机器时,我还在对着图形界面找「连接远程服务器」的按钮;看到运维同学用 grep -i error /var/log/nginx/access.log 秒定位日志错误,我还在手动翻页找关键词…… 这些瞬间让我意识到:Linux 不再是「技术加分项」,而是「解决问题的刚需」。无论是想往运维、后端开发,还是云计算方向深耕,Linux 都是我绕不开的技术底座。 今天,我为自己写下这份学习计划——不为「速成」,只为「系统生长」,以及远离土木,珍爱生命。 学习仓库可见:鸟叔讲Linux、品读 Linux 0.11 核心代码 二、我的学习目标:「能用」-->「掌控」我不想成为「背命令的工具人」,而是希望: 短期(1-3个月):能独立完成 Linux 服务器的日常操作(安装、配置、排障),写出可复用的 Shell...
C 语言序列化和反序列化
一、核心概念:什么是序列化与反序列化?在计算机科学中,序列化(Serialization) 和 反序列化(Deserialization) 是数据持久化与传输的核心技术。 序列化:将内存中的数据结构(如结构体、数组等)转换为二进制字节流的过程。这个字节流可以存储到文件、数据库,或通过网络传输到其他设备。 反序列化:将二进制字节流还原为内存中可用数据结构的过程,是序列化的逆操作。 典型应用场景 数据持久化:将程序运行时的临时数据(如用户信息、配置参数)保存到文件,下次启动时恢复。 网络通信:不同进程/设备间通过网络传输数据时,需将数据转换为无格式的二进制流(避免文本协议的解析开销)。 跨平台协作:确保不同系统(如Windows/Linux)间数据格式兼容(需注意字节序问题)。 二、C 语言实现序列化与反序列化C 语言作为面向过程的语言,没有内置的序列化库,但可以通过文件操作函数(如 fwrite/fread)直接操作二进制数据,实现轻量级序列化。以下是完整实现与详细解析。 1....