linux 2.6 启动流程分析

Cadence ADE实战:1GHz VCO相位噪声仿真全流程(附PSS/Pnoise避坑指南) 本文详细介绍了在Cadence ADE环境中对1GHz VCO进行相位噪声仿真的完整流程。重点剖析了PSS(周期性稳态分析)和Pnoise(周期性噪声分析)两大核心引擎的关键参数设置与避坑指南,帮助射频与模拟IC设计者准确评估VCO性能,解决仿真不收敛、结果异常等常见问题。 阅读详情

内核在启动时可以传递一个字符串命令行,来控制内核启动的过程,例如:

"console=ttyS2,115200 mem=64M@0xA0000000"

这里指定了控制台是串口2,波特率是115200,内存大小是64M,物理基地址是0xA0000000。

另外我们可以在内核中定义一些全局变量,使用这些全局变量控制内核的配置,例如usb驱动中定义了

static int nousb; /* Disable USB when built into kernel image */

这个变量为1,则整个usb驱动不初始化,如果想将其置1,可在字符串命令行中添加nousb=1。

在操作该变量之前,还要让系统知道该变量,方法是:

__module_param_call("",nousb,param_set_bool,param_get_bool,&nousb,0444);

__module_param_call这个宏定义在kernel/include/linux/moduleparam.h

原型如下:

#define __module_param_call(prefix, name, set, get, arg, perm)   /

static char __param_str_##name[] = prefix #name;   /

static struct kernel_param const __param_##name    /

__attribute_used__       /

     __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) /

= { __param_str_##name, perm, set, get, arg }

 

它定义了一个kernel_param类型的变量,这个变量被放到了段__param,

kernel_param结构体的定义是:

struct kernel_param {

const char *name;

unsigned int perm;

param_set_fn set;

param_get_fn get;

void *arg;

};

__param这个段的声明有些平台是在arch/../../vmlinux.lds.S,而大多数平台是放到

kernel/include/asm-generic/vmlinux.lds.h中,定义如下:

__param : AT(ADDR(__param) - LOAD_OFFSET) {    /

   VMLINUX_SYMBOL(__start___param) = .;    /

   *(__param)       /

   VMLINUX_SYMBOL(__stop___param) = .;    /

}

内核启动时就会对字符串命令进行解析,在kernel/init/main.c中,内核启动函数start_kernel中

对外部数组进行了声明:

extern struct kernel_param __start___param[], __stop___param[];

然后调用函数parse_args对数组进行解析:

parse_args("Booting kernel", command_line, __start___param,

      __stop___param - __start___param,

      &unknown_bootoption);

其中command_line就是要解析的字符串命令行,unknown_bootoption是函数指针,它用来获取指定参数的=右边的值。

parse_args就会在数组中找到和nousb名称一样的kernel_param变量,并调用它的set函数对其进行付值。

 

内核启动地址的确定

内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds,

但是该文件是由vmlinux-armv.lds.in生成的,根据编译选项的不同源文件还可以是vmlinux-armo.lds.in,

vmlinux-armv-xip.lds.in。

vmlinux-armv.lds的生成过程在kernel/arch/arm/Makefile中

LDSCRIPT      = arch/arm/vmlinux-armv.lds.in

arch/arm/vmlinux.lds: arch/arm/Makefile $(LDSCRIPT) /

$(wildcard include/config/cpu/32.h) /

$(wildcard include/config/cpu/26.h) /

$(wildcard include/config/arch/*.h)

@echo '   Generating $@'

@sed 's/TEXTADDR/$(TEXTADDR)/;s/DATAADDR/$(DATAADDR)/' $(LDSCRIPT) >$@

vmlinux-armv.lds.in文件的内容:

OUTPUT_ARCH(arm)

ENTRY(stext)

SECTIONS

{

     . = TEXTADDR;

     .init : {            /* Init code and data        */

         _stext = .;

         __init_begin = .;

             *(.text.init)

         __proc_info_begin = .;

             *(.proc.info)

         __proc_info_end = .;

         __arch_info_begin = .;

             *(.arch.info)

         __arch_info_end = .;

         __tagtable_begin = .;

             *(.taglist)

         __tagtable_end = .;

             *(.data.init)

         . = ALIGN(16);

         __setup_start = .;

             *(.setup.init)

         __setup_end = .;

         __initcall_start = .;

             *(.initcall.init)

         __initcall_end = .;

         . = ALIGN(4096);

         __init_end = .;

     }

    

其中TEXTADDR就是内核启动的虚拟地址,定义在kernel/arch/arm/Makefile中:

ifeq ($(CONFIG_CPU_32),y)

PROCESSOR     = armv

TEXTADDR      = 0xC0008000

LDSCRIPT      = arch/arm/vmlinux-armv.lds.in

endif

需要注意的是这里是虚拟地址而不是物理地址。

一般情况下都在生成vmlinux后,再对内核进行压缩成为zImage,压缩的目录是kernel/arch/arm/boot。

下载到flash中的是压缩后的zImage文件,zImage是由压缩后的vmlinux和解压缩程序组成,如下图所示:

             |-----------------|/     |-----------------|

             |                  | /    |                  |

             |                  |   /   | decompress code |

             |      vmlinux      |    / |-----------------|     zImage

             |                  |     /|                  |

             |                  |      |                  |

             |                  |      |                  |    

             |                  |      |                  |

             |                  |     /|-----------------|

             |                  |    /

             |                  |   /

             |                  | /

             |-----------------|/

            

zImage链接脚本也叫做vmlinux.lds,位于kernel/arch/arm/boot/compressed。

是由同一目录下的vmlinux.lds.in文件生成的,内容如下:

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

    . = LOAD_ADDR;

    _load_addr = .;

 

    . = TEXT_START;

    _text = .;

 

    .text : {

      _start = .;

     

其中LOAD_ADDR就是zImage中解压缩代码的ram偏移地址,TEXT_START是内核ram启动的偏移地址,这个地址是物理地址。

在kernel/arch/arm/boot/Makefile文件中定义了:

ZTEXTADDR    =0

ZRELADDR      = 0xa0008000

ZTEXTADDR就是解压缩代码的ram偏移地址,ZRELADDR是内核ram启动的偏移地址,这里看到指定ZTEXTADDR的地址为0,

明显是不正确的,因为我的平台上的ram起始地址是0xa0000000,在Makefile文件中看到了对该地址设置的几行注释:

# We now have a PIC decompressor implementation.   Decompressors running

# from RAM should not define ZTEXTADDR.   Decompressors running directly

# from ROM or Flash must define ZTEXTADDR (preferably via the config)

他的意识是如果是在ram中进行解压缩时,不用指定它在ram中的运行地址,如果是在flash中就必须指定他的地址。所以

这里将ZTEXTADDR指定为0,也就是没有真正指定地址。

在kernel/arch/arm/boot/compressed/Makefile文件有一行脚本:

SEDFLAGS     = s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;s/BSS_START/$(ZBSSADDR)/

使得TEXT_START = ZTEXTADDR,LOAD_ADDR = ZRELADDR。

这样vmlinux.lds的生成过程如下:

vmlinux.lds:     vmlinux.lds.in Makefile $(TOPDIR)/arch/$(ARCH)/boot/Makefile $(TOPDIR)/.config

@sed "$(SEDFLAGS)" < vmlinux.lds.in > $@

 

以上就是我对内核启动地址的分析,总结一下内核启动地址的设置:

1、设置kernel/arch/arm/Makefile文件中的

    TEXTADDR      = 0xC0008000

    内核启动的虚拟地址

2、设置kernel/arch/arm/boot/Makefile文件中的

    ZRELADDR      = 0xa0008000

    内核启动的物理地址

    如果需要从flash中启动还需要设置

    ZTEXTADDR地址。

 

内核解压缩过程

 

内核压缩和解压缩代码都在目录kernel/arch/arm/boot/compressed,

编译完成后将产生vmlinux、head.o、misc.o、head-xscale.o、piggy.o这几个文件,

head.o是内核的头部文件,负责初始设置;

misc.o将主要负责内核的解压工作,它在head.o之后;

head-xscale.o文件主要针对Xscale的初始化,将在链接时与head.o合并;

piggy.o是一个中间文件,其实是一个压缩的内核(kernel/vmlinux),只不过没有和初始化文件及解压文件链接而已;

vmlinux是(没有--lw:zImage是压缩过的内核)压缩过的内核,就是由piggy.o、head.o、misc.o、head-xscale.o组成的。

在BootLoader完成系统的引导以后并将Linux内核调入内存之后,调用bootLinux(),

这个函数将跳转到kernel的起始位置。如果kernel没有压缩,就可以启动了。

如果kernel压缩过,则要进行解压,在压缩过的kernel头部有解压程序。

压缩过得kernel入口第一个文件源码位置在arch/arm/boot/compressed/head.S。

它将调用函数decompress_kernel(),这个函数在文件arch/arm/boot/compressed/misc.c中,

decompress_kernel()又调用proc_decomp_setup(),arch_decomp_setup()进行设置,

然后使用在打印出信息“Uncompressing Linux...”后,调用gunzip()。将内核放于指定的位置。

以下分析head.S文件:

(1)对于各种Arm CPU的DEBUG输出设定,通过定义宏来统一操作。

(2)设置kernel开始和结束地址,保存architecture ID。

(3)如果在ARM2以上的CPU中,用的是普通用户模式,则升到超级用户模式,然后关中断。

(4)分析LC0结构delta offset,判断是否需要重载内核地址(r0存入偏移量,判断r0是否为零)。

    这里是否需要重载内核地址,我以为主要分析arch/arm/boot/Makefile、arch/arm/boot/compressed/Makefile

    和arch/arm/boot/compressed/vmlinux.lds.in三个文件,主要看vmlinux.lds.in链接文件的主要段的位置,

    LOAD_ADDR(_load_addr)=0xA0008000,而对于TEXT_START(_text、_start)的位置只设为0,BSS_START(__bss_start)=ALIGN(4)。

    对于这样的结果依赖于,对内核解压的运行方式,也就是说,内核解压前是在内存(RAM)中还是在FLASH上,

    因为这里,我们的BOOTLOADER将压缩内核(zImage)移到了RAM的0xA0008000位置,我们的压缩内核是在内存(RAM)从0xA0008000地址开始顺序排列,

    因此我们的r0获得的偏移量是载入地址(0xA0008000)。接下来的工作是要把内核镜像的相对地址转化为内存的物理地址,即重载内核地址。

(5)需要重载内核地址,将r0的偏移量加到BSS region和GOT table中。

(6)清空bss堆栈空间r2-r3。

(7)建立C程序运行需要的缓存,并赋于64K的栈空间。

(8)这时r2是缓存的结束地址,r4是kernel的最后执行地址,r5是kernel境象文件的开始地址。检查是否地址有冲突。

    将r5等于r2,使decompress后的kernel地址就在64K的栈之后。

(9)调用文件misc.c的函数decompress_kernel(),解压内核于缓存结束的地方(r2地址之后)。此时各寄存器值有如下变化:

    r0为解压后kernel的大小

    r4为kernel执行时的地址

    r5为解压后kernel的起始地址

    r6为CPU类型值(processor ID)

    r7为系统类型值(architecture ID)

(10)将reloc_start代码拷贝之kernel之后(r5+r0之后),首先清除缓存,而后执行reloc_start。

(11)reloc_start将r5开始的kernel重载于r4地址处。

(12)清除cache内容,关闭cache,将r7中architecture ID赋于r1,执行r4开始的kernel代码。

下面简单介绍一下解压缩过程,也就是函数decompress_kernel实现的功能:

解压缩代码位于kernel/lib/inflate.c,inflate.c是从gzip源程序中分离出来的。包含了一些对全局数据的直接引用。

在使用时需要直接嵌入到代码中。gzip压缩文件时总是在前32K字节的范围内寻找重复的字符串进行编码,

在解压时需要一个至少为32K字节的解压缓冲区,它定义为window[WSIZE]。inflate.c使用get_byte()读取输入文件,

它被定义成宏来提高效率。输入缓冲区指针必须定义为inptr,inflate.c中对之有减量操作。inflate.c调用flush_window()

来输出window缓冲区中的解压出的字节串,每次输出长度用outcnt变量表示。在flush_window()中,还必

须对输出字节串计算CRC并且刷新crc变量。在调用gunzip()开始解压之前,调用makecrc()初始化CRC计算表。

最后gunzip()返回0表示解压成功。

我们在内核启动的开始都会看到这样的输出:

Uncompressing Linux...done, booting the kernel.

这也是由decompress_kernel函数内部输出的,它调用了puts()输出字符串,

puts是在kernel/include/asm-arm/arch-pxa/uncompress.h中实现的。

执行完解压过程,再返回到head.S中,启动内核:

call_kernel:     bl   cache_clean_flush

          bl   cache_off

          mov r0, #0

          mov r1, r7           @ restore architecture number

          mov pc, r4           @ call kernel

         

下面就开始真正的内核了。

汇编部分(1)

在网上参考很多高手的文章,又加入了自己的一点儿内容,整理了一下,里面还有很多不明白的地方,而且也会有理解错误的地方,望高手指点,自己也会不断进行修改

当进入linux内核后,arch/arm/kernel/head-armv.S是内核最先执行的一个文件,包括从内核入口ENTRY(stext)到

start_kernel之间的初始化代码,下面以我所是用的平台intel pxa270为例,说明一下他的汇编代码:

1     .section ".text.init",#alloc,#execinstr

2     .type    stext, #function

/* 内核入口点 */

3 ENTRY(stext)

4     mov r12, r0

/* 程序状态,禁止FIQ、IRQ,设定SVC模式 */    

5      mov r0, #F_BIT | I_BIT | MODE_SVC    @ make sure svc mode

6     msr cpsr_c, r0           @ and all irqs disabled

/* 判断CPU类型,查找运行的CPU ID值与Linux编译支持的ID值是否支持 */

7     bl   __lookup_processor_type

/* 判断如果r10的值为0,则表示函数执行错误,跳转到出错处理,*/

/* 出错处理函数__error的实现代码定义在debug-armv.S中,这里就不再作过多介绍了 */

8     teq r10, #0              @ invalid processor?

9     moveq    r0, #'p'             @ yes, error 'p'

10    beq __error

/* 判断体系类型,查看R1寄存器的Architecture Type值是否支持 */

11    bl   __lookup_architecture_type

/* 判断如果r7的值为0,则表示函数执行错误,跳转到出错处理,*/

12    teq r7, #0               @ invalid architecture?

13    moveq    r0, #'a'             @ yes, error 'a'

14    beq __error

/* 创建核心页表 */

15    bl   __create_page_tables

16    adr lr, __ret            @ return address

17    add pc, r10, #12             @ initialise processor

                               @ (return control reg)

                              

第5行,准备进入SVC工作模式,同时关闭中断(I_BIT)和快速中断(F_BIT)

第7行,查看处理器类型,主要是为了得到处理器的ID以及页表的flags。

第11行,查看一些体系结构的信息。

第15行,建立页表。

第17行,跳转到处理器的初始化函数,其函数地址是从__lookup_processor_type中得到的,

需要注意的是第16行,当处理器初始化完成后,会直接跳转到__ret去执行,

这是由于初始化函数最后的语句是mov pc, lr。

http://hi.baidu.com/anorchidwith/blog/item/cac6e30903fca5266a60fb1f.html 
SillyTavern角色卡制作全攻略:如何用AI还原你喜欢的虚构角色(附三叶完整角色卡JSON) 本文详细介绍了如何使用SillyTavern制作高质量AI角色卡,以《你的名字》中的宫水三叶为例,从角色特征提取、对话风格捕捉到JSON结构优化,全面解析AI角色扮演的创作技巧。通过具体的写作示例和完整角色卡JSON,帮助二次元爱好者和同人创作者实现虚构角色的精准还原与生动互动。 阅读详情

相关推荐

DDS信号发生器设计避坑指南:从AD9834配置到巴特沃斯滤波实战

本文详细解析了基于AD9834芯片的DDS信号发生器设计中的关键技术要点与常见陷阱,涵盖时钟源选择、寄存器配置时序、巴特沃斯滤波器设计等核心内容。针对中高频段信号质量优化,提供了实用的解决方案和代码示例,帮助工程师规避设计误区,提升信号发生器的性能和稳定性。

2y3u4i5o6p的博客 782

Linux2.6.38内核启动流程分析

Linux 启动的第一阶段 Uboot最后带着三个参数跳转到内核入口这三个参数分别是: r0 = 0, r1 = machine type number discovered in (3) above. r2 = physical address of tagged list in system RAM. Linux运行的第一个文件是 arch/arm/boot/compress

玩意儿的专栏 1026

UVM(5)-TLM通信

TLM是一种基于事务 (transaction) 的通信方式,通常在高抽象级语言例如SystemC或者SV/UVM中作为模块之间的通讯方式。

2301_76431006的博客 2106

Linux系统启动过程分析

经过对Linux系统有了一定了解和熟悉后,想对其更深层次的东西做进一步探究。这当中就包括系统的启动流程、文件系统的组成结构、基于动态库和静态库的程序在执行时的异同、协议栈的架构和原理、驱动程序的机制等等。 本人在综合了现有网上大家智慧的基础上,结合对2.6.32的内核代码的研读,基于CentOS 6.0系统对Linux的启动流程做了些分析。由于才疏学浅,知...

weixin_30940783的博客 527

Linux系统下Materials Studio 2020安装避坑指南:从依赖包到许可证配置全流程

本文提供了一份在Linux系统上安装Materials Studio 2020的深度避坑指南。详细解析了从系统依赖包检查、安装流程、许可证配置到Gateway服务部署的全过程,并分享了与Slurm作业调度系统集成的实战经验,旨在帮助用户高效、稳定地完成部署。

weixin_29313547的博客 387

C#与YOLOv8工业缺陷检测实战:从算法到PLC集成的工程化落地

目标检测作为计算机视觉的核心任务,其原理是通过深度学习模型在图像中定位并识别物体。这项技术的关键价值在于将AI的感知能力转化为实际生产力,尤其在工业自动化领域,它能实现高效、精准的视觉检测。在工业缺陷检测这一典型应用场景中,稳定性和实时性是核心挑战。本文聚焦于如何将YOLOv8这一先进的目标检测模型,与C#上位机开发及工业相机硬件深度集成,构建一个能够7x24小时稳定运行的智能检测系统。文章深入探讨了从模型训练、ONNX部署,到与PLC通信联调的完整工程化路径,并针对工业环境中常见的稳定性、性能及调试问题提

weixin_33508411的博客 236

Linux2.6内核启动流程

Linux内核构成 1 arch/arm/boot/compressed/Makefile   arch/arm/boot/compressed/vmlinux.lds 2. arch/arm/kernel/vmlinux.lds     Linux内核启动流程 arch/arm/boot/compressed/start.S   Start:                 .

xxx 440

【毫米波混合波束成形】第3章 深度展开网络:将迭代优化嵌入计算图

相位提取算子 $P_\phi: \mathbb{C}^N \to \mathbb{C}^N$ 定义为逐元素相位归一化 $P_\phi(z) = \exp(j \cdot \angle z)$。该算子在复数域非全纯(Non-holomorphic),标准反向传播需扩展至Wirtinger微积分框架。对于复数变量 $z = x + jy$,Wirtinger导数定义:相位提取算子的Jacobian矩阵在极坐标下具有稀疏结构。

VectorShift的博客 407

linux系统启动流程

PC:OS(Linux)POST--&gt;BIOS(BootSequence)--&gt;MBR(bootloader,446)--&gt;Kernel--&gt;initrd--&gt;(ROOTFS)/sbin/init(/etc/inittab)内核设计风格:RedHat,SUSE核心::动态加载内核模块内核:/lib/modules/内核版本号命名的目录/vmlinuz-2.6.32/l...

yongchaocsdn的博客 438

MinerU 本地部署完整指南:从零构建你的私有文档智能处理系统

摘要: MinerU是一款开源本地化文档解析工具,可将PDF、Word等文件智能转换为结构化Markdown,保留表格、公式、图片等元素。其核心优势包括: 隐私安全:完全离线处理,避免云端数据泄露风险; 高精度解析:基于深度学习还原文档逻辑结构,支持多格式输入; 易集成:提供RESTful API,适合金融、医疗等敏感场景。部署需Python 3.9+环境,支持CPU/GPU运行,推荐配置16GB内存及NVIDIA显卡。通过命令行或Docker即可快速启动,适用于知识库构建、RAG系统预处理等。

reset2021的博客 752

Yolov8-pose关键点检测:loss优化 | LRM loss困难样本挖掘,提升难样本、遮挡物等检测精度

LRM loss应用到能够大幅提升pose遮挡物性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1716

linux 2.6内核镜像,Linux2.6内核镜像的构建过程

make menuconfig:修改、添加内核配置选项,最后生成.config配置文件。make all:首先编译.config得到没有压缩的内核核心vmlinux,然后将其压缩生成引导过程使用的内核镜像bzImage,最后编译内核选项中相关的module。 压缩过程:首先对vmlinux瘦身(即用objcopy命令删除注释得到vmlinux.bin)并压缩(即用gzip命令压缩vm...

weixin_36178269的博客 315

落地实战!Python构建地方政府公开数据爬虫:政策/数据/规划全维度抓取(附反爬适配+数据清洗)

政务公开数据爬虫的核心不是“技术多先进”,而是“适配政务网站的特性”——慢一点、稳一点、合规一点,比追求抓取速度更重要。多地市爬虫集群:通过配置文件管理不同地市的URL规则,实现全省/全国政务数据抓取;图片表格识别:结合OCR工具(如pytesseract)识别政务网站的图片表格,转换为结构化数据;数据可视化:将抓取的统计数据导入PowerBI/Matplotlib,实现区域发展趋势分析。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1802

Linux 2.6启动流程分析(结合开机log分析)

关于Linux启动流程的分析,以kernel 2.6.35.7为背景进行分析。 一、head.S(arch/arm/kernel) ENTRY(stext):   1. 设置CPSR:CPU为SVC模式,禁止IRQ和FIQ;   2. 从cp15读得cpuid;   3. __lookup_processor_type:在.proc.info.init段中搜索与cpuid一致的p...

Lucifer.Zhu的博客 2247

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

嵌入式linux2.6启动流程分析

Linux内核构成1 arch/arm/boot/compressed/Makefile   arch/arm/boot/compressed/vmlinux.lds2. arch/arm/kernel/vmlinux.ldsLinux内核启动流程arch/arm/boot/compressed/start.SStart:                .type   start,#function                .rept   8                mov     r0, r0

glorin的专栏 4100

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux2.6.35.7内核启动流程分析

S3C2410 Linux 2.6.35.7启动分析 1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试信息、符号表的最初的内核,大小约23MB;  命令:arm-linux-gnu-ld -o vmlinux -T arch/arm/kernel/vmlinux.lds   arch/a

michaelcao1980的专栏 3834

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

linux 内核2.6.35.3,Linux2.6.35.7内核启动流程分析

S3C2410Linux2.6.35.7启动分析1.依据arch/arm/kernel/vmlinux.lds生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试信息、符号表的最初的内核,大小约23MB;命令:arm-linux-gnu-ld-ovmlinux-Tarch/arm/kernel/vmlinux.ldsarch/arm/kernel/hea...

weixin_39686634的博客 227

linux2.6内核源代码分析,linux-2.6.22.6内核启动流程分析之配置

配置过程最终结果是生成.config文件,我们想要对配置的目的有很清楚的了解,必须先对.config文件进行分析。通过cd命令切换到linux-2.6.22.6内核目录,输入vi .config可以看到如下图所示内容(截图仅部分内容):分析.config文件被什么文件使用,为了简便化我们以网卡DM9000配置项为例进行分析。首先要在.config文件内找到关于DM9000相应配置,vi编辑器环境下...

weixin_39529903的博客 346

linux-2.6.22.6分析(二)启动流程之第一阶段

内核的启动也可以分为两个阶段 第一阶段是用汇编写的,主要是判断是否支持CPU、单板、创建页表等 第二阶段是用C语言写的,主要是处理u-boot传递的参数,挂接根文件系统,调用应用程序等 本节简要分析启动流程的第一阶段,代码是内核链接的第一个文件arch/arm/kernel/head.S 1、判断内核是否支持cpu mrc p15, 0, r9, c0, c0 @ get p...

floatinglong的博客 454

linux-2.6.22.6分析(三)启动流程之第二阶段

内核启动第二阶段的start_kernel函数位于init/main.c 1、处理u-boot传入的启动参数(含命令行参数) 命令行参数会被提取出来,保存到一个个结构体中,这在文末提及 setup_arch(&command_line); setup_command_line(command_line); 2、挂接根文件系统并调用应用程序(逐级缩进表示逐级调用) ...

floatinglong的博客 383

编译内核之启动流程分析

源码配置编译: 本文主要是针对linux-2.6.22.6来进行配置编译和源码的分析,这里韦老师已经做好补丁文件和配置文件,直接在此基础上进行配置编译 解压缩 tar xjf 压缩文件 打补丁 patch -p1 <补丁文件 (这里韦老师已经为我们做好了补丁文件) 配置 linux有两...

qq_35547417的博客 759

【嵌入式Linux学习七步曲之第四篇 Linux内核移植】PPC Linux启动流程分析

 PPC Linux启动流程分析Sailor_forever  sailing_9806#163.com 转载请注明http://blog.csdn.net/sailor_8318/archive/2009/11/22/4853319.aspx【摘要】本文分析了MPC8270在Linux2.6.19下的启动流程。介绍了压缩内核的链接脚本、映像生成的过程、压缩内核如何重定位解

Sailor_forever 7681

linux2.6 和 unix-v6 源码实验

你可以通过实现 Linux 2.6.x 的源码级图形调试,能看到源码、变量、寄存器,非常适合研究内核启动过程。同理,可以编译 unix-v6 (https://github.com/mit-pdos/xv6-public.git)以下是使用xv6‑public(xv6 的 x86 版本)在 Ubuntu/Linux 上安装、编译、运行、调试的详细中文指南。如果你想使用 RISC‑V 版本(xv6‑riscv),后续内容里也有说明。面向 Intel x86 架构,使用 ELF 格式。

is0815的博客 1343

linux2.6.29 启动过程详细分析

linux2.6.29 启动过程详细分析    突然心血来潮,想自己写个模块,于是就把linux2.6.29的启动过程有分析了一下,整理出来和大家分享下。 linux的启动大体上可以分几个步骤: 第一部分 grub部分,内核的加载过程。 这里总结一下别人的思想,因为自己没怎么看过grub的源码。 1. Bios执行int 0x19,加载MBR至0x7c00并跳转执行,

prownd的专栏 546
上一篇: Linux系统引导过程详解
下一篇: arm 嵌入式LINUX启动过程(1)
menuconfig
博客等级 码龄19年 713粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值