linux x86 setup_arch代码注释

 个人理解加查的资料,不保证正确,有不对可以评论

// 查找个人电脑相关固件占用的地址(来自bootparam中的handler)
olpc_ofw_detect();
// 将 early_idts 设置到 idt_table 并应用 lidt,包含 asm_exc_debug asm_exc_int3(breakpoint)
idt_setup_early_traps(); 
// cpu 供应商等简单检查
early_cpu_init();
// 初始化用于动态修改汇编的 jump label 内存
jump_label_init();
// 根据静态调用的结构体生成汇编代码
static_call_init();
// 初始化用于remap的内存,它用于把物理内存映射到pgtable中,用于临时虚拟地址访问,一个remap slot最大可映射32页的内存
early_ioremap_init();
// 将外设的页表项设置到swapper_pg_dir页表的OLPC_OFW_PDE_NR项上,swapper_pg_dir是初始化阶段用的内核页表
setup_olpc_ofw_pgd();early_reserve_memory();
e820__memory_setup();
// 设置支持 not execute
x86_configure_nx();
// reserve boot 的 setup_data中的每个保留内存到页表和e820_table、e820_table_kexece820__reserve_setup_data();
e820__finish_early_params();// 为 reserve bft 区域保留内存到页表和memblock 512kB - 1MB
reserve_ibft_region();
// 初始化用于访问bios的每个mem设置到dmi_memdev
dmi_setup();
// 时钟周期数寄器,可用于计时
tsc_early_init();
// 检测 video system extension adapter 的 rom 区,并注册request_resource
x86_init.resources.probe_roms();
// 将_text到_end之间的代码区标记为RAM类型
e820_add_kernel_range();
// 标记0-4k从ram转为reserved,将640Kb -> 1Mb的bios区域从e820表去掉,更新e820表,
trim_bios_range();
// 初始化mtrr, pat。MTRR与PAT都是用于对不同区域采用不同缓存策略(如不缓存,写合并,写透,写保护等。),mtrr是用寄存器来控制权限,pat是在页表上控制权限,显然mtrr控制粒度比pat粗。cache_bp_init();
// 为每个 memory region 添加随机的 base
kernel_randomize_memory();
// 检查是否可用高级可编程中断控制器(代替旧中断控制器,如8259A芯片)
check_x2apic();
// 找到 ram 的最大 pfn,其上的内存属于 high_memory
e820__end_of_ram_pfn();
// 从 brk 区分配pgt buffer(32k),用于临时分配p4d,pud,pmd,pte页表项,超出这个范围时如果brk区用完了,将用memblock来分配
early_alloc_pgt_buf();
// 将brk区在memblock中标记(reserve)出来,
reserve_brk();
// 把512m内核内存中_text到_brk_end之外的pmd内存映射抹去
cleanup_highmap();
// 限制分配物理内存只能在1m以内
memblock_set_current_limit(ISA_END_ADDRESS);
// 将 e820 表中ram与kernel reserved区域加入memblock中,用于后面的动态分配
e820__memblock_setup();
// 限制swiotlb为总物理内存的6%,swiotlb是用于虚拟机设备与主机之间的数据缓冲区
sev_setup_arch();
// 初始化扩展固件的内存,镜像,资源表,服务(efi 初始化)
efi_fake_memmap();
efi_find_mirror();
efi_esrt_init();
efi_mokvar_table_init();
efi_reserve_boot_services();
// reserve 用于进程间通信表的内存
e820__memblock_alloc_reserved_mpc_new();
// 保留0-1m内存和realmode.bin使用的内存,0-1m要保留是因为efi可能会以实模式去使用它
x86_platform.realmode_reserve();
// 1m 以下用max_pfn_mapped来标记这之前全部是直接映射
// 1m 以上到max_low_pfn的区域,为每页在页表中分别创建直接映射,并更新页表
init_mem_mapping();
// 在中断表中设置缺页中断handler
idt_setup_early_pf();
// 关闭PCID功能(开启pcid时允许进程上下文切换时不清除tlb),这个功能只在长模式下有用
mmu_cr4_features = __read_cr4() & ~X86_CR4_PCIDE;
setup_log_buf();
// 将ramdisk的镜像(initrd)copy到1m以下的内存中。
reserve_initrd();
// 从__initramfs_start的表中读取kernel/firmware/acpi/文件内容至 acpi_tables_addr,并解析 acpi,的全称是ACPI (Advanced Configuration and Power Interface) 是一种标准化的电脑系统管理接口,用于处理电源管理、硬件配置和设备状态等方面的功能
acpi_table_upgrade();
acpi_boot_table_init();
// 如果是在虚拟机环境下,读取虚拟 cpu 的最大cpu数与ctl信息
vsmp_init();// 判断是否是苹果机,有很多driver的逻辑会不一样
early_platform_quirks();
// 加载解析过的 acpi 配置至acpi_gbl_root_table_list中,并加载一些全局变量,如cmos的port(sbf_port),i8042,计时器(ACPI PM Timer)等
early_acpi_boot_init();
// 初始化NUMA节点,其中cpu与内存的关系记录在SRAT中
initmem_init();
// 将已经映射的1m以下内存记录在dma_mmu_remap中,这些内存会在页表中被全部映射为dma,并且以整个vm_area的形式记录到static_vmlist中
dma_contiguous_reserve(max_pfn_mapped << PAGE_SHIFT);
// 用于coredump
reserve_crashkernel();
// 标记dma_reserve值,在计算一次分配多大内存时(根据当前有多少free的dma内存),这部分dma范围不作为free内存计算。
memblock_find_dma_reserve();
// paging_init(主要是sparse_init和zone_sizes_init)
// sparse_init 中将每个memory region 没有reserved的部分,按找到它对应的section(每个section 大小为128k页=512M,section是按二维组织的,index为(root_idx,sec_idx)),标记上它的numa nid,在对应tag 上标记present和online,表示这个section有内存可用。之后为每个present的section分配128k个struct page作为memmap。
// zone_sizes_init 为每个numa node 初始化它们的每个zone,包括记录起始页、可用页数、总覆盖页数等(可以从memblock.memory.regions中找到每个numa node的所有可用大小(present),总覆盖长度指end - start,包含了中间的空洞,代码在free_area_init_node)。同时会初始化每个zone中的物理页(设置zone类型,numa node id,引用数为1,映射到文件次数为-1,上次使用的cpuid为-1),并为不可访问的页标记PG_reserved(memmap_init)
zone_spanned_pages_in_node();
x86_init.paging.pagetable_init();kasan_init();sync_initial_page_table();
// 检查是否支持Trusted Boot(tBoot),tboot可用于检查内核启动结果是否正常。
tboot_probe();
// __vsyscall_page(位于最高地址-10M的一页),它是用户可访问的一个内核页,在gate_vma标记这一页可执行
map_vsyscall();
// 检测apic driver可用
generic_apic_probe();early_quirks();
// 重加载一些 acpi 配置
acpi_boot_init();
x86_dtb_init();get_smp_config();// 为每个acpi表创建fix映射
init_apic_mappings();prefill_possible_map();init_cpu_to_node();
// 将不需要内存的cpu设置 online
init_gi_nodes();io_apic_init_mappings();x86_init.hyper.guest_late_init();
// 为e820_table每个表项分配iomem_resource
e820__reserve_resources();
// 注册电脑休眠状态下不需要保存的内存(ram和kernelreserve以外的内存区域)
e820__register_nosave_regions(max_pfn);
// 为硬件端口分配ioport resource(dma,pic,timer,keyboard,fpu等)
x86_init.resources.reserve_resources();
e820__setup_pci_gap();
x86_init.oem.banner();
x86_init.timers.wallclock_init();
therm_lvt_init();
mcheck_init();
register_refined_jiffies(CLOCK_TICK_RATE);
unwind_init();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zernike多项式法生成相位理论推导及图像引导实现原理

目录 引言 波前传感器 ​编辑 关于相位计算问题补充 关于结构图的修正 光束质量评价指标 Zernike多项式 ​编辑Zernike多项式法生成相位 光强分布求波前相位-GS 更快的迭代方法SPGD 基于Zernike模式的SPGD 引言 我们还是先从第一篇文献开始理解展开今天分享的一些重…

并查集(C++)

目录 一、并查集的原理二、并查集的实现路径压缩 三、并查集的应用结尾 一、并查集的原理 并查集的两个功能&#xff1a; 合并&#xff1a;合并两个不想联系的元素查询&#xff1a;判断两个元素是否在同一个组内 主要解决的是元素分组的问题。 例如&#xff1a;某班级要创建…

数据迁移怎么测,都有哪些步骤?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;软件测试面试题分享&#xff1a; 1000道软件测试面试题及答案&#x1f4e2;软件测试实战项目分享&#xff1a; 纯接口项目-完…

gRPC - 分布式 gRPC 四种通信方式、三种代理方式(全代码演示)

目录 一、分布式 gRPC 开发 1.1、项目结构 & 前置说明 1.1.1、项目结构 1.1.2、protoc 必备依赖 1.1.3、推荐插件&#xff08;简化开发&#xff09; 1.1.4、protoc 生成 Java 代码说明 1.2、一元 RPC&#xff08;代理方式一&#xff1a;阻塞式 BlockingStub&#xff…

网络安全专家必备的20个操作系统

工欲善其事必先利其器&#xff0c;网络安全专家、道德黑客、蓝队和红队的“武器库”里通常都收藏着一堆自己偏爱的操作系统。 如果你是网络安全新手&#xff0c;面对五花八门的安全工具手足无措&#xff0c;那么选择合适的网络安全专用操作系统无疑是更为高效的做法&#xff0…

DFA算法在敏感词过滤的应用

相信大家对于游戏里聊天框的以下内容已经不陌生了 "我***"“你真牛*”“你是不是傻*” 一个垃圾的游戏环境是非常影响玩游戏的心情的&#xff0c;看到这些&#xff0c;就知道游戏已经帮我们屏蔽掉了那些屏蔽字了&#xff0c;对于玩游戏而言&#xff0c;心里会好受很…

D48|动态规划之编辑距离

583.两个字符串的删除操作 初始思路: 大概能想到定义dp数组为最少的删除次数 想不明白递归公式应该怎么推导 题解复盘&#xff1a; 第一种思路&#xff1a;dp[i][j]所需要删除元素的最少次数. 递归公式五部曲; 1)dp数组的定义&#xff1a; dp[i][j]&#xff1a;以i-1为结尾的…

力扣1944.队列中可以看到的人数--单调栈

思路&#xff1a; 由题知一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 &#xff0c;也就是说&#xff0c;在自己右边第一个比自己高的人后面的人就肯定看不到了那么只需要找到右边第一个比自己高的人与自己之间的所有满足要求的人就行了&#xff0…

JDBC数据库访问——数据库操作

与指定的数据库建立连接后&#xff0c;就可以使用JDBC提供的API对数据库进行操作&#xff0c;包括查询、新增、更新、删除等。 1.查询操作 和数据库建立连接后&#xff0c;对数据库表进行查询操作的步骤如下&#xff1a; ①创建statement对象 由已创建的Connection对象con调…

透明OLED屏:种类与技术特点

作为一名专注于OLED技术研发的工程师&#xff0c;同时在尼伽工作多年&#xff0c;有幸能够参与到透明OLED屏的研发过程中。透明OLED屏作为一种新型显示技术&#xff0c;以其独特的透明特性和优秀的画质表现&#xff0c;正逐渐在各个领域崭露头角。在这篇文章中&#xff0c;我将…

【考研】二战稳上了,能先去工作几个月再读研吗

这篇文章是抖音和b站上上传的同名视频的原文稿件&#xff0c;感兴趣的csdn用户可以关注我的抖音和b站账号&#xff08;GeekPower极客力量&#xff09;。同时这篇文章也为视频观众提供方便&#xff0c;可以更加冷静地分析和思考。文章同时在知乎发表。 又一年的考研初试结束了&…

GROUP_CONCAT报错解决

有如下表 其中awardee和awardee_unit都是保存的json类型的字符串, awardee是多个人员id, awardee_unit是部门的全路径 查询时要注意转换 需要将name拼接起来合并成一行,直接 GROUP_CONCAT 会报错 百度的大部分答案是修改数据库配置去掉严格模式,如果不方便修改数据库可以这样…

CSMM软件能力成熟度模型的申报条件

CSMM&#xff08;软件能力成熟度模型&#xff09;是中国软件行业的一个重要标准&#xff0c;用于评估和认证企业在软件开发和维护方面的能力。CSMM认证分为五个等级&#xff0c;从低到高分别是初始级、受管理级、稳健级、量化管理级和优化级。以下是各个等级的申报条件概述&…

使用Go语言的HTTP客户端库进行API调用

随着微服务架构和RESTful API的普及&#xff0c;API调用成为了日常开发中的常见任务。Go语言提供了多种工具和库来帮助开发者轻松地与API进行交互。本文将介绍如何使用Go语言的HTTP客户端库进行API调用。 在Go语言中&#xff0c;标准库中的net/http包提供了基本的HTTP客户端功…

linux 终端获取键值

tty pts终端下获取键值 ctrl c 或3秒自动退出。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <signal.h> #include <termios.h> #include <sys/ioctl.h> #include <linux/kd.h>…

2023春季李宏毅机器学习笔记 06 :Diffusion Model 原理剖析

资料 课程主页&#xff1a;https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub&#xff1a;https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程&#xff1a;https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、想法概念 Q1&…

基于哈里斯鹰算法优化的Elman神经网络数据预测 - 附代码

基于哈里斯鹰算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于哈里斯鹰算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于哈里斯鹰优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

C++学习day--25 俄罗斯方块游戏图像化开发

项目分析 项目演示、项目分析 启动页面 启动页面&#xff1a; 分析&#xff1a; 开发环境搭建 1&#xff09;安装vc2010, 或其他vs版本 2&#xff09;安装easyX图形库 代码实现: # include <stdio.h> # include <graphics.h> void welcome(void) { initgraph(55…

鹿目标检测数据集VOC格式500张

鹿&#xff0c;一种优雅而神秘的哺乳动物&#xff0c;以其优美的外形和独特的生态习性而备受人们的喜爱。 鹿的体型通常中等&#xff0c;四肢细长&#xff0c;身体线条流畅。它们的头部较小&#xff0c;耳朵大而直立&#xff0c;眼睛明亮有神。鹿的毛色因品种而异&#xff0c;…

计算机Java项目|Springboot医院固定资产系统

项目编号&#xff1a;L-BS-ZXBS-06 一&#xff0c;环境介绍 语言环境&#xff1a;Java: jdk1.8 数据库&#xff1a;Mysql: mysql5.7 应用服务器&#xff1a;Tomcat: tomcat8.5.31 开发工具&#xff1a;IDEA或eclipse 二&#xff0c;项目简介 困扰医院管理的许多问题当…