Advertisement

疯狂内核的启动过程——内核初始化。

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:None


简介:
目录1 引子 21.1 上电 21.2 BIOS时代 23.3 内核引导程序 25.4 2 内核映像的形成 27.1 MakeFile预备知识 29.2 2.1.1 Makefile书写规则 29.2.2 Makefile变量 31.2 2.1.3 条件判断 35.2.4 函数 39.2.5隐含规则 41.2 2.1.6 定义模式规则 43.2 KBuild体系 47.1 2.1.7 内核目标 48.1 2.1.8 主机程序 50。二。9编译标志 53。三。编译配置 57。四。寻找第一个目标,60。五。prepare和scripts目标,66。六。递归编译各对象,70。七。链接vmlinux,74。八。制作bzImage,80 三 实模式下的内核代码,88 三一 一内核映像内存布局,90 三二 实模式汇编代码header\.S,93 三二一 无用的bootsect代码,95 三二二 初始化头变量hdr ,98 三二三 准备实模式下C语言环境,103 三三 实模式代码main函数,109 三三一复制初始化头变量,110 三三二 初始化堆,113 三三三确保支持当前运行的CPU ,115 三三四 设置BIOS的x86模式 ,118 三三五内存的检测 ,十二六设置键盘属性 ,十二八填充系统环境配置表 ,十二九填充IST信息 ,十三零设置Video模式 ,十三零实模式代码go\_to\_proteced\_mode函数 ,十三七 一禁止可屏蔽和不可屏蔽中断 ,十四零实模式汇编代码header\.S 十四二初始化头变量hdr 十四四准备实模式下C语言环境 十四八实模式代码main函数 十五四复制初始化头变量 十五六初始化堆 十五八确保支持当前运行的CPU 十六十设置BIOS的x86模式 十六二内存的检测 十六四设置键盘属性 十六六填充系统环境配置表 十七零填充IST信息 十七二设置Video模式 十七二实模式代码go\_to\_proteced\_mode函数 十七八禁止可屏蔽和不可屏蔽中断 十八零实模式汇编代码header\.S 十八二初始化头变量hdr 十八四准备实模式下C语言环境 十九零实模式代码main函数十九六复制初始化头变量十九八初始化堆十九十确保支持当前运行的CPU 二十 二设置BIOS的x86模式 二十 四内存的检测 二十 六设置键盘属性 二十一零填充系统环境配置表 二十一十二填充IST信息 二十一四设置Video模式 二十一四实模式代码go\_to\_proteced\_mode函数 二十二零禁止可屏蔽和不可屏蔽中断 二十二二实模式汇编代码header\.S 二十二四初始化头变量hdr 二十二六准备实模式下C语言环境 二十三零实模式代码main函数 二十三六复制初始化头变量 二十三八初始化堆 二十四零确保支持当前运行的CPU 二十四二设置BIOS的x86模式 二十四四内存的检测 二十四六设置键盘属性 二十五零填充系统环境配置表 二十五二填充IST信息 二十五四设置Video模式

全部评论 (0)

还没有任何评论哟~
客服
客服
  • 篇——
    优质
    狂热内核篇——内核初始化深入探讨了操作系统启动过程中内核加载与初始化的关键步骤和技术细节,是计算机系统架构和操作系统的进阶学习资料。 目录 1. 引子 1.1 上电 1.2 BIOS时代 1.3 内核引导程序 2. 内核映像的形成 2.1 MakeFile预备知识 2.1.1 Makefile书写规则 2.1.2 Makefile变量 2.1.3 条件判断 2.1.4 函数 2.1.5 隐含规则 2.1.6 定义模式规则 2.1 KBuild体系 2.1.1 内核目标 2.1.2 主机程序 2.1.3 编译标志 2.2 内核编译分析 2.2.1 编译配置 2.2.2 寻找第一个目标 2.2.3 prepare和scripts目标 2.2.4 递归编译各对象 2.2.5 链接vmlinux 2.2.6 制作bzImage 3 实模式下的内核代码 3.1 内核映像内存布局 3.2 实模式汇编代码header.S 3.2.1 无用的bootsect代码 3.2.2 初始化头变量hdr 3.2.3 准备实模式下C语言环境 3.3 实模式代码main函数 3.3.1 复制初始化头变量 3.3.2 初始化堆 3.3.3 确保支持当前运行的CPU 3.3.4 设置BIOS的x86模式 3.3.5 内存的检测 3.3.6 设置键盘属性 3.3.7 填充系统环境配置表 3.3.8 填充IST信息 3.3.9 设置Video模式 3.4 实模式代码go_to_proteced_mode函数 3.4.1 禁止可屏蔽和不可屏蔽中断 3.4.2 打开A20地址线 3.4.3 安装临时全局描述符表 3.4.4 第一次启动保护模式 4 保护模式下的内核代码 4.1 32位x86保护模式代码 4.1.1 内核解压缩的前期工作 4.1.2 解压缩内核 4.1.3 第二次启动保护模式 4.1.4 第一次启动分页管理 4.1.5 初始化0号进程 4.2 向start_kernel进发 4.2.1 初始化中断描述符表 4.2.2 第三次启动保护模式 4.2.3 启动x86虚拟机 5 走向现代:start_kernel函数 5.1 初始化同步与互斥环境 5.1.1 屏蔽中断 5.1.2 启动大内核锁 5.1.3 注册时钟通知链 5.1.4 激活第一个CPU 5.1.5 初始化地址散列表 5.1.6 打印版本信息 5.2 执行setup_arch()函数 5.2.1 拷贝可用内存区信息 5.2.2 获得总页面数 5.2.3 着手建立永久内核页表 5.2.4 第二次启动分页管理 5.2.5 建立内存管理架构 5.2.6 添砖加瓦 5.3 设置每CPU环境 5.4 初始化内存管理区列表 5.5 利用early_res分配内存 5.6 触碰虚拟文件系统 5.7 初始化异常服务 5.8 初始化内存管理 5.8.1 启用伙伴算法 5.8.2 初始化slab分配器 5.8.3 初始化非连续内存区 5.9 初始化调度程序 5.10 初始化中断处理
  • Linux预备知识之.pdf
    优质
    本书《Linux预备知识之疯狂内核》深入浅出地介绍了Linux操作系统的核心概念与原理,适合对Linux内核感兴趣的读者阅读。 1.1 体系架构 1.1.1 Linux体系结构 1.1.2 一般程序的执行 1.2 用户态向内核态切换 1.2.1 Linux的堆栈切换 1.2.2 80x86分段总结 1.2.3 Linux的指针 1.3 C语言基本功 1.3.1 Linux内核中的链表 1.3.2 Linux双循环链表综合实例 1.4 内核汇编语言规则 1.4.1 GNU的x86汇编语言 1.4.2 嵌入式汇编语言 1.5 必要的硬件知识 1.5.1 EU模块 1.5.2 SU模块 1.5.3 PU模块 1.5.4 高速缓存 1.6 __attribute__ 机制 1.6.1 函数属性 1.6.2 变量属性 1.6.3 类型属性 1.6.4 变量属性与类型属性举例 1.7 必要的编译知识
  • Linux解析
    优质
    本文将深入剖析Linux操作系统的内核启动流程,从系统加电到内核完全初始化的每一个关键步骤,帮助读者理解操作系统底层运行机制。 使用 `make` 命令之前执行 `grep CONFIG_DM9000 -nr .` 来查找相关配置: 1. 在 Makefile 中找到类似 `obj-$(CONFIG_DM9000) += dm9000.o` 的定义(在 auto.conf 文件中)。 2. 查找 config 文件,例如 `CONFIG_DM9000=y`。 3. 检查 .c 文件中的条件语句,如 `if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)`。 执行完 `make` 命令后会增加以下内容: 4. 在 include/config/auto.conf 中添加类似 `CONFIG_DM9000=y` 的定义(来源 .config 文件)。 5. 在 include/generated/autoconf.h 中添加类似 `#define C` 的宏定义。
  • LinuxI2C子系统架构.pdf
    优质
    本论文详细探讨了Linux内核中I2C子系统驱动程序的初始化架构。分析并解释了该框架的设计原理及其工作流程,为开发者提供了深入了解和优化I2C设备管理的宝贵资源。 Linux 内核中的 I2C 系统结构包括初始化流程、通信流程以及读写方法等内容。
  • 之——Linux虚拟
    优质
    本文探讨了Linux操作系统中虚拟内存的核心机制,包括地址转换、内存映射和页式管理等关键技术,深入剖析其高效管理和使用内存的方法。 目录 第一章 Linux底层分段分页机制 1.1 基于x86的Linux分段机制 1.2 基于x86的Linux分页机制 1.2.1 页全局目录和页表 1.2.2 线性地址到物理地址转换 1.2.3 线性地址字段处理 1.2.4 页表处理 1.3 扩展分页与联想存储器 1.4 Linux内存布局 1.5 内核空间和用户空间 1.5.1 初始化临时内核页表 1.5.2 永久内核页表的初始化 1.5.3 第一次进入用户空间 1.5.4 内核映射机制实例 1.6 固定映射的线性地址 1.7 高端内存内核映射 1.8 永久内存映射 1.9 临时内核映射 第二章 内核级内存管理系统 2.1 Linux页面管理 2.1.1 NUMA架构 2.1.2 内存管理区 2.2 伙伴系统算法 2.2.1 数据结构 2.2.2 块分配 2.2.3 块释放 2.3 Linux页面级内存管理 2.3.1 分配一组页面 2.3.2 释放一组页面 2.4 每CPU页面高速缓存 2.4.1 数据结构 2.4.2 通过每CPU页高速缓存分配页面 2.4.3 释放页面到每CPU 页面高速缓存 2.5 slab分配器 2.5.1 数据结构 2.5.2 分配/释放slab页面 2.5.3 增加slab数据结构 2.5.4 高速缓存内存布局 2.5.5 slab着色 2.5.6 分配slab对象 2.5.7 释放Slab对象 2.5.8 通用对象 2.5.9 内存池 2.6 非连续内存区 2.6 高端内存区回顾 2.6 非连续内存区的描述符 2.7 分配非连续内存区 2.8 释放非连续内存区 第三章 进程的地址空间 3.1 用户态内存分配 3.1 mm_struct数据结构 3.2 内核线程的内存描述符 3.3 线性区的数据结构 3.4 红-黑树算法 3.5 线性区访问权限 3.6 线性区的底层处理 3.7 查找给定地址的最邻近区 3.8 查找一个与给定的地址区间相重叠的线性区 3.9 查找一个空闲的地址区间 3.10 向内存描述符链表中插入一个线性区 3.7 分配线性地址区间 3.8 释放线性地址区间 3.9 do_munmap()函数 3.10 split_vma()函数 3.11 unmap_region()函数 3.4 创建和删除进程的地址空间 3.5 创建进程的地址空间 3.6 删除进程的地址空间 3.7 内核线程1号的地址空间 3.8 堆的管理 第四章 磁盘文件内存映射 4.1 内存映射的数据结构 4.2 内存映射的创建 4.3 内存映射的请求调页 4.4 刷新内存映射的脏页 4.5 非线性内存映射 第五章 页面回收 5.1 页框回收概念 5.2 选择目标页 5.3 PFRA设计 5.2 反向映射技术 5.3 匿名页的反向映射 5.4 优先搜索树 5.5 映射页的反向映射 5.
  • Linux参数解析
    优质
    本文深入探讨了Linux操作系统中内核启动参数的作用和用法,帮助读者理解如何优化系统性能及解决启动时遇到的问题。 Linux内核启动参数是操作系统启动过程中非常重要的组成部分,它们允许用户自定义内核的行为和配置以适应不同的硬件环境及特定需求。在Ubuntu这样的发行版中理解并正确设置这些参数可以解决硬件兼容性问题、优化性能或提供调试信息。 查看当前的Linux内核启动参数可以通过执行`cat /proc/cmdline`命令实现,例如:`BOOT_IMAGE=bootvmlinuz-4.4.0-89-generic root=UUID=bef418fa-4202-4513-b39b-cde6a5d9753f ro quiet splash vt.handoff=7`。这个命令行包含了多个参数,如:`BOOT_IMAGE`指定了内核镜像的位置;`root=UUID`定义了系统的根目录挂载点,这里的“UUID”是一种唯一标识符用于确定具体位置;而ro表示以只读模式挂载根文件系统,‘quiet’关闭启动时的日志输出,‘splash’启用图形界面显示,并且将控制台分配给tty7。 若要添加新的内核参数需要直接编辑`/boot/grub/grub.cfg`。这个文件记录了所有可用的内核版本及其对应的参数设置。例如,在一个名为dwc_otg.speed=1的参数后增加USB OTG接口速度设定,然后保存并重启系统即可使新参数生效。 值得注意的是,通常我们使用`update-grub`命令来更新GRUB配置文件以自动生成菜单项;然而对于特定且精细的内核启动参数修改来说直接编辑grub.cfg更为精确灵活。这是因为`update-grub`根据系统的配置文件自动创建GRUB菜单可能无法覆盖或处理所有个性化的内核启动需求。 了解和掌握Linux内核启动参数有助于更好地管理你的系统,例如通过调整内存分配、禁用不必要的服务以及优化网络设置来提升性能;同时对于硬件问题如驱动程序不兼容或者识别错误正确的启动参数可以作为临时解决方案。此外一些调试目的的参数还用于开启内核恐慌消息输出这对于诊断故障至关重要。 Linux内核启动参数是系统管理员的强大工具,它提供了对操作系统底层行为的直接控制。通过深入理解和熟练应用这些参数我们可以定制出最适合特定环境和需求的Linux系统;然而在修改它们时一定要谨慎确保了解每个参数的作用以免造成不必要的不稳定现象。
  • LinuxNet PHY
    优质
    Linux内核中的Net PHY模块负责网络设备与物理层通信,实现底层硬件接口配置及管理功能,是构建高效网络连接的关键组件。 Linux内核中的net phy流程介绍了driver注册到miibus probe设备的过程。如果积分设置过高,请联系我调整。实际上,尝试将下载所需的积分降低后,系统会自动将其恢复原状。 简化后的描述:Linux内核 net phy 流程涉及驱动程序的注册和 miibus 探测过程。若发现所需积分过高,请告知以便进行调整;需要注意的是,当试图减少积分时,系统可能会自动还原设置。
  • K8s Kubernetes 脚本,一键部署基础环境及依赖包,优参数并升级
    优质
    此脚本为Kubernetes(K8s)环境快速搭建而设计,涵盖基础设置、依赖安装、内核调优与更新等环节,简化集群部署流程。 2.1 设置主机名和hosts文件解析 2.2 安装依赖包 2.3 配置防火墙为 Iptables 并设置空规则 2.4 关闭 SELINUX 2.5 调整内核参数以适应 K8S需求 2.6 调整系统时区 2.7 停用系统不需要的服务 2.8 配置 rsyslogd 和 systemd journald 2.9 升级系统内核至 4.4版本 一键shell脚本
  • 之——进管理子系统
    优质
    本文章深入探讨Linux操作系统的核心组件之一——进程管理子系统,分析其原理与实现机制,适合技术爱好者和开发人员阅读。 目录 1 进程的组织 1.1 进程相关数据结构 1.1.1 进程的基本信息 1.1.2 进程状态 1.1.3 TASK_RUNNING状态的进程链表 1.1.4 进程间关系 1.2 Linux线程——轻量级进程 1.3 进程创建——do_fork()函数详解 1.4 执行进程切换 1.4.1 进程切换之前的工作 1.4.2 进程切换实务 —— switch_to宏 1.4.3 __switch_to函数 1.5 fork与vfork系统调用的区别 1.6 内核线程 1.7 挂起状态进程的组织 1.7.1 等待队列头 1.7.2 等待队列的操作 1.7.3 进程资源限制 1.8 系统调用execve() 1.8.1 拷贝用户态参数 1.8.2 重要的数据结构 1.8.3 search_binary_handler函数 1.8.4 目标文件的装载和投入运行 1.8.5 库函数 2 中断控制 2.1 中断分类 2.2 中断硬件环境 2.2.1 外部中断请求IRQ 2.2.2 中断描述符表 2.2.3 中断和异常的硬件处理 2.3 中断描述符表 2.3.1 中断门、陷阱门及系统门 2.3.2 IDT初步初始化 2.4 异常处理 2.5 中断处理 2.5.1 中断向量 2.5.2 IRQ数据结构 2.5.3 do_IRQ()函数 2.5.4 中断服务例程 2.5.5 IRQ线的动态分配 2.6 下半部分 2.6.1 软中断 2.6.2 tasklet 2.6.3 工作队列 2.7 定时器中断 2.7.1 时钟与定时器 2.7.2 定时器中断相关的数据结构 2.7.3 定时器中断的上半部分 3 进程调度 3.1 进程调度概念 3.2 进程调度的数据结构和优先级 3.2.1 进程的优先级 3.2.2 数据结构 3.3 调度程序所使用的函数 3.3.1 scheduler_tick函数 3.3.2 try_to_wake_up函数 3.3.3 recalc_task_prio函数 3.4 schedule()函数 3.4.1 直接调用 3.4.2 延迟调用 3.4.3 进程切换之前所做的工作 3.4.4 完成进程切换时所执行的操作 3.4.5 进程切换后所执行的操作 3.5 多处理器运行队列的平衡 3.5.1 调度域 3.5.2 rebalance_tick()函数 3.5.3 load_balance()函数 3.5.4 move_tasks()函数 3.6 进程退出 3.6.1 进程终止 3.6.2 进程删除 4 进程的并发性体现 4.1 内核抢占 4.1.1 内核抢占概念 4.1.2 同步技术总揽 4.2 每CPU变量 4.3 原子操作 4.4 优化屏障和内存壁垒 4.4.1 优化屏障 4.4.2 内存壁垒 4.5 自旋锁 4.6 读写自旋锁 4.6.1 获取与释放一个锁 4.6.2 获取或释放一个写锁 4.7 序列化锁 4.8 RCU机制 4.9 信号量 4