在嵌入式系统中,BootLoader 是用来初始化硬件,加载内核,传递参数。因为嵌入式系统的硬件环境各不相同,所以嵌入式系统的BootLoader 也各不相同,其中比较通用的是U-Boot,它支持不同的体系结构,如ARM,PowerPC,X86,MIPS 等。本文着重介BootLoader与内核之间参数传递这一基本功能。本文的硬件平台是基于AT91RM9200 处理器系统,软件平台是Linux-2.6.19.2 内核。内核映像文件为zImage。
1. 系统硬件平台简介
AT91RM9200 处理器,它是由Atmel 公司基于ARM920T 内核的微处理器,带有内存管理单元,CPU 时钟最高可达240MHz,它具有丰富的标准接口,EBI 接口,内部集成了静态存储控制器(SMC),SDRAM 控制器,Burst Flash 控制器。有关处理器的说明请参考AT91RM9200 的数据手册。本系统SDRAM(64MB)地址为:0x20000000, NorFlash(8MB)的地址为:0x10000000[1]。
2. BootLoader 设计和实现
内核源代码目录树下的documentation/arm/booting[2]文档规定了基于ARM 体系结构BootLoader 的基本功能。本系统BootLoader 除了完成这些基本的功能外,还结合自身硬件的特点加入了代码搬运等功能。
BootLoader 的流程是:系统上电复位后,首先从NorFlash 开始运行(由处理器BMS 引脚连接决定),因为处理器此时的0 地址就是NorFlash 的首地址(0x10000000),BootLoader就是被烧写在这个位置,AT91RM9200 处理器能够映射的地址范围只有0x0000
0000—0x001f ffff。 BootLoader 执行的第一步就是将自身代码从NorFlash 中搬运到处理器内部的RAM 中(0x00200000),然后将0 地址映射到内部RAM,并且跳转到内部RAM 的相应地址处继续执行。进入内部RAM 后才进入真正的硬件初始化阶段,这个阶段初始化的各种控制器都是内核所必须的,包括:PMC, EBI, SMC, SDRAM, USART 等。接着就是创建内核参数链表(Tagged list),创建完链表就是搬运事先烧写在NorFlash 中的内核映像和根文件系统映像到SDRAM,根据内核对BootLoader 的基本要求关闭中断,MMU 和数据Cache,并且配置r0=0, r1=0x0000 00fb 或者0x00000106(根据内核中linux/arch/arm/tools/mach-types[2]
规定的机器编号),r2=0x20000100(BootLoader 传递给内核参数链表的物理地址),在ARM体系结构中,这个地址在同一种处理器的机器描述符(machine_desc)中都是默认的,所以在这里可以不指定。最后BootLoader 直接跳转到SDRAM 的内核处执行。
3. 内核参数链表
BootLoader 可以通过两种方法传递参数给内核, 一种是旧的参数结构方式(parameter_struct),主要是2.6 之前的内核使用的方式。另外一种就是现在的2.6 内核在用的参数链表 (tagged list) 方式。这些参数主要包括,系统的根设备标志,页面大小,内存的起始地址和大小,RAMDISK 的起始地址和大小,压缩的RAMDISK 根文件系统的起始地址和大小,内核命令参数等[3][4][5]。
内核参数链表的格式和说明可以从内核源代码目录树中的 include/asm-arm/setup.h[2]中找到,参数链表必须以ATAG_CORE 开始,以ATAG_NONE 结束。这里的ATAG_CORE,ATAG_NONE 是各个参数的标记,本身是一个32 位值,例如:ATAG_CORE=0x54410001。
其它的参数标记还包括: ATAG_MEM32 , ATAG_INITRD , ATAG_RAMDISK ,ATAG_COMDLINE 等。每个参数标记就代表一个参数结构体,由各个参数结构体构成了参数链表。参数结构体的定义如下:
struct tag
{
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
struct tag_videotext videotext;
struct tag_ramdisk ramdisk;
struct tag_initrd initrd;
struct tag_serialnr serialnr;
struct tag_revision revision;
struct tag_videolfb videolfb;
struct tag_cmdline cmdline;
struct tag_acorn acorn;
struct tag_memclk memclk;
} u;
};
参数结构体包括两个部分,一个是 tag_header 结构体,一个是u 联合体。
tag_header 结构体的定义如下:
struct tag_header
{
u32 size;
u32 tag;
};
其中 size:表示整个tag 结构体的大小(用字的个数来表示,而不是字节的个数),等于tag_header 的大小加上u 联合体的大小,例如,参数结构体ATAG_CORE 的
size=(sizeof(tag->tag_header)+sizeof(tag->u.core))>>2,一般通过函数 tag_size(struct * tag_xxx)来获得每个参数结构体的size。其中tag:表示整个tag 结构体的标记,如:ATAG_CORE等。
联合体u 包括了所有可选择的内核参数类型,包括:tag_core, tag_mem32,tag_ramdisk等。参数结构体之间的遍历是通过函数tag_next(struct * tag)来实现的。本系统参数链表包括的结构体有: ATAG_CORE , ATAG_MEM, ATAG_RAMDISK, ATAG_INITRD32 ,ATAG_CMDLINE,ATAG_END。在整个参数链表中除了参数结构体ATAG_CORE 和ATAG_END 的位置固定以外,其他参数结构体的顺序是任意的。本BootLoader 所传递的参数链表如下:第一个内核参数结构体,标记为ATAG_CORE,参数类型为tag_core。每个参数类型的定义请参考源代码文件。
tag_array 初始化为指向参数链表的第一个结构体的指针。
tag_array->hdr.tag=ATAG_CORE;
tag_array->hdr.size=tag_size(tag_core);
tag_array->u.core.flags=1;
tag_array->u.core.pagesize=4096;
tag_array->u.core.rootdev=0x00100000;
tag_array=tag_next(tag_array);
tag_array->hdr.tag=ATAG_MEM;
tag_array->hdr.size=tag_size(tag_mem32);
tag_array->u.mem.size=0x04000000;
tag_array->u.mem.start=0x20000000;
tag_array=tag_next(tag_array);
……
tag_array->hdr.tag=ATAG_NONE;
tag_array->hdr.size=0;
tag_array=tag_next(tag_array);
最后将内核参数链表复制到内核默认的物理地址0x20000100 处。这样参数链表就建好了。
4. 内核接收参数
下面从基于ARM体系结构的zImage 映像启动来分析Linux 内核是怎样接收BootLoader传递过来的内核参数,zImage 启动过程如下图所示。
(图有时间再画)
在文件 arch/arm/boot/compressed/head.S[2]中 start 为zImage 的起始点,部分代码如下:
start:
mov r7, r1
mov r8, r2
…...
mov r0, r4
mov r3, r7
bl decompress_kernel
b call_kernel
call_kernel:
……
mov r0, #0
mov r1, r7
mov r2, r8
mov pc, r4
首先将BootLoader 传递过来的r1(机器编号)、r2(参数链表的物理地址)的值保存到r7、r8 中,再将r7 作为参数传递给解压函数decompress_kernel()。在解压函数中,再将r7 传递给全局变量__machine_arch_type。在跳到内核(vmlinux)入口之前再将r7,r8 还原到r1,r2 中。
在文件 arch/arm/kernel/head.S[2]中,内核(vmlinux)入口的部分代码如下:
stext:
mrc p15, 0, r9, c0, c0
bl __lookup_processor_type
………
bl __lookup_machine_type
首先从处理器内部特殊寄存器(CP15)中获得ARM 内核的类型,从处理器内核描述符(proc_info_list)表(__proc_info_begin—__proc_info_end)中查询有无此ARM 内核的类型,如果无就出错退出。处理器内核描述符定义在 include/asm-arm/procinfo.h[2]中,具体的函数实现在 arch/arm/mm/proc-xxx.S[2]中,在编译连接过程中将各种处理器内核描述符组合成表。接着从机器描述符(machine_desc)表(__mach_info_begin—__mach_info_end)中查询有无r1 寄存器指定的机器编号,如果没有就出错退出。机器编号mach_type_xxx 在arch/arm/tools/mach-types[2]文件中说明,每个机器描述符中包括一个唯一的机器编号,机器描述符的定义在 include/asm-arm/mach/arch.h[2]中,具体实现在 arch/arm/mach-xxxx[2]文件夹中,在编译连接过程中将基于同一种处理器的不同机器描述符组合成表。例如,基于AT91RM9200 处理器的各种机器描述符可以参考 arch/arm/mach-at91rm9200/board-xxx.c[2],机器编号为262 的机器描述符如下所示:
MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK")
/* Maintainer: SAN People/Atmel */
.phys_io = AT91_BASE_SYS,
.io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
.boot_params = AT91_SDRAM_BASE + 0x100,
.timer = &at91rm9200_timer,
.map_io = dk_map_io,
.init_irq = dk_init_irq,
.init_machine = dk_board_init,
MACHINE_END
最后就是打开MMU,并跳转到 init/main.c[2]的start_kernel(初始化系统。在 init/main.c[2] 中,函数start_kernel()的部分代码如下:
{
……
setup_arch();
……
}
在 arch/arm/kernel/setup.c[2]中,函数setup_arch()的部分代码如下:
{
……
setup_processor();
mdesc=setup_machine(machine_arch_type);
……
parse_tags(tags);
……
}
setup_processor()函数从处理器内核描述符表中找到匹配的描述符,并初始化一些处理器变量。setup_machine()用机器编号(在解压函数decompress_kernel 中被赋值)作为参数返回机器描述符。从机器描述符中获得内核参数的物理地址,赋值给tags 变量。然后调用parse_tags()函数分析内核参数链表,把各个参数值传递给全局变量。这样内核就收到了BootLoader 传递的参数。
5. 参数传递的验证和测试
参数传递的结果可以通过内核启动的打印信息来验证。
Machine: Atmel AT91RM9200-DK
……
Kernel command line: console=ttyS0,115200 root=/dev/ram rw init=/linuxrc
……
Memory: 64MB = 64MB total
……
checking if image is initramfs...it isn't (no cpio magic); looks like an initrd
Freeing initrd memory: 1024K
……
RAMDISK: Compressed image found at block 0
一个完备的BootLoader 是一个很复杂的工程,本文所介绍的只是嵌入式系统的BootLoaer 基本功能。任何一个BootLoader 都离不开这个基本功能,内核只有接收这些参数才能正确地启动,同时也为内核的移植和调试奠定了良好的基础。
BootLoader与Linux内核的参数传递
相关推荐
Linux内核中常用的C语言技巧有哪些呢?
Linux内核采用的是GCC编译器,GCC编译器除了支持ANSI C,还支持GNU C。在Linux内核中,许多地方都使用了GNU C语言的扩展特性
2023-03-20 09:04:56738
Linux内核的作用
Linux操作系统是当今世界上最为广泛使用的开源操作系统之一,内核则是一个操作系统的核心和灵魂所在。对于一名Linux驱动开发者来说,了解Linux内核的运行机制和Linux内核提供的一些关键功能(如虚拟内存管理、进程管理、文件系统、网络协议栈等)都是我们日常工作和学习的重点。
2023-07-06 11:46:411046
linux驱动模块参数传递方式
在嵌入式linux应用开发中,可以给main()函数传递参数,这样应用程序就能知道最初的控制参数是什么,当然也可以选择不向应用程序传递参数。在驱动开发中,会使用到insmod命令来加载一个驱动模块,这时候我们也可以使用insmod命令向驱动模块传递参数。
2023-08-09 09:10:22246
linux内核系统调用之参数传递
与普通函数一样,系统调用通常需要一些输入/输出参数,这些参数可能包括实际值(即数字)、用户模式进程地址空间中的变量地址,甚至包括指向用户模式函数指针的数据结构的地址(参见第11章“信号相关的系统调用”部分)。
2023-12-20 09:32:12323
Linux内核中信号的传递过程
前面我们已经介绍了内核注意到信号的到来,调用相关函数更新进程描述符以便进程接收处理信号。但是,如果目标进程此时没有运行,内核则推迟传递信号。现在,我们看看内核如何处理进程挂起的信号。
2024-01-17 09:51:05391
Linux内核地址映射模型与Linux内核高端内存详解
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应
2018-05-08 10:33:193299
Bootloader的概念和用途------转载
处理器上电执行第一条指令的位置。 接下来分配参数区,这里可以作为Bootloader的参数保存区域。 再下来内核映像区。Bootloader引导Linux内核,就是要从这个地方把内核映像解压到RAM
2016-05-09 23:13:02
Linux内核之系统调用
Linux内核之系统调用1. 应用程序通过API而不是直接调用系统调用来编程;2. getpid()系统调用示例:asmlinkage long sys_getpid(void){ return
2012-02-21 10:49:32
Linux内核启动过程和Bootloader(总述)
供给 Linux 内核。Linux 内核在启动过程中会根据该处理器类型调用相应的初始化程序(4)设置 Linux启动参数 Bootloader在执行过程中必须设置和初始化 Linux 的内核启动参数。目前传递
2012-08-18 17:35:24
Linux内核模块程序结构
。 (4)模块参数(可选)。 模块参数是模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量。 (5)模块导出符号(可选)。 内核模块可以导出符号(symbol,对应于函数或变量),这样其他模块可以使用本模块中的变量或函数。 (6)模块作者等信息声明(可选)。
2017-05-27 09:36:50
Linux内核的最主要目的是什么
从上图可以知道:① 组成:嵌入式Linux系统 = bootloader + linux内核 + 根文件系统(里面含有APP)。② bootloader:它的目的是启动内核,去哪读内核?读到哪里?去
2021-12-17 07:09:09
Linux操作系统分层相关资料分享
过程BootLoarder是什么Linux操作系统分层一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。文件系统。包括根文件系统和建立于F
2021-11-04 07:38:49
Linux系统移植篇3:STM32MP1微处理器之设备树简介
会加载内核并将控制权转交给内核,此外,还需要把上述的三个参数信息传递给kernel,以便kernel可以有较大的灵活性。在linux kernel中,Device Tree的设计目标就是如此。
2021-08-26 11:08:21
Rk3399串口配置参数的传递过程如何去实现呢
的,通过该参数告诉内核使用哪个串口以及波特率作为调试串口,bootargs可以在设备树(dts)下配置,chosen里有属性项bootargs,启动linux时,内核会使用chosen中定义
2022-05-24 10:15:58
TI AM335x_linux-3.14.43内核移植笔记
Device Tree牵涉面比较广,即增加了新的用于描述设备硬件信息的文本格式(即.dts文件),又增加了编译这一文本的工具,同时Bootloader也需要支持将编译后的Device Tree传递给Linux
2018-06-04 15:49:15
【OK210试用体验】bootloader启动linux内核
由bootloader加载根文件系统到内存。3.3. linux启动参数bootloader可以给linux内核传递启动参数以控制其行为。linux内核启动参数位置并没有需要特别注意的地方,一般默认
2016-01-10 15:57:45
为什么毕业班自己写Bootloader启动内核时会失败?
毕业班自己写Bootloader,启动内核时出现:确定内核和文件系统没有问题,用之前的U-boot可以正常启动,自己写的Bootloader不行Copy kernel from
2019-09-04 05:45:01
为什么需要进行bootloader移植?
(firmware)中的boot程序(可选),和BootLoader两大部分。Linux内核特定于嵌入式平台的定制内核文件系统包括了系统命令和应用程序。BootLoader概念BootLoade...
2021-12-17 07:43:58
学习嵌入式Linux-JZ2440-初识Bootloader
。有的Bootloader还具有网络功能。Bootloader引导内核,它和内核也需要有参数的交互,不过因为二者不能够同时运行,所以它们的交互是单向的,只能够由Bootloader将各类参数传递给内核
2015-05-13 15:43:52
嵌入式Linux系统组成部分
嵌入式Linux系统软件由三部分组成:BootLoader(uboot)裸板软件,初始化硬件+从闪存加载内核到内存并且启动内核+给内核传递启动参数,告诉内核根文件系统rootfs在什么地方。(上电...
2021-12-14 06:24:34
嵌入式开发中BootLoader/内核和根文件系统之间的关系是什么
理解嵌入式开发中BootLoader、内核和根文件系统之间的关系一般来说,为了使开发板成功运行linux系统,我们需要完成以下三个方面的开发工作:bootloader(启动装载)kernel(内核
2021-11-08 07:27:56
怎样通过BootLoader加载Linux镜像
在前面的实验中,我们都是直接运行Linux内核。而在实际的嵌入式系统中都是通过BootLoader加载Linux镜像,然后再去运行。嵌入式BootLoader功能类似PC中的BIOS,用以检测硬件
2021-11-05 08:30:59
自己写的bootloader启动内核出现下面的情况该怎么办?
跟着毕业班 自己写bootloader 视频;板子是JZ2440 V3;写bootloader,编译没问题,启动内核时出现(NAND和NOR都烧写过,无论从NAND还是NOR启动问题一样,里面原有
2019-10-10 01:40:26
自己动手写Bootloader(基于jz2440)
;thekernel(0, 362, 0x30000100);Bootloader与内核的交互是单向的,Bootloader将各类参数传给内核,由于它们不能同时运行,传递的办法只有一个:Bootloader将
2017-08-05 20:53:38
请问内核参数在nand flash中的地址该怎么确定?
u-boot传递给内核的参数,在nand flash中的位置怎么确定的啊?烧写的时候把u-boot放在nand flash的0~0x60000,但内核中把内核参数定位在0x40000~0x60000范围,这个范围是内核确定的吗?u-boot中好像没有关于内核参数在nand flash中位置的代码啊
2019-07-22 05:45:07
请问是不是参数传递出错了?
kernelUncompressing Linux...uImage和u-boot都是用光盘里提供的补丁文件编译出来,而且之前都没问题.怎么用自己写bootloader那一课的代码却卡死了呢?请问大家觉得是不是参数传递出错了??
2019-06-17 05:45:01
适用于Linux的PSoC USBHID Bootloader
你好我正在编程通过USB编程PSoC。我在网站上找到了基于Windows的Bootloader主机程序。但是,我在Linux上工作。有基于Linux的Bootloader主机程序吗?谢谢美好的一周奥
2018-09-07 11:49:43
高效学习Linux内核——内核模块编译
情况下,内核模块应遵循GPL 兼容许可权。Linux2.6 内核模块最常见的是以MODULE_LICENSE(“Dual BSD/GPL”)语句声明模块采用BSD/GPL 双LICENSE4)模块参数
2021-09-24 09:11:03
Linux的内核教程
本章学习目标掌握LINUX内核版本的含义理解并掌握进程的概念掌握管道的概念及实现了解内核的数据结构了解LINUX内核的算法掌握LINUX内核升级的方法
2009-04-10 16:59:190
Linux内核解读入门
Linux内核解读入门关键词:Linux, 内核,源代码一.核心源程序的文件组织: 1. Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核
2010-01-16 14:40:10103
基于MIPS64的嵌入式Linux Bootloader的移
结合OCTEON3010(MIPS64)的U-boot移植经验,介绍了嵌入式Linux Bootloader的工作原理及功能,设计一个基于MIPS体系的Bootloader模型。对OCTEON系列的MIPS处理器Bootloader的设计有一定参考价值和指导
2010-12-17 16:30:3556
Linux发明者推稳定升级版2.6.13 Linux内核
Linux内核的下一个稳定的升级版本已经发布了。Linux发明者李纳斯·托沃兹(Linus Torvalds)用电子邮件向Linux内核邮件列表发布了升级版本的Linux内核。
2006-03-13 13:07:54824
《深入Linux内核架构》 莫尔勒著
德赢Vwin官网
为您提供了免费下载,《深入Linux内核架构》一书讨论了Linux内核的概念、结构和实现。内核对一致和非一致内存访问系统使用相同的数据结构。 Linux 操作系统的源代码复杂
2011-07-10 11:24:170
基于Linux 2.6内核Makefile分析
由于Linux的独特优势,使越来越多的企业和科研机构把目光转向Linux的开发和研究上。目前Linux最新的稳定内核版本为2.6.17,但是当今绝大部分对于Linux Makefile的介绍文章都是
2017-09-18 19:09:090
java方法参数传递简析
问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为
2017-09-27 17:03:290
Linux内核配置系统详解
随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中。面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码
2017-11-01 15:45:543
Linux内核移植相关代码解析
及讲解的不够清楚之处,请各位网友指正,这里提前谢过。本文分以下部分进行介绍: 1. Bootloader及内核解压 2. 内核启动方式介绍 3. 内核启动地址的确定 4. arch/armnommu
2017-11-07 11:29:400
linux内核启动参数设置
name”是关键字,内核用它来识别应该把“关键字”后面的值传递给谁,也就是如何处理这个值,是传递给处理进程还是作为环境变量或者抛给“init”。值的个数限制为10,你可以通过再次使用该关键字使用超过10个的参数。
2017-11-14 16:50:483866
Linux内核提权攻击研究
提权攻击是针对Linux系统的一种重要攻击手段。根据提权攻击所利用的漏洞类型,一般可将其分为应用层提权攻击和内核提权攻击。现有的防御技术已经能够防御基本的应用层提权攻击,但是并不能完全防御内核
2017-11-24 11:46:030
U-boot传递RAM和Linux kernel读取RAM参数的解析
U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb等。而Linux kernel也会读取和处理这些参数。两者之间通过struct tag来传递参数。U-boot
2018-02-06 08:24:535580
基于AT91RM9200 处理器系统中BootLoader与内核的参数传递
本文着重介BootLoader与内核之间 参数传递 这一基本功能。本文的硬件平台是基于AT91RM9200 处理器系统,软件平台是Linux-2.6.19.2 内核。内核映像文件为zImage。
2018-03-28 09:04:001724
函数参数传递的原理
参数传递,是在程序运行过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程,方法有按值传递参数,按地址传递参数和按数组传递参数。
2018-03-02 11:41:506871
Bootloader中LCD硬件初始化和软件驱动程序设计
Android系统在正常启动中,刷屏功能一般在内核中执行,而Bootloader的任务应该是执行硬件初始化,并尽快跳转到Linux内核。在Bootloader启动过程中使能一个显示驱动,实现刷屏功能
2018-03-07 14:05:068513
Linux内核与Android的关系
Android虽然建立在Linux内核之上,但是他对内核进行了一些扩展,增加了一些驱动。比如Binder,loger等等驱动。可以拿Android内核代码和其Baseline版本进行对比。可以看到Android对Linux内核的所有扩展。
2018-09-09 09:10:004369
基于嵌入式Linux系统的Bootloader模型在MIPS64上的移植设计浅析
Linux具备良好的裁剪性和移植性,并且开源、资源丰富,已成为嵌入式系统的开发热点。一个完整的嵌入式Linux系通通常包括Bootloader、内核、文件系统三部分,目标板上电后由
2018-09-12 16:13:32771
嵌入式教程之Bootloader的详细资料说明
,使得Linux 内核可以在系统主存中跑起来,并让系统符合Linux内核启动的必备条件,必须要有一个先于内核运行的程序,他就是所谓的引导加载程序:Bootloader。
2018-12-11 13:59:575
移植Bootloader的过程总结资料说明
linux系统上电后启动过程:---启动引导加载程序bootloader(一些CPU在运行bootloader之前,会先运行一段固化的程序)。
---》启动内核
---》挂载根文件系统
其中
2018-12-11 17:11:279
Linux教程之如何进行Bootloader的编写详细驱动学习资料汇总
Bootloader 把外部flash 中的内核代码读入内存(需要读flash 的驱动,初始化时钟,上电的时候只有12M,关看门狗之类的操作),并启动内核(跳转到内核的内存地址,并需要传递一些参数到给内核,让内核知道内存大的大小,根文件地址在哪里等)。-----这只是启动内核,高级的还可以烧写内核。
2018-12-13 13:53:467
Linux内核源码分析--内核启动命令行的传递过程
内核的启动参数其实不仅仅包含在了cmdline中,cmdline不过是bootloader传递给内核的信息中的一部分。bootloader和内核的通信方式根据构架的不同而异。
2019-05-05 15:28:131537
你了解u-boot与linux内核间的参数传递过程?
U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb、MAC地址等。而Linux kernel也会读取和处理这些参数。两者之间通过struct tag来传递参数
2019-05-13 10:00:451415
用户与内核空间数据交换的方式之一:内核启动参数
Linux 提供了一种通过 bootloader 向其传输启动参数的功能,内核开发者可以通过这种方式来向内核传输数据,从而控制内核启动行为。
2019-05-14 15:42:19407
Linux bootloader 编写方法
通过对 linux引导协议进行分析,详细阐述了如何编写一个可以在 i386 机器上引导 2.4.20内核的基本的bootloader。1.概述 linux运行在保护模式下,但是当机器启动复位的时候
2019-04-02 14:39:01284
谷歌Android设备内核引入主线Linux内核难吗?
Android是基于Linux内核的操作系统,但是,运行在Android设备上的内核其实与Google选择的LTS版本Linux内核有很大不同。
2019-11-22 10:41:422793
Linux内核创建者回应用户,不会推荐使用ZFS On Linux
Linux内核创建者Linus Torvalds最近回应 Linux内核调度器存在问题的文章引发了大家的关注,在同一个帖子里,他还回复了一名用户抱怨Linux内核最近破坏了内核源码树外ZFS模块的评论。
2020-01-10 10:32:432363
linux内核是什么_linux内核学习路线
Linux内核是一个操作系统(OS)内核,本质上定义为类Unix。它用于不同的操作系统,主要是以不同的Linux发行版的形式。Linux内核是第一个真正完整且突出的免费和开源软件示例。Linux 内核是第一个真正完整且突出的免费和开源软件示例,促使其广泛采用并得到了数千名开发人员的贡献。
2020-09-16 15:49:502323
最硬核的Linux内核文章
来源 :头条号@Linux学习教程,冰凌块儿 01 前言 本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用与功能,以便于读者能快速理解什么是Linux内核,能看懂Linux
2020-10-19 17:46:081860
快速理解什么是Linux内核以及Linux内核的内容
01 前言 本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用与功能,以便于读者能快速理解什么是Linux内核,能看懂Linux内核。 拥有超过1300万行的代码,Linux
2020-10-21 12:02:533873
BootLoader与Linux内核的参数传递详细资料说明
不同的体系结构,如 ARM, Powerpc,X86,MIPS等。本文着重介绍 Bootloader与内核之间参数传递这一基本功能。本文的硬件平台是基于AT91RM9200处理器系统,软件平台是 Linux-2.6.19,2内核。内核映像文件为 zimage
2021-03-16 10:39:0013
【2.0】bootloader工作流程、MCU启动流程
内存空间的映射图,然后调用Linux 内核。Linux 内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统(RootFilesystem),然后加载必要的内核模块,启动应用程序。(一个嵌入式...
2021-10-28 11:21:018
嵌入式 Linux 启动流程和 bootloader 介绍
目录嵌入式 Linux 启动流程简介启动流程Bootloader 简介市面上可见的 bootloader入式 Linux 启动流程简介对于一个 SoC 芯片而言,bootloader 必不可少。因为
2021-11-01 16:32:3811
嵌入式Linux操作系统引导加载程序BootLoarder
过程BootLoarder是什么Linux操作系统分层一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。文件系统。包括根文件系统和建立于F
2021-11-01 17:05:508
嵌入式Linux的内核编译
实验环境VMware Workstation PlayerUbuntu16.04kernel-3.2.tar.bz2Linux内核编译在ubuntu上编译嵌入式Linux内核,需要大家提前安装好交叉
2021-11-01 17:07:2016
【Linux】嵌入式Linux系统的移植(下篇:BootLoader,以U-Boot为例)
BootLoaderBootLoader的概念BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到
2021-11-01 17:37:1019
uboot研读笔记 | 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理
1. 嵌入式Linux系统开发架构一个嵌入式Linux的系统的架构如下图:软件程序开发中,从下往上每一次的作用依次为:Bootloader:将硬件初始化,并将内核引导起来;Linux Kernel
2021-11-02 13:36:3112
【嵌入式Linux之QEMU模拟器】5、使用u-boot加载Linux内核
在前面的实验中,我们都是直接运行Linux内核。而在实际的嵌入式系统中都是通过BootLoader加载Linux镜像,然后再去运行。嵌入式BootLoader功能类似PC中的BIOS,用以检测硬件
2021-11-02 15:21:0314
理解嵌入式开发中BootLoader、内核和根文件系统之间的关系
理解嵌入式开发中BootLoader、内核和根文件系统之间的关系一般来说,为了使开发板成功运行linux系统,我们需要完成以下三个方面的开发工作:bootloader(启动装载)kernel(内核
2021-11-03 12:06:0613
为STM32写bootloader 使用串口,实现程序IAP升级
,以便为最终调用操作系统内核准备好正确的环境。BIOS是windows的bootloader,u-boot等为常见的Linux开发版的bootloader。ARM内核芯片下载程序方式可分为三类;...
2021-12-24 19:02:232
Linux内核架构和工作原理
作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构,每个进程
2022-05-07 14:05:06284
学习linux内核的一些建议
学习linux内核,这个可不像学一门语言,c或者java一个月或者3月你就能精通掌握。学习linux内核是需要一步一步循序渐进,掌握正确的linux内核学习路线对学习至关重要,本篇文章就来分享学习linux内核的一些建议吧。
2022-05-07 15:20:27447
Linux驱动开发-安装驱动参数传递
Linux驱动安装时也支持传递参数,和命令行上运行的命令原理类似。 只不过在编写驱动的时候,需要在驱动代码里提前将相关信息声明好才可以使用。 这篇文章就介绍如果在命令安装驱动时,传递参数给驱动代码,演示各种类型的参数传输情况。
2022-09-17 15:30:151156
Linux内核移植教程
半导体厂商会从 Linux内核官网下载某个版本,将其移植到自己的 CPU上,测试成功后就会将其开放给该半导体厂商的 CPU开发者。开发者下载其提供的 Linux内核,然后将其移植到自己的产品上。
2023-04-19 11:20:32701
Linux内核模块参数传递与sysfs文件系统
Linux应用开发中,为使应用程序更加灵活地执行用户的预期功能,我们有时候会通过命令行传递一些参数到main函数中,使得代码逻辑可以依据参数执行不同的任务。同样,Linux内核也提供了类似main
2023-06-07 16:23:211241
Linux内核入口stext段分析
/kernel/head.S preserve_boot_args 保存 bootloader 传递过来的参数。 el2_setup 是设置 Linux 启动模式是 EL2。Linux 有 EL0、EL1
2023-09-28 17:07:55883
Linux内核UDP收包为什么效率低
现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK。 但是,即便Linux内核协议
2023-11-13 10:38:08214
评论
查看更多