算法练习-01
九月份算法实战总结,方便以后自己温故知新!
九月份算法实战总结,方便以后自己温故知新!
Exynos4412 芯片提供的 fwbl.bin只能加载 16KiB 大小的 u-boot-spl.bin到内部 SDRAM,通常编译得到的u-boot.bin远远超过这个限制,因此使用u-boot源代码支持的SPL功能来解决该问题 。不过,u-boot-spl.bin与u-boot.bin共用了很多基础代码。CONFIG_SPL_BUILD选项控制着SPL功能的开关,若在配置文件中启用了该选项,在编译时会在spl
子目录下构建出SPL相关的代码文件树。同时它还会把整个启动引导过程分为两个阶段,u-boot-spl.bin完成第一阶段的初始化设置,主要是初始化 SoC时钟、外部内存DDR和早期串口调试功能,最后加载第二阶段涉及的u-boot.bin到外部内存并跳转执行。
percpu变量指的是为每个CPU都创建一个同样的变量,也就是为每个CPU分配一份单独的内存空间,用来保存各自私有的数据。在SMP「Symmetry Multi-Processor」系统中,为了确保多个CPU能够正确地访问同一个资源,同步机制是必不可少的,比如缓存一致性「cache coherence」和自旋锁「spinlock」。但是通过使用percpu变量,内核能够使每个CPU只访问自己私有的内存空间,因此可以避免使用同步机制「free-lock」。本文将逐步揭开percpu内存管理机制的面纱。
在无aarch64开发板的情况下,为了能够学习实验aarch64相关的代码,通过Qemu模拟器搭建aarch64运行环境,这样就能完全达到实验学习的目的,既节省了硬件成本又便于实验操作。本文记录一下环境的搭建过程和小坑,方便以后自己快速搭建调试环境。
本文主要讨论中断的延迟处理机制,不仅说明了什么是上半部分「top-half」和下半部分「bottom-half」,还介绍了如何使用下半部分实现中断的延迟处理。
时间是构建事件时间轴的基石,用于识别正在发生的和已发生的事件。定时器是一种特殊的时钟,可用于测量事件的处理时间和控制一系列事件的发生。因此在Linux内核中,时间和定时器管理是至关重要的组成部分,可按功能将其分为如下几方面:
对于这些功能的实现都需要利用时钟装置,不过它们还与系统资源及其他硬件设备密切相关,并且还不能忽悠它们对体系架构的依赖,因此内核代码尽可能尝试对体系架构相关的部分进行抽象以利于时间管理和使用。在以前Linux内核中,已经使用基于HZ的低精度定时器实现了上述这些功能,然而由于物理限制产生的误差,所以要求高精度定时器控制的事件并不能保证在确切时间内处理。为了弥补缺陷和不足,内核在实现高精度定时器时引入了通用时间子系统「generic time subsystem」,同时还尝试修改多个API,使它们能够统一无差别地使用两种截然不同的定时器。本文将讨论通用时钟框架CCF「Common Clock Framework」、通用时间子系统以及定时器,它们都是时间和定时器管理的重要基础。
中断使交互式计算的实现成为可能。如果在任务执行期间发生了中断,操作系统将响应处理中断请求,然后继续执行上一个任务或新任务。借助中断,内核能够实现多任务处理「multitasking」。其实在计算机中有很多场景会发生中断,比如从网络设备发送和接收数据包「packet」、通过鼠标或触摸屏等输入设备接收用户输入内容。本文首先从硬件角度了解了什么是中断,然后介绍了从中断硬件抽象出来的Linux通用中断处理层「generic interrupt handling layer」,最后分析了中断子系统的初始化。
不同Linux内存模型以不同方式管理和组织可用物理内存,具体方式取决于系统物理内存是否不连续且存在空隙。本文讨论Linux支持的三种内存模型以及如何管理每种内存模型的内存映射「memory map」,比如FLATMEM模型的mem_map。
内核启动初期,常用内存分配器(memory allocator)还未被初始化而不能使用,在此期间memblock是一种用于管理内存区域的方法。memblock也是一种内存分配器,在内核启动阶段它是第一个被启用的内存分配器,在其他内存分配器可用之前使用它向内核注册指定的物理内存区间。memblock主要在启动阶段被使用,但若启用了内存热插拔机制,在内核运行时也需要使用memblock功能。2010年内核v.2.6.35版本首次引入memblock补丁,在此之前使用的内存分配器是bootmem。bootmem仅能管理启动时所需的部分物理内存(lowmem),但memblock能管理全部可用物理内存。在内核的buddy allocator(也是一种page allocator)可用之前,memblock是唯一能够在早期启动阶段管理内存的内存分配器。因此,这正是早期内存分配器(early memory allocator)术语的由来。
通常所谓的U-Boot升级不过是在芯片原厂提供的BSP基础上增添部分外设适配代码,尽管这样做法能减少移植的难度,但芯片原厂提供的U-Boot版本一般较陈旧,极可能未实现新功能和新需求,比如设备树。通常,启动加载程序的移植是嵌入式Linux系统移植中首要面临的挑战。由于移植过程常涉及源代码的分析和修改,甚至添加新代码,因此需要在移植过程中逐渐提高三种基本能力:阅读芯片手册的能力、阅读规范文档的能力及阅读源代码的能力。