U-BOOT全线移植分析系列之二――U-boot基础

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

【摘要】本节介绍了U-boot 的基本概念。首先介绍了U-boot 源代码的目录结构,并给出了一 个实例。接着简单介绍了U-boot 支持的基本功能、常见命令和环境变量。最后详细分析了U-boot 启动的两个阶段,重点介绍了加载 拷贝代码至RAM 中 的过程。

 

【关键词】bootloaderU-boot ,环境变量, stage1 ,位置无关,代码搬移

 

U-boot 基础

现在为Linux 开放源代码Bootloader 有很多, blob redboot U-BOOT 等,其中U-BOOT 是目前用来开 发嵌入式系统引导代码使用最为广泛的Bootloader 。它支持 POWERPC ARM MIPS X86 等处理器,支持嵌入式操作系统有LinuxVxworksNetBSD 等。

 

2.1 U-boot 源代码目录结构

|-- board  平台依赖,存放电路板相关的目录文件

|-- common  通用多功能函数的实现

|-- cpu  平台依赖,存放cpu 相关的目录文件

|-- disk  通用。硬盘接口程序

|-- doc  文档

|-- drivers  通用的设备驱动程序,如以太网接口驱动

|-- dtt

|-- examples  应用例子

|-- fs  通用存放文件系统的程序

|-- include  头文件和开发板配置文件,所有开发板配置文件放在其configs

|-- lib_arm  平台依赖,存放arm 架构通用文件

|-- lib_generic  通用的库函数

|-- lib_i386  平台依赖,存放x86 架构通用文件

|-- lib_m68k  平台依赖

|-- lib_microblaze  平台依赖

|-- lib_mips  平台依赖

|-- lib_nios   平台依赖

|-- lib_ppc 平台依赖,存放ppc 架构通用文件

|-- net  存放网络的程序

|-- post  存放上电自检程序

|-- rtc  rtc 的驱动程序

`-- tools  工具

 

详细实例:

²       board 开发板相关的源码 ,不同的板子对应一个子目录,内 部放着主板相关代码。 Board/at91rm9200dk/at91rm9200.c, config.mk, Makefile, flash.c ,u-boot.lds 都和具体开发板的硬件和地址分配有关。

 

²       common :与体系结构无关的代码文件,实现了 u-boot 所有命令,其中内置了一个 shell 脚本解释器 (hush.c, a prototype Bourne shell grammar parser), busybox 中也使用了它。

 

²       cpu : 与 cpu 相关代码文件,其中的所有子目录都是以 u-boot 支持的 cpu 命名

cpu/at91rm9200/at45.c, at91rm9200_ether.c, cpu.c, interrupts.c serial.c, start.S, config.mk, Makefile 等。其中:

cpu.c 负责初始化CPU 、设置指令Cache 和数据Cache 等;

interrupt.c 负责 设置系统的各种中断和异常 ,比如快速中断、开关中 断、时钟中断、软件中断、预取中止和未定义指令等;

start.S 负责 u-boot 启动时执行的第一个文件, 它主要是设置系统堆栈和工作方式,为跳转到C 程序入口点做准备;

at91rm9200_ether.c serial.c 很 重要,这是系统能够下载资源的前提。

 

²       disk :设备分区处理代码。

²       doc u-boot 相关文档。

 

²       driversu-boot 所支持的设备驱动代码, 网卡 、支持CFIFlash 、串口和USB 总线等。

²       fs: u-boot 所支持文件系统访问存取 代码, jffs2

 

²       include u-boot head 文件,主要是与各种硬件平台相关的头文件,如 include/asm-arm/arch-at91rm9200/AT91RM9200.h( 硬件寄存器名称及地址的定义 ), hardware.h 内存及 flash 地址以及 IO 物理地址和虚拟地址的定义 ),include/asm-arm/proc-armv (与具体的CPU 无关,无需移植)。

 

²       net : 与网络有关的代码, BOOTP 协议、 TFTP 协议、 RARP 协议代码实现 . 无需移植。

 

²       lib_arm :与 arm 体系相关的代码。

²       tools :编译后会生成 mkimage 工具,用来对生成的 raw bin 文件加入 u-boot 特定的 image_header.

 

2.2 U-Boot 支持的主要功能

主要功能如下:

²       系统引导, 支持 NFS 挂载 RAMDISK (压缩或非压缩)形式的根文件 系统;

²       支持 NFS 挂载、从 FLASH 中引导压缩或非压缩系统内核;

²       基本辅助功能,强大的 操作系统接口功能; 可灵活设置、传递多个关键参数给操作系统 ,适合系统在不同开发阶段的调试要求与产品发布,尤对 Linux 支持最为强劲;

²       支持目标板环境参数多种存储方式,如 FLASH NVRAM EEPROM

²       CRC32 校验,可校验 FLASH 中内核、 RAMDISK 镜像文件是否完好;

²       设备驱动,串口、 SDRAM FLASH 、以太网、 LCD NVRAM EEPROM 、键盘、 USB PCMCIA PCI RTC 等驱动支持;

²       上电自检功能 SDRAM FLASH 大小自动检测; SDRAM 故障检测; CPU 型 号;

²       特殊功能, XIP 内核引导。

 

2.3 U-boot 命 令介绍及环境变量

²       ?得到所有命令列表

²       Help help usb, 列出 USB 功能的使用说明

²       ping :注意只能开发板 PING 别的机器( AT91RM9200 不支持,需要进行配置)

²       setenv: 设置环境变量

Ø        setenv serverip 192.168.0.1

Ø        setenv ipaddr 192.168.0.56

Ø        setenv bootcmd ‘tftp 32000000 vmlinux; kgo 32000000’

²       saveenv :保存环境变量。在设置好环境变量以后, 保存变量值

²       tftp tftp 32000000 vmlinux, server IP= 环境变量中设置的serverip )中 /tftpboot/ 下的 vmlinux 通过 TFTP 读入到物理内存 32000000

²       bootp- 通过网络用 BootP/TFTP 协 议来启动映象

²       tftpboot- 通过网络用 TFTP 协议、设置服务器和客户机的 IP 地址进行映象文件传送

²       kgo: 起动没有压缩的 linux 内核, kgo 32000000 AT91RM9200 不支持)

²       bootm :起动 UBOOT  TOOLS 制作的压缩LINUX 内核 , bootm 3200000

²       protect FLASH 进行写保护或取消写保护,protect on 1:0-3( 就是对第一块FLASH0-3 扇区进行保护)protect off 1:0-3 取消写保护

²       erase 删除FLASH 的扇区, erase 1:0-2( 就是对每一块FLASH0-2 扇区进行删除)

²       cp 在内存中复制内容, cp 32000000 0 40000( 把内存中0x32000000 开始的0x40000 字节复制到0x0)

²       mw : 对 RAM 中 的内容写操作, mw 32000000 ff 10000( 把内存 0x32000000 开始的 0x10000 字节设为 0xFF)

²       md 修改 RAM 中的内容 , md 32000000 (内存的起始地址)

²       flinfo 列出 flash 的信息

²       loadb 准备用 KERMIT 协议接收来自 kermit 或超级终端传送的文件。

²       nfs nfs 32000000 192.168.0.12:aa.txt ,把 192.168.0.12(LINUX NFS 文件系统 ) 中的 NFS 文件系统中的 aa.txt 读入内存 0x32000000 处。

 

最常用的几个命令如下:

²       go- 在地址 'addr' 处开始程序执行

²       run- 运行一个环境变量所定义的命令

²       bootm- 内存中 进行运行经过 mkimage 加工的程序映象

²       loadb- 通过串口线 (kermit mode) 来装载二进制 文件

²       printenv- 打印环境变量

²       setenv- 设置环境变量

²       saveenv 保存环境变量到内存

²       tftp -通过网络下载文件

²       protect erase flash 读写

 

下面是 U-BOOT 中的简单环境变量

²       baudrate 波特率

²       bootdelay         boot 延迟

²       bootcmd   Boot 命令

²       bootargs   Boot 参数,传递给内核

²       bootfile 默认下载启动的内核映象

²       ipaddr       客户机 IP 地址

²       serverip    服务器地址

²       loadaddr   装载地址

²       ethaddr     网卡 MAC 地址

 

2.4 U-Boot 的 启动流程分析

和大多数的Bootloader 一 样,U-BOOT 的启动分为两个阶段两个部分,依赖于CPU 体系结构的代码主要放在stage1 ,且用汇编 来实现,而stage2 则通常用C 语言来实现,这样可以实现复杂的功能,而且具有更好的可读性和可移植性。

 

下面分别分析一下这两个阶段的启动流程:

第一阶段:基本的硬件初始化,为第二阶段程序运行建立 环境 (cpu/ at91rm9200 /start.s 文件的代码部分):

××××××××××××××××××××××××××××

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

OUTPUT_ARCH(arm)

ENTRY(_start) // 程序的入口在 /cpu/××××/start.s 中定义

SECTIONS

{

        . = 0x00000000; // 程序链接的地址

 

        . = ALIGN(4);

        .text      :

        {

          cpu/at91rm9200/start.o  (.text)

          *(.text)

        }

 

        . = ALIGN(4);

        .rodata : { *(.rodata) }

 

        . = ALIGN(4);

        .data : { *(.data) }

 

        . = ALIGN(4);

        .got : { *(.got) }

 

  __u_boot_cmd_start = .;

  .u_boot_cmd : { * (.u_boot_cmd) }

  __u_boot_cmd_end = .;

 

        armboot_end_data = .; // 代码段结束地址

 

        . = ALIGN(4);

        .bss : { *(.bss) }

 

        armboot_end = .;   // 整个 U-boot 印象的结束地址

}

××××××××××××××××××××××××××××

 

在此需要定义程序入口, 由于一个可执行的 Image 必须要有 一个入口点 ,并且只能有一 个 全局入 口,通常这个 入口就在 ROM (flash)0x0 地址,因此,必须通知编译器以使其知道这个入口, 该 工作可通过修改连接器脚本 u-boot.lds 来完成 ,该阶段需要依次完成的工作一般包括:

²       CPU 自身的初始化,它包括: CPU 运 行模式的设置(管理模式)、设置异常的入口地址和异常处理函数、运行时钟频率的设置等工作。

²       初始化 GPIO 和内存控制器。

²       为拷贝 Stage2 准备 RAM 空间。

²       进行自拷贝,将 U-BOOT Stage2 拷贝到 RAM 中。

²       设置好堆栈。

²       跳转到 Stage2 的入口,从而转到 RAM 中执行,该工作是调用指令 ldr pc, start armboot 来完成的。

××××××××××××××××××××××××××

1.1.2 开始, u-boot 有初始化 SDRAM 并拷贝自己到 SDRAM 运行的代码,而之前的版本就没有这个功能(详细查看下代码??的确如此,因此对于以前的版本 TEXT_BASE 没有起作用? 实际测试下??) board/ at91rm9200dk config.mk 文件(TEXT_BASE = 0x21f0000032M RAM 的设置,为第二阶 段程序在RAM 中的运行地址) 用于设置程序编译连接的起始地址,在程序中要特别注 意与 地址相关指令的使用

Board/at91rm9200dk/config.mk

TEXT_BASE = 0x21f00000u-boot 将被载入SDRAM 高端部分

注意,对于不同的系统 RAM 大小可能不一样,要根据实际情况调整

/config.mk

ifdef BOARD

sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk     # include board specific rules

endif

CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)              /

        -D__KERNEL__ -DTEXT_BASE=$(TEXT_BASE)     

LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)

export      TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS

 

对于 U-Boot 1.1.2 以前 的版本,并没有自拷贝的部分,若flash 中首地址存放的是非压缩的u-boot.bin 的,则启动部分是一直运行在flash 中的;但对于AT91RM9200 来 说,他通常有三个文件loader.bin, boot.bin, u-boot.binflash 中首先运行的是boot.bin 其将压缩的u-boot.bin.gz 解压拷贝到 TEXT_BASE 处 运行,此时已经在 RAM 中了,因此也无需实现自拷贝了。

 

对于 U-Boot 1.1.2 以后的版本,若像AT91RM9200boot.bin 这样的过渡程序,则将u-boot.bin.gz 解压到RAM 中,此时运行地址和链接地址相同,无 需拷贝;若没有,则u-boot.bin 将在flash 中执行初始化部分,然后将自身拷贝到RAM 中执行。

// 比较运行地址和链接地址,如果当前已经在 RAM 中运行了,则 无需拷贝到 RAM

relocate:                               /* relocate U-Boot to RAM           */

        adr     r0, _start              /* r0 <- current position of code   */

        ldr     r1, _TEXT_BASE          /* test if we run from flash or RAM */

        cmp     r0, r1                  /* don't reloc during debug         */

        beq     stack_setup

 

        ldr     r2, _armboot_start

        ldr     r3, _bss_start

        sub     r2, r3, r2              /* r2 <- size of armboot            */

        add     r2, r0, r2              /* r2 <- source end address         */

 

copy_loop:

        ldmia   r0!, {r3-r10}           /* copy from source address [r0]    */

        stmia   r1!, {r3-r10}           /* copy to   target address [r1]    */

        cmp     r0, r2                  /* until source end addreee [r2]    */

        ble     copy_loop

 

当程序在Flash 中运行时,执行程序跳转时必须要使用 相对跳转指令 ,而不能使用绝对地址的跳转 ( 即直接对PC 操作) 。如果 使用绝对地址,那么,程序的取指是相对于当前 PC 位置向前或者向后的 32MB 空间内, 而不会跳入 SDRAM

×××××××××××××××××××××××××××××

 

在上述操作运行完成后,就进入到/lib_arm/board.c 中的start_armboot() 函数运行,并建立起了一个基本的环境,此时的物理内存空间的分布就变成了如图所示的情况。

转入boatloader stage2 的系统内存布局

 

第二阶段:运行U-BOOT 的主体部分

该阶段以程序跳转到lib_arm/board.c 中的 start_armboot 函数为标志,该函数同时也是C 语言的开始函数,是整 个启动代码的主体函数,同时还是整个U-BOOT 的主体函数,该函数主要完成以下工作:

²       调用一系列的初始化函数,初始化本阶段使用到的硬件,如:

×××××××××××××××××××

init_fnc_t *init_sequence[] = {

        cpu_init,           /* basic cpu dependent setup */

        board_init,                /* basic board dependent setup */

        interrupt_init,            /* set up exceptions */

        env_init,           /* initialize environment */

        init_baudrate,           /* initialze baudrate settings */

        serial_init,         /* serial communications setup */

        console_init_f,          /* stage 1 init of console */

        display_banner,         /* say that we are here */

        dram_init,         /* configure available RAM banks */

        display_dram_config,

#if defined(CONFIG_VCMA9)

        checkboard,

#endif

        NULL,

};

×××××××××××××××××××××

env_init :设置环境变量,初始化环境;

init_baudrate :设置串口的波特率;

serial_init :设置串口的工作方式;

dram_init :设置SDRAM 的起始地址和大小;

     

²       检查存储器分配和使用情况:获取 flash bank 分区情况、是否擦除、是否上锁等信息为以后 flash 相关命令使用;初始化系统内存分配函数,供后面的代码使用 malloc 等函数,U-BOOT 没有使用其他现成的库所有函数的实现均在文件中 ) ,如果系统有液晶等显示设备,一并在此分配显示内存。

²       打印内存,flash 、环境变量设置等信息。

²       等待几秒时间,如果有键盘输入,则进入命令模式,接收用户输入的命令 并解释执行(如启动操作系统,更新 flash 内容)。

²       如果在给定的时间内没 有用户输入或者在执行命令操作时收到了 用户要求启动内核的命令 (boot) 则将把操作系统内核和 根文件系统映像文件从 flash 中拷贝到 RAM 中 相应位置,并在设置内核启动参数后跳转到内核映像的首地址处执行。

×××××××××××××××××××××××××××××

U-BOOT 调用 Linux 内核的方法是直接跳转到内核的第一条指令处,也即直接跳转到 MEM_START 0x8000 地址处。在跳转时,要满足下列条件:

a) CPU 寄存器的设置:R00R1 =机器类型 ID ,本系统的机器类型ID193 R2 =启动参数标 记列表在 RAM 中的起始基地址;  

b) CPU 模式:必须禁止中断(IRQsFIQs)CPU 必须工作在SVC 模式;

c) CacheMMU 的设置:MMU 必须关闭;指令Cache 可以打开也可以关闭;数据Cache 必须关闭。

系统采用下列代码来进入内核函数:

void (*theKernel)(int zero, int arch);

theKernel = (void (*)(int, int))ntohl(hdr->ih_ep);

theKernel(0, bd->bi_arch_number); 其中,hdrimage_header_t 类型的结构体, hdr-> ih_ep entry point ,指向内核的第一条指令地址,即 Linux 操作系统下的 /kernel/arch/arm/boot/compressed/head.S 汇编程序 theKernel() 函数调用应该不会返回,如果该调用返回,则说明出错。

×××××××××××××××××××××××××××××

Linux 6.12 源码深度剖析: do_exit 本文深度剖析Linux 6.12内核中do_exit函数的销毁机制,揭示其作为进程/线程终结核心入口的架构设计与源码实现。基于arm64/x86平台,系统解析其在资源回收(内存、文件、I/O)、调度交接与父子关系重构中的跨模块协同逻辑,强调状态原子性与释放顺序的重要性。结合真实生产案例,指出内核线程误用do_exit导致死锁、io_uring异步请求阻塞退出等典型陷阱,并提供驱动优化与监控调优方案,为中高级开发者提供硬核内核实践指南。 阅读详情

相关推荐

U-BOOT全线移植分析系列之三――U-BO…

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 【摘要】本节介绍了U-boot在AT91RM9200上移植的详细过程。首先分析AT91RM9200片内片外启动的详细流程,接着介绍了AT91RM9200启动所需

dieqms的专栏 548

U-BOOT全线移植分析系列之一 ――BOO…

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> U-BOOT全线移植分析系列之一 ――――BOOTLOADER介绍 【摘要】本节介绍了bootloader

dieqms的专栏 472

U-BOOT全线移植分析系列之二――U-bo…

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 【摘要】本节介绍了U-boot的基本概念。首先介绍了U-boot源代码的目录结构,并给出了一个实例。接着简单介绍了U-boot支持的基本功能、常见命令和环境变量

dieqms的专栏 375

U-BOOT全线移植分析系列之四――U-bo…

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 【摘要】本节介绍了U-boot使用go或bootm启动linux内核的方法。首先介绍了mkimage的参数意义和bootm的详细执行流程。然后分析了如何利用mk

dieqms的专栏 665

【嵌入式Linux学习七步曲之第三篇 Linux系统bootlaoder移植】U-BOOT全线移植分析系列之三--U-BOOT在AT91RM9200上的移植

  U-BOOT全线移植分析系列之三――U-BOOT在AT91RM9200上的移植 Sailor_forever  sailing_9806@163.com 转载请注明http://blog.csdn.net/sailor_8318/archive/2008/08/05/2773307.aspx 【摘要】本节介绍了U-boot在AT91RM9200上移植的详细过程。

Sailor_forever 7812

U-BOOT全线移植分析系列之三--U-BOOT在AT91RM9200上的移植

U-BOOT全线移植分析系列之三 ――U-BOOT在AT91RM9200上的移植   Sailor_forever  sailing_9806@163.com转载请注明 http://blog.csdn.net/sailor_8318/archive/2008/08/05/2773307.aspx   【摘要】本节介绍了U-boot在AT91RM9200上移植的详细过程。首先分析AT

flymachine的专栏 1571

嵌入式linux怎么查看boot的,【嵌入式Linux学习七步曲之第三篇 Linux系统bootlaoder移植】U-BOOT全线移植分析系列之四--U-boot如何引导Linux内核启动? - Sa...

U-BOOT全线移植分析系列之四――U-boot如何引导Linux内核启动?【摘要】本节介绍了U-boot使用go或bootm启动linux内核的方法。首先介绍了mkimage的参数意义和bootm的详细执行流程。然后分析了如何利用mkimage生成内核映象的方法。对于bootm方式的内核是否压缩、-a、-e、运行地址等16种组合情况,给出了详细的测试过程,提出了6种可用方法种的三种最优解。【关键...

weixin_39529128的博客 287

U-boot如何引导Linux内核启动?

https://blog.csdn.net/u013491946/article/details/77159026 U-BOOT全线移植分析系列之四 ――U-boot如何引导Linux内核启动?   Sailor_forever  sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/2008/08/05/...

chengde6896383的专栏 591

Linux的开发工具

包管理器就类似手机上的应用商店。

2401_88240248的博客 151

Apache Tomcat 9 下载全指南(Windows,Linux,macOS):版本选型、国内镜像、SHA-512 与 PGP 完整性校验

认准官方入口 → Core 区按系统选包 → 安装包可用国内镜像提速、校验文件从官方源获取 → SHA-512(生产再加 PGP)校验通过再使用。当前最新版本为 9.0.121(以官网为准),运行需 Java 8 及以上,9.0.x 官方支持至少持续到 2027 年 3 月。把好"来源"与"校验"两道关,后续解压、配置、启动才有安全根基。个人领域:C++/java/Al/软件开发/芯片开发个人主页:「一名热衷协作的开发者,在构建中学习,期待与你交流技术、共同成长。

专注于跨端开发实战,分享从工程搭建到应用落地的全流程技术干货,助力开发者快速掌握跨平台开发核心能力,打造稳定、高效的应用。 265

Linux systemd 服务管理:从unit 文件到systemctl 启停与排障

Linux systemd 服务管理:从 unit 文件到 systemctl 启停与排障 服务「装了却起不来」、开机偶发失败、改完 unit 不生效,多数落在 **依赖顺序、Type 类型、环境变量与 drop-in 覆盖**。本文把 systemd 服务管理从 unit 结构讲到 排障,便于对照本机验证。 源码锚点 路径 / 手册 作用 ------------- ------ Service 单元字段语义 通用单元、依赖、条件 启停、状态、编辑 管理员单元与 drop-in 软件包默认单元 最小 se

qq_35223473的博客 181

【信创】# Linux 系统split分片大ZIP压缩文件刻录到光盘-迁移后合并解压

将大于4GB的data.zip用split -b 4200m切分为多个分片,刻录至多张DVD光盘,并附带MD5校验文件。接收方收集所有分片后,通过cat $(ls *.zip.* | sort -V)合并,用md5sum -c校验完整性,再用unzip -t验证压缩包,最后解压恢复。全程仅需Linux原生工具,兼容统信UOS、银河麒麟等信创系统,安全可靠。

cnxzzcn的博客 193

linux搭建kafka

查看容器状态:执行docker ps,确认kafka与kafka-ui两个容器均处于Up状态。访问 UI 地址:在浏览器打开,进入 Kafka UI 控制台。检查集群连接:在 UI 的 Cluster 页面确认local集群显示为在线,且 Broker 数量为 1。

Asion15727288501的博客 239

Linux 系统篇(十九)】进程(七):深入理解虚拟地址空间:从进程地址空间到内核管理

为了更好地理解虚拟地址空间,我们先讲一个生动的比喻——大富翁的私生子有一个身价 10 亿的大富翁,他有 4 个私生子,彼此互不相识,都以为自己是独生子。富翁对每个孩子都画了大饼说:“儿子,我这 10 亿资产未来全是你的!” 于是每个儿子都认为自己拥有 10 亿。当私生子 A 想要10 万的零花钱,富翁随手给了;私生子 B 想要 100 万买个车,富翁也满足了……但实际上,富翁手里总共只有 10 亿,他通过自己的账本管理着给每个儿子的实际资源,而不是真的让每个儿子都占有全部资产。大富翁= 操作系统(OS)

Huang_jin007的博客 781

数据库教程FGMT04‑生产环境Linux+Oracle19c RAC集群安装配置与项目实战

Oracle RAC(Real Application Clusters)真实应用集群,是Oracle企业级高可用核心技术,多台服务器实例同时访问同一套共享存储数据库,实现业务负载分担、节点故障自动故障转移,广泛应用于金融、运营商、政务核心交易系统。我是风哥,在大量TB级业务项目实施过程中,两节点RAC是生产最主流部署形态。

风哥oracle/mysql/pg技术教程 171

Linux MISC驱动实验

所有的 MISC 设备驱动的,不同的设备使用不同的从设备号。随着 Linux 字符设备驱动的不断增加,设备号变得越来越紧张,尤其是主设备号,MISC 设备驱动就用于解决此问题。MISC 设备会自动创建 cdev,不需要像我们以前那样手动创建,因此采用 MISC 设备驱动可以简化字符设备驱动的编写。我们需要向 Linux 注册一个 miscdevice 设备,miscdevice 是一个结构体,定义在文件定义一个 MISC 设备 (miscdevice类型) 以后我们需要设置minorname和fops。

ckg3824278的博客 86

Linux 网络编程》深入理解 TCP 协议(一):报头解析与可靠传输基础

本文深入解析TCP协议报头中的4位首部长度字段,阐明其以4字节为单位计算头部长度的机制,并结合Linux内核源码揭示TCP报头结构实现。文章厘清了TCP与UDP在报头设计上的根本差异:TCP面向字节流,无需长度字段;而UDP面向数据报,需显式标明长度。同时,系统讲解了确认应答与超时重传两大核心可靠性机制,揭示TCP如何通过序号管理、自动重传与去重,实现数据可靠传输。本篇为后续深入学习滑动窗口、拥塞控制等高级特性奠定坚实基础

2501_91275995的博客 98

Linux 重定向

重定向:不改变用户代码,改变数据流向。本该输出到显示器的数据,输出到文件;本该从键盘读数据,改成从文件读取。:输出重定向,截断式,,清空文件,把命令输出写入文件。>>:追加重定向,,把输出追加到文件末尾,不覆盖原有内容。:输入重定向,,命令不再从键盘读取,从文件读取数据。缓冲区坑(printf库函数重定向)输出到终端:stdout行缓冲,遇到\n自动刷新;重定向到普通文件:stdout切换成全缓冲。没有换行、缓冲区没满,程序直接close,数据留在用户缓冲区,文件看不到内容。

Diopeng_out的博客 320
上一篇: U-BOOT全线移植分析系列之一――――BOOTLOADER介绍
下一篇: U-BOOT全线移植分析系列之三 ――U-BOOT在AT91RM9200上的移植
liangkaiming
博客等级 码龄16年 254粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值