当前位置: 首页 > news >正文

高端网站建设文案企业型网站建设方案

高端网站建设文案,企业型网站建设方案,海口网页设计公司排名,公众出行服务网站建设当U-Boot将设备树加载到内存指定位置后#xff0c;ARM内核的SoC以通用寄存器r2来传递dtb在内存中的地址。kernel获取到该地址后对dtb文件做进一步的处理。#设备树的传递当使用bootm加载kernel镜像时#xff08;bootz是对bootm的一种封装以及功能扩展#xff0c;实质一样ARM内核的SoC以通用寄存器r2来传递dtb在内存中的地址。kernel获取到该地址后对dtb文件做进一步的处理。#设备树的传递当使用bootm加载kernel镜像时bootz是对bootm的一种封装以及功能扩展实质一样。U-Boot跳转到kernel的入口函数是boot_jump_linux这个函数的C文件在arch/arm/lib下说明设备树的传递的方式是与SoC架构相关的。不同的SoC在bring-up时这个函数格外重要这是U-Boot与kernel之间衔接、交互信息的一个关键API。U-Boot的这个函数执行结束后将CPU的控制权完整的交给kernel。/* Subcommand: GO */ static void boot_jump_linux(bootm_headers_t *images, int flag) { ...debug(## Transferring control to Linux (at address %08lx) \...\n, (ulong) kernel_entry);bootstage_mark(BOOTSTAGE_ID_RUN_OS);announce_and_cleanup(fake);if (IMAGE_ENABLE_OF_LIBFDT images-ft_len)r2 (unsigned long)images-ft_addr;elser2  gd-bd-bi_boot_params; ... } r2作为存放设备树地址的寄存器其取值有两种方式分别是例化bootm_header_t这个数据结构的ft_addr以及利用U-Boot的板级启动参数作为设备树的地址。##bootm_header_t方式数据结构bootm_header_t的定义如下供各种内核的SoC使用每家厂商根据自己CPU的特点对各个成员进行不同的例化。/** Legacy and FIT format headers used by do_bootm() and do_bootm_os()* routines.*/ typedef struct bootm_headers {...char *ft_addr; /* flat dev tree address */ulong ft_len; /* length of flat device tree */... } bootm_headers_t; 用bootm_header_t的方式U-Boot需支持设备树以及文件非空。ft_len以及ft_addr属于bootm_header_t在U-Boot解析镜像文件时实例化这两个成员。函数调用栈如下do_bootz(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) -bootz_start() --bootm_find_images(int flag, int argc, char *const argv[], ulong start,ulong size) ---boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, images,images.ft_addr, images.ft_len);u-boot-v2021.04/common/image-fdt.c ##gd-bd-bi_boot_params方式这种属于比较古老的一种方式了目前基本不会采用。bi_boot_params是一个存放内核启动参数的地址通常是在板级初始化中进行指定。代码执行到此处r2是否为预期的值一是可以通过打印的方式、再有使用调试工具连上去确认。#kernel对设备树的解析解析分两个阶段第一阶段进行校验以及启动参数的再调整第二阶段完成设备树的解压也就是将设备树由FDT变成EDT创建device_node。##第一阶段kernel启动日志中与设备树相关的第一条打印如下也就是打印出当前硬件设备的模型名OF: fdt: Machine model: V2P-CA9Booting Linux on physical CPU 0x0 Linux version 5.4.124 (qemuqemu) (gcc version 6.5.0 (Linaro GCC 6.5-2018.12)) #3 SMP Fri Jun 25 15:26:02 CST 2021 CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr10c5387d CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache OF: fdt: Machine model: V2P-CA9 这个模型名是在设备树文件的头部定义的定义当前设备的总体名称。// SPDX-License-Identifier: GPL-2.0 /** ARM Ltd. Versatile Express** CoreTile Express A9x4* Cortex-A9 MPCore (V2P-CA9)** HBI-0191B*//dts-v1/; #include vexpress-v2m.dtsi/ {model V2P-CA9;...} 但这并不是kernel对设备树第一次进行处理的地方。在此之前已有其他的操作。函数调用栈如下setup_arch(char **cmdline_p) arch/arm/kernel/setup.catags_vaddr FDT_VIRT_BASE(__atags_pointer); setup_machine_fdt(void *dt_virt) arch/arm/kernel/devtree.cearly_init_dt_verify()of_flat_dt_match_machine() drivers/of/fdt.cearly_init_dt_scan_nodes();__machine_arch_type  mdesc-nr; 第2行__atags_pointer是dtb在内存中的地址这个地址在汇编阶段若镜像为zImage那么在解压缩阶段就完成了便获取到了。由于执行到setup_arch时mmu已经使能并且4K的段页表也已经完成了映射而U-Boot传递给kernel的设备树fdt地址属于物理地址因此需要将物理地址转换成虚拟地址。 head-common.S.align 2.type __mmap_switched_data, %object __mmap_switched_data: #ifdef CONFIG_XIP_KERNEL #ifndef CONFIG_XIP_DEFLATED_DATA.long _sdata r0.long __data_loc r1.long _edata_loc r2 #endif.long __bss_stop sp (temporary stack in .bss) #endif.long __bss_start r0.long __bss_stop r1.long init_thread_union THREAD_START_SP sp.long processor_id r0.long __machine_arch_type r1.long __atags_pointer r2 第一阶段对设备树的配置主要包括A 对dtb文件进行crc32校验检测设备树文件是否合法early_init_dt_verify() B early_init_dt_scan_nodes()/* Retrieve various information from the /chosen node */of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);/* Initialize {size,address}-cells info */of_scan_flat_dt(early_init_dt_scan_root, NULL);/* Setup memory, calling early_init_dt_add_memory_arch */of_scan_flat_dt(early_init_dt_scan_memory, NULL); C 更新__machine_arch_type D 更新chosen 上面这个chosen信息可以在kernel起来后再次查看做了哪些修改。##第二阶段第二阶段单纯的是将设备树ABI文件进行解压缩由FDT变成EDT生成相应的device_node结点。这个阶段的函数调用栈如下unflatten_device_tree();*__unflatten_device_tree()/* First pass, scan for size */size unflatten_dt_nodes(blob, NULL, dad, NULL);/* Second pass, do actual unflattening */unflatten_dt_nodes(blob, mem, dad, mynodes);unflatten_dt_nodes()populate_node() device_nodes结点如下device_node创建完成后kernel创建platform_device时依据这个阶段完成的工作情况进行对应的设备注册供驱动代码使用。------END------推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~嵌入式Linux微信扫描二维码关注我的公众号
http://www.pierceye.com/news/440621/

相关文章:

  • 网站开发转行进入衍生领域wordpress qaengine
  • 公司内部网站模板快速建网站的软件
  • 被骗去国外做网站网站推广网站的运营推广方案
  • 北京汽车业务网站开发公司桂林旅游攻略必去景点
  • 个人网站开发是学什么语言wordpress打造cms
  • 网站建设与维护的重要性岳阳建设厅网站
  • 惠州网站开发公司wordpress简单
  • 外贸网站 免费模板 使用 zencart如何购买域名和备案
  • 网站建设联系我们设计网站无锡
  • 深圳做网站好的公司wordpress建菜单
  • 网站编辑需要的技能做网站需要什么域名
  • 营销型网站建设目的和意义网站托管方案
  • 网站感谢页面企业标志图片大全
  • 响应式网站建设必推全网天下邵阳竞价网站建设设计
  • 大连网站如何制作辽阳公司做网站
  • 百度站长怎么验证网站jekyll做公司网站
  • 电子商务公司建设网站方案设计网站建设开发背景
  • 同一产品做多个网站山西省住房和城乡建设厅官网
  • 网站建设的流程是什么意思微信小程序的代码
  • 广州网站整站优化html项目案例实战
  • 宁波网站推广方式seo优化按天扣费
  • 紫金优化网站制作python编程100例
  • 原阳网站建设哪家好域名网址
  • 西安学校网站建设wordpress手机端模板下载
  • 泉州网站建设工作室网站上的产品板块
  • 平顶山网站网站建设网页设计与制作教程 刘瑞信 pdf
  • 网站开发深天津设计公司排行榜
  • 做tcf法语听力题的网站公司网页简介
  • 十堰做网站最专业的公司深圳企业网查询
  • 购物网站大全排名调查drupal与wordpress哪个容易