罗军 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 基础知识 编译程序的过程 预处理...装载和启动过程分析 execve函数调用流程如下: ?...load_elf_binary代码 load_elf_binary(struct linux_binprm *bprm) { …… if(elf_interpreter) //使用动态链接...//装载ld的起点 #获得动态连接器的程序起点 elf_entry = load_elf_interp(&loc->interp_elf_ex, interpreter
1 程序装载的挑战 在运行这些可执行文件的时候,我们其实是通过一个装载器,解析ELF或者PE格式的可执行文件 装载器会把对应的指令和数据加载到内存里面来,让CPU去执行。...装载到内存,装载器需要满足两个要求 可执行程序加载后占用的内存空间应该是连续的 执行指令的时候,程序计数器是顺序地一条一条指令执行。...如果你自己安装过Linux操作系统,你应该遇到过分配一个swap硬盘分区的问题 这块分出来的磁盘空间,其实就是专门给Linux操作系统进行内存交换用的。...在Linux下,我们通常只设置成4KB。你可以通过命令看看你手头的Linux系统设置的页的大小。...jvm已经是上层应用,无需考虑物理分页,一般更直接是考虑对象本身的空间大小,物理硬件管理统一由承载jvm的操纵系统去解决吧 参考 深入浅出计算机组成原理
微代码就是由 Intel/AMD 提供的 CPU 固件。Linux 的内核可以在引导时更新 CPU 固件,而无需 BIOS 更新。处理器的微码保存在内存中,在每次启动系统时,内核可以更新这个微码。...如果你是一个 Linux 系统管理方面的新手,如何在 Linux 上使用命令行方式去安装或者更新 Intel/AMD CPU 的微码固件呢?...如何在 Linux 上使用包管理器去安装微码固件更新 对于运行在 x86/amd64 架构的 CPU 上的 Linux 系统,Linux 自带了工具去更改或者部署微码固件。...-microcode —— Debian/Ubuntu 和衍生发行版的适用于 AMD CPU 的微码固件 linux-firmware —— 适用于 AMD CPU 的 Arch Linux 发行版的微码固件...(你不用做任何操作,它是默认安装的) intel-ucode —— 适用于 Intel CPU 的 Arch Linux 发行版微码固件 microcode_ctl 、linux-firmware
1 如何才能实现程序装载? 在运行这些可执行文件时,是通过装载器解析ELF或PE格式的可执行文件。 装载器会将对应指令和数据加载到内存,让CPU去执行。...若你安装过Linux,你肯定遇到过分配一个swap硬盘分区抉择,这块分出的磁盘空间,就是给Linux进行内存交换用的。...从虚拟内存 =》物理内存的映射,不再是拿整段连续的内存的物理地址,而是按一个个页,一般来说: 页的尺寸 << 整个程序的大小 Linux下,通常设置成4KB,可查看: Linux设置的页大小...除了程序分页装载这种方式之外,还有其他优化内存使用的方式:“动态装载”,请见后文分解。 FAQ 在Java这样使用虚拟机的编程语言里,程序是怎么装载到内存里的?...参考 深入浅出计算机组成原理 《程序员的自我修养——链接、装载和库》的第1章和第6章
需要同时在 tina-d1-h/lichee/brandy-2.0/u-boot-2018/drivers/mtd/awnand/spinand/physic/id.c 和 tina-d1-h/lichee/linux
一年前挖的坑,我要填上,正好可以凑数~ 首先这个飞控很便宜,就是三十四块钱的样子,二是固件的代码很清晰,三是扩展性好。...Betaflight飞控1.0源码位置 100元空心杯F3飞控(BetaFlight固件) 开新坑:betaflight源码分析(开坑篇) 就看就写肯定是效率不行,我这次看完再写,这次分享的就是几个典型的原理图...无刷板的原理图(一开始这个固件是空心杯电机的) 这个陀螺仪是使用SPI读取的 嘿嘿嘿,都是便宜的器件 速度会更快 在target里面定义 在ESC的驱动文件里面起作用 在DSHOT驱动的实现文件里面来设置驱动的频率
st官方固件库是在寄存器操作之上的,但是使用寄存器操作的话,需要注意的地方很多,需要对照参考手册一个一个赋值,稍有不慎便会出错,所以固件库将外设的初始化封装成初始化结构体,将外设的操作封装在函数中,将寄存器赋值的操作都封装起来...,我们只需要调用API就可以,这样一来既提高了开发效率,也减少了代码量,如果还不能在MDK里熟练使用固件库编程,建议先补基础~接下来,我们在上一节寄存器工程的基础上,添加固件库,使用固件库进行开发。...user:因为使用了固件库,所以将固件库配置头文件stm32f10x_conf.h,中断服务程序文件stm32f10x_it.h和stm32f10x_it.c都复制进去,这些文件从固件库的project...2.编译固件库工程 固件库编译的时候有几点需要注意两点: 文件和makefile不是同一个目录时,如何告诉makefile找到头文件呢? 固件库中如此多的c文件,如何添加依赖关系呢?...可以在c文件全部使用相对于makefile的相对路径,显然这是最笨的办法,因为这么多文件,不可能一步一步添加,但是,在linux下可以使用find命令来寻找目录下的文件,所以我们使用find ./ -name
而原生的Scheduling模块只是内存态的调度模块,不支持任务的持久化或者配置(配置任务通过@Scheduled注解进行硬编码,不能抽离到类之外),因此考虑理解Scheduling模块的底层原理,并且基于此造一个简单的轮子...@Override public void afterPropertiesSet() { scheduleTasks(); } // 装载所有调度任务...(cronExpression, timeZone)); taskRegistrar.addCronTask(cronTask); log.info("装载...initialDelayMilliseconds); taskRegistrar.addFixedRateTask(fixedRateTask); log.info("装载...如果想要从底层原理理解整个调度模块的运行原理,那么就一定要分析ScheduledThreadPoolExecutor的实现。
关于PXE部署的详细配置的文章已经有不少了,这篇文章主要讲一下PXE启动的原理以及PXE启动和普通Linux启动的对比。...一、PXE启动原理: 原理图如下: DHCP的用途是:提供client network参数和TFTP服务器的地址,最初的bootstrap程序(即DHCP或BootP等)和所需的程序。...首先,PXE client端(BIOS里面的PXE固件)广播一个DHCPDISCOVER的包,它询问所需的网络配置以及网络启动的参数。...这个最小操作系统在装载了网络驱动和TCP/IP协议栈之后,就会开始boot或者install完整的操作系统了。...二、PXE启动过程和普通的Linux系统启动过程的对比: 1.
Linux mmap原理 前言 Linux段页式内存管理 mmap mmap内存映射原理 文字概述 mmap函数参数介绍 源码解析 1. 文件映射 2....,但是并没有深入理解mmap在操作系统内部是如何实现的,原理是什么。...本文想要和大家一起来聊聊mmap的原理,本文整体脉络如下: linux段页式内存管理回顾 mmap原理 ---- Linux段页式内存管理 这里的段页式内存管理主要基于linux 0.11进行讲解...(作者本人并非主攻linux,所以只是对linux 0.11略有研究) 无论是现代操作系统还是最早的linux 0.11操作系统,在对于物理内存的管理,都是将物理内存按页划分,如下图所示:...下面我们通过一幅图来对 mmap 的原理进行阐述: 从上图可以看出,mmap 的原理就是将虚拟内存空间映射到文件的页缓存,我们可以知道:对文件进行读写时需要经过页缓存进行中转的。
本文从一个实际例子出发,阐述了在对二进制形式的Linux固件做自动化安全加固的时遇到的技术难题和解决办法。 Linux内核是不是坚不可摧?答案是NO!...我们能够从设备中接触到二进制形式的固件,但却接触不到固件的源码。对于二进制固件的漏扫和加固是一个行业难题。...所谓固件,其实就是一个嵌入式操作系统,常见的有定制化的Linux和安卓系统。本质上它们都具有相似的结构:Bootloader、Kernel、根文件系统等。...这种方式的优点是修复方法统一,便于自动化,可不必深究不同漏洞的利用原理。...ldr指令从.addr(low)和.addr(high)中把跳板函数地址装载进x0,注意到ARM64的地址长度为64位,而ARM64的指令长度为32位,因此跳板函数地址被折成低32位和高32位。
系统调用 是 Linux 内核提供的一段代码(函数),其实现了一些特定的功能,用户可以通过 int 0x80 中断(x86 CPU)或者 syscall 指令(x64 CPU)来调用 系统调用。...二、进入系统调用 本文主要介绍的是 x86 CPU 进入系统调用的方式 Linux 提供了 int 0x80 中断来让用户程序进入 系统调用,我们来看看 Linux 对 int 0x80 中断的处理初始化过程...原理如下图(图片来源 https://developer.ibm.com/zh/technologies/linux/tutorials/l-system-calls/ ): ?...Linux 使用寄存器来传递参数,参数与寄存器的关系如下: 第1个参数放置在 ebx 寄存器。 第2个参数放置在 ecx 寄存器。 第3个参数放置在 edx 寄存器。...而 Linux 进入中断处理程序时,会把这些寄存器的值保存到内核栈中,这样 系统调用 就能通过内核栈来获取到参数。
文章目录 1.epoll 的用法 2.epoll 的创建 3.epoll 对象结构 4.向 epoll 添加文件描述符 5.阻塞和唤醒进程 6.小结 参考文献 epoll 是 Linux 平台下的一种特有的...本文主要讲解 epoll 的实现原理。 1.epoll 的用法 先复习下 epoll 的用法。...epoll_create() 函数创建一个 epoll 的文件描述符,epoll_create() 函数原型如下: int epoll_create(int size); 参数 size 是由于历史原因遗留下来的,自 Linux...---- 参考文献 epoll_create(2) - Linux manual page - man7.org linux内核Epoll 实现原理 Linux source code (v6.0)
在Linux内核中,进程又称为任务(task),进程的虚拟地址空间可以分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,又各自拥有独立的用户虚拟地址空间。...C语言标准库进程和Linux的内核进程称呼有所区别,对应关系如下: C标准库...Linux内核 包括多个线程的进程 线程组 只有一个线程的进程...图片 Linux内核提供了一组宏值来表示进程的状态: TASK_RUNNING(可运行状态或就绪状态);Linux并没有严格区分运行态或就绪态,统一为TASK_RUNNING...Linux不支持硬实时处理,至少在主流的内核中不支持。
./ kexec 从当前正在运行的内核引导到一个新内核 补充说明 kexec命令是Linux内核的一个补丁,让您可以从当前正在运行的内核直接引导到一个新内核。...在上面描述的引导序列中,kexec跳过了整个引导装载程序阶段(第一部分)并直接跳转到我们希望引导到的内核。不再有硬件的重启,不再有固件操作,不再涉及引导装载程序。...完全避开了引导序列中最弱的一环 – 固件。这一功能部件带来的最大益处在于,系统现在可以极其快速地重新启动。...因为kexec跳过了系统重新启动过程中最耗时的部分(也就是固件初始化硬件设备的阶段),所以重新启动变得非常快,可用性得到了提高。
注:本文出自复眼小组的magpie 一、前言 最近入坑iot,涉及很多芯片固件的逆向。但是这些固件很多时候都不是标准二进制格式,也就是说丢进ida,识别不出架构和指令集。...这里推荐一篇很优秀的论文,北京理工大学朱瑞瑾博士学位论文《ARM设备固件装载基址定位的研究》,在第三章提到了一个基于函数入口表的基址定位方法。具体原理原文写的非常清楚,建议直接阅读原文,我就不再赘述。...二、工具的开发、改进和优化 工具的原理直接去看论文原文就可以,源码我都公开在GitHub了,这里就不贴了。下面就主要聊一下对原文的算法做的改进和优化。...三、其他说明 iAudio固件测试图: ? ? sony固件测试图: ? ?...Exmaple目录下有几个测试用例固件,其中sony和iAudio固件为原论文中用到的,可以去对照加载基址。Sony固件满足boot模式。
显示命令执行时间 linux shell 具有history 功能,即会记录已经执行过的命令,但是默认是不显示命令的执行时间,命令的执行时间,history 已经记录,只是没有显示。
Sliverwave有刷四旋翼固件分析.一 Beecore Lite Silverware 有刷飞控.源码解读1 36元空心杯飞控Beecore Lite(Silverware固件) Betaflight...飞控1.0源码位置 100元空心杯F3飞控(BetaFlight固件) 开新坑:betaflight源码分析(开坑篇) Sliverwave有刷四旋翼固件分析.二(原理图) 先看驱动,后看逻辑的写作。...time里面 接着进来就是对应不同状态的声音频率 低的信号发射水平或者低电量,这个延时时间是浮点数的大数 如果上面的情况都没有出现,就是低电量什么的.开始准备启动蜂鸣器,就是叫的值现在已经装载了...如果上面的常数没有装载成功,那就直接关了蜂鸣器 最后把函数封装一下 这个简单的实现,没有什么好说的。 今天坐上特斯拉了!
---- 一、shell命令以及运行原理 我们用一个简单的例子来理解这个抽象的概念: 对shell的第一次感性认识: 在你很小的时候,对于外界的事物都充满好奇心,是妈妈一点一点来教你并且告诉你,让你从无知到了解...shell作用三:shell外壳是用户和linux操作系统交互的唯一途径,若因为用户的指令导致shell外壳挂掉,那么linux操作系统就不能被用户所使用。...那你可能疑惑,这里为什么是linux内核呢? 其实我们谈到linux操作系统,宏观是linux内核+shell外壳,微观是linux内核。 怎么理解呢?...---- 二、Linux权限 在了解权限之前,我们需要了解Linux是多用户操作系统,所以有很多用户,那么他们之间切换是如何进行的呢?...粘滞位:chmod +t 目录名 就会变为 rwt (操作仅针对目录) ---- 总结: shell的运行原理和权限想必大家都已经了解了吧!可以课后操作命令去练习,加深印象,我们下期再见!
理解用户权限的工作原理是掌握 Linux 的最重要部分之一。从这里开始学习基础知识。 译自 Linux: How File Permissions Work,作者 Damon M Garn。...Linux:Linux 技能模块库的配套实验室文章。在本系列文章中,我们还介绍了如何选择发行版、Linux 内核如何与硬件交互以及如何Linux 管理系统服务、存储和用户和组权限。...这些代表您管理 Linux 服务器的模拟公司中的三个部门。...本节介绍管理 Linux 权限所需的权限和身份。 了解访问级别 Linux 权限提供三种访问级别:读、写和执行。它们的行为在应用于文件或目录时略有不同。...本教程介绍了标准的 Linux 权限,但还有一些额外的特殊权限可以修改它们的工作方式。额外的 Linux 访问控制列表提供了更强大的控制文件安全性的方法。
领取专属 10元无门槛券
手把手带您无忧上云