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

网站框架设计理念apache重定向wordpress

网站框架设计理念,apache重定向wordpress,成品免费观看网站,大淘客做网站一、start_armboot 解析6 1、console_init_f (1) console_init_f 是 console#xff08;控制台#xff09;的第一阶段初始化。_f 表示是第一阶段初始化#xff0c;_r 表示第二阶段初始化。有时候初始化函数不能一次一起完成#xff0c;中间必须要夹杂一些代码#xff0c;…一、start_armboot 解析6 1、console_init_f (1) console_init_f 是 console控制台的第一阶段初始化。_f 表示是第一阶段初始化_r 表示第二阶段初始化。有时候初始化函数不能一次一起完成中间必须要夹杂一些代码因此将完整的一个模块的初始化分成了 2 个阶段。我们的 uboot 中 start_armboot 的 826 行进行了 console_init_r 的初始化 (2) console_init_f 在 uboot/common/console.c 中仅仅是对 gd-have_console 设置为 1 而已其他事情都没做。 2、display_banner (1) display_banner 用来串口输出显示 uboot 的 logo。 (2) display_banner 中使用 printf 函数向串口输出了 version_string 这个字符串。那么上面的分析表示 console_init_f 并没有初始化好 console 怎么就可以 printf 了呢 (3) 通过追踪 printf 的实现发现 printf-puts而 puts 函数中会判断当前 uboot 中 console 有没有被初始化好。 如果 console 初始化好了则调用 fputs 完成串口发送这条线才是控制台如果 console 尚未初始化好则会调用 serial_puts (再调用 serial_putc 直接操作串口寄存器进行内容发送)。 (4) 控制台也是通过串口输出非控制台也是通过串口输出。究竟什么是控制台和不用控制台的区别 实际上分析代码会发现控制台就是一个用软件虚拟出来的设备这个设备有一套专用的通信函数发送、接收···控制台的通信函数最终会映射到硬件的通信函数中来实现。uboot 中实际上控制台的通信函数是直接映射到硬件串口的通信函数中的也就是说 uboot 中用没用控制台其实并没有本质差别。 (5) 但是在别的体系中控制台的通信函数映射到硬件通信函数时可以用软件来做一些中间优化譬如说缓冲机制。操作系统中的控制台都使用了缓冲机制所以有时候我们 printf 了内容但是屏幕上并没有看到输出信息就是因为被缓冲了。我们输出的信息只是到了 console 的 buffer 中buffer 还没有被刷新到硬件输出设备上尤其是在输出设备是LCD屏幕时 (6) U_BOOT_VERSION 在 uboot 源代码中找不到定义这个变量实际上是在 makefile 中定义的然后在编译时生成的 include/version_autogenerated.h 中用一个宏定义来实现的。 3、print_cpuinfo (1) uboot启动过程中 CPU: S5PV2101000MHz(OK)APLL 1000MHz, HclkMsys 200MHz, PclkMsys 100MHzMPLL 667MHz, EPLL 96MHzHclkDsys 166MHz, PclkDsys 83MHzHclkPsys 133MHz, PclkPsys 66MHzSCLKA2M 200MHz Serial CLKUART 这些信息都是 print_cpuinfo 打印出来的。 (2) 回顾 ARM 裸机中时钟配置一章的内容比对这里调用的函数中计算各种时钟的方法自己去慢慢分析体会这些代码的原理和实现方法。 二、start_armboot 解析7 1、checkboard (1) checkboard 看名字是检查、确认开发板的意思。这个函数的作用就是检查当前开发板是哪个开发板并且打印出开发板的名字。 2、init_func_i2c (1) 这个函数实际没有被执行X210 的 uboot 中并没有使用 I2C。如果将来我们的开发板要扩展 I2C 来接外接硬件则在 x210_sd.h 中配置相应的宏即可开启。 3、uboot 学习实践 (1) 对 uboot 源代码进行完修改修改内容根据自己的理解和分析来修改 (2) make distclean 然后 make x210_sd_config 然后 make。 make distclean make x210_sd_config make -j8(3) 编译完成得到 u-boot.bin然后去烧录。烧录方法按照 x210 刷机教程 讲的 linux 下使用 dd 命令来烧写的方法来烧写。 (4) 在 uboot_jiuding 文件夹下就有 sd_fusing 烧录所需的文件。 注意由于这个路径的文件是被九鼎官方编译过的里面的文件是 64 bit 格式的而我们的 linux 系统是 32 bit 所以必须先make clean 清除后重新编译生成文件。 烧写过程 第一步进入 sd_fusing 目录下 第二步make clean 第三步make 第四步插入 SD 卡ls /dev/sd* 得到 SD 卡在 ubuntu 中的设备号一般是/dev/sdb注意 SD 卡要连接到虚拟机 ubuntu 中不要接到 windows 中 注意我们的 sd_fusing.sh 文件就是写的 /dev/sdb 如有需要可以自行更改。 第五步修改 sd_fusing.sh 文件u-boot.bin. ./sd_fusing.sh /dev/sdb 完成烧录注意不是 sd_fusing2.sh。 (5) 总结uboot 就是个庞大点复杂点的裸机程序而已我们完全可以对他进行调试。调试的方法就是按照上面步骤根据自己对代码的分析和理解对代码进行更改然后重新编译烧录运行根据运行结果来学习。 修改效果成功 三、start_armboot 解析8 1、dram_init (1) dram_init 看名字是关于 DDR 的初始化。疑问在汇编阶段已经初始化过 DDR 了否则也无法 relocate 到这里的第二部分运行怎么在这里又初始化 DDR (2) dram_init 都是在给 gd-bd 里面关于 DDR 配置部分的全局变量赋值让 gd-bd 数据记录下当前开发板的 DDR 的配置信息以便uboot中使用内存。 (3) 从代码来看其实就是初始化 gd-bd-bi_dram 这个结构体数组。 2、display_dram_config (1) 看名字意思就是打印显示 dram 的配置信息。 (2) 启动信息中的DRAM: 512 MB 就是在这个函数中打印出来的。 uboot bdinfo 命令 思考如何在 uboot 运行中得知 uboot 的 DDR 配置信息uboot 中有一个命令叫 bdinfo 这个命令可以打印出 gd-bd 中记录的所有硬件相关的全局变量的值因此可以得知 DDR 的配置信息。 DRAM bank 0x00000000 - start 0x30000000 - size 0x10000000 DRAM bank 0x00000001 - start 0x40000000 - size 0x100000003、init_sequence总结 (1) 都是板级硬件的初始化以及 gd、gd-bd 中的数据结构的初始化。譬如 网卡初始化、机器码gd-bd-bi_arch_number、内核传参 DDR 地址gd-bd-bi_boot_params、Timer4 初始化为 10ms 一次、波特率设置gd-bd-bi_baudrate和gd-baudrate、console 第一阶段初始化gd-have_console 设置为 1 、打印uboot 的启动信息、打印 cpu 相关设置信息、检查并打印当前开发板名字、DDR 配置信息初始化gd-bd-bi_dram、打印 DDR 总容量。 四、start_armboot 解析9 1、CFG_NO_FLASH (1) 虽然 NandFlash 和 NorFlash 都是 Flash但是一般 NandFlash 会简称为 Nand 而不是 Flash一般讲 Flash 都是指的 Norflash。这里的 2 行代码是 Norflash 相关的。 (2) flash_init 执行的是开发板中对应的 NorFlash 的初始化、display_flash_config 打印的也是 NorFlash 的配置信息Flash: 8 MB 就是这里打印出来的。但是实际上 X210 中是没有 Norflash 的。所以这两行代码是可以去掉的我也不知道为什么没去掉猜测原因有可能是去掉这两行代码会导致别的地方工作不正常需要花时间去移植调试然后移植的人就懒得弄。实际上不去掉除了显示有 8MB Flash 实际没用之外也没有别的影响 CONFIG_VFD 和 CONFIG_LCD 是显示相关的这个是 uboot 中自带的 LCD 显示的软件架构。但是实际上我们用 LCD 而没有使用 uboot 中设置的这套软件架构我们自己在后面自己添加了一个 LCD 显示的部分。 2、mem_malloc_init (1) mem_malloc_init 函数用来初始化 uboot 的堆管理器。 (2) uboot 中自己维护了一段堆内存肯定自己就有一套代码来管理这个堆内存。有了这些东西 uboot 中你也可以 malloc、free 这套机制来申请内存和释放内存。我们在 DDR 内存中给堆预留了 896KB 的内存。 3、代码实践去掉 Flash 看会不会出错。 结论加上CONFIG_NOFLASH 宏之后编译出错说明代码移植的不好那个文件的包含没有被这个宏控制。于是乎移植的人就直接放这没管。 五、start_armboot 解析10 1、开发板独有初始化mmc 初始化 (1) 从536 到 768 行是开发板独有的初始化。意思是三星用一套 uboot 同时满足了好多个系列型号的开发板然后在这里把不同开发板自己独有的一些初始化写到了这里。用 #if 条件编译配合 CONFIG_xxx 宏来选定特定的开发板。 (2) X210 相关的配置在 599 行到 632 行。 (3) mmc_initialize 看名字就应该是 MMC 相关的一些基础的初始化其实就是用来初始化 SoC 内部的 SD/MMC 控制器的。函数在 uboot/drivers/mmc/mmc.c 里。 (4) uboot 中对硬件的操作譬如网卡、SD 卡···都是借用的 linux 内核中的驱动来实现的uboot 根目录底下有个 drivers 文件夹这里面放的全都是从 linux 内核中移植过来的各种驱动源文件。 (5) mmc_initialize 是具体硬件架构无关的一个 MMC 初始化函数所有的使用了这套架构的代码都调用这个函数来完成 MMC 的初始化。mmc_initialize 中再调用 board_mmc_init 和 cpu_mmc_init 来完成具体的硬件的 MMC 控制器初始化工作。 (6) cpu_mmc_init 在 uboot/cpu/s5pc11x/cpu.c 中这里面又间接的调用了 drivers/mmc/s3c_mmcxxx.c 中的驱动代码来初始化硬件 MMC 控制器。这里面分层很多分层的思想一定要有否则完全就糊涂了。 六、start_armboot 解析11 1、env_relocate (1) env_relocate 是环境变量的重定位完成从 SD 卡中将环境变量读取到 DDR 中的任务。 (2) 环境变量到底从哪里来SD 卡中有一些8个独立的扇区作为环境变量存储区域的。但是我们烧录/部署系统时我们只是烧录了 uboot 分区、kernel 分区和 rootfs 分区根本不曾烧录 env 分区。 所以当我们烧录完系统第一次启动时 ENV 分区是空的本次启动 uboot 尝试去 SD 卡的 ENV 分区读取环境变量时失败读取回来后进行 CRC 校验时失败我们 uboot 选择从 uboot 内部代码中设置的一套默认的环境变量出发来使用这就是默认环境变量。 这套默认的环境变量在本次运行时会被读取到 DDR 中的环境变量中然后被写入也可能是你saveenv时写入也可能是uboot设计了第一次读取默认环境变量后就写入SD 卡的 ENV 分区。然后下次再次开机时uboot 就会从 SD 卡的 ENV 分区读取环境变量到 DDR 中这次读取就不会失败了。 (3) 真正的从 SD 卡到 DDR 中重定位 ENV 的代码是在 env_relocate_spec 内部的 movi_read_env 完成的。 七、start_armboot 解析12 1、IP地址、MAC地址的确定 (1) 开发板的 IP 地址是在 gd-bd 中维护的来源于环境变量 ipaddr。 getenv 函数用来获取字符串格式的 IP 地址然后用 string_to_ip 将字符串格式的 IP 地址转成字符串格式的点分十进制格式。 (2) IP 地址由 4 个 0-255 之间的数字组成因此一个 IP 地址在程序中最简单的存储方法就是一个 unsigend int 。但是人类容易看懂的并不是这种类型而是点分十进制类型192.168.1.2。这两种类型可以互相转换。 2、devices_init (1) devices_init 看名字就是设备的初始化。这里的设备指的就是开发板上的硬件设备。放在这里初始化的设备都是驱动设备这个函数本来就是从驱动框架中衍生出来的。uboot 中很多设备的驱动是直接移植 linux 内核的譬如网卡、SD卡linux 内核中的驱动都有相应的设备初始化函数。linux 内核在启动过程中就有一个 devices_init (名字不一定完全对但是差不多)作用就是集中执行各种硬件驱动的 init 函数。 (2) uboot 的这个函数其实就是从 linux 内核中移植过来的它的作用也是去执行所有的从 linux 内核中继承来的那些硬件驱动的初始化函数。 3、jumptable_init (1) jumptable 跳转表本身是一个函数指针数组里面记录了很多函数的函数名。看这阵势是要实现一个函数指针到具体函数的映射关系将来通过跳转表中的函数指针就可以执行具体的函数。这个其实就是在用 C 语言实现面向对象编程。在 linux 内核中有很多这种技巧。 (2) 通过分析发现跳转表只是被赋值从未被引用因此跳转表在 uboot 中根本就没使用。 八、start_armboot 解析13 1、console_init_r (1) console_init_f 是控制台的第一阶段初始化console_init_r 是第二阶段初始化。实际上第一阶段初始化并没有实质性工作第二阶段初始化才进行了实质性工作 。 (2) console_init_r 就是 console 的纯软件架构方面的初始化说白了就是去给 console 相关的数据结构中填充相应的值所以属于纯软件配置类型的初始化。 (4) uboot 的 console 实际上并没有干有意义的转化它就是直接调用的串口通信的函数。所以用不用 console 实际并没有什么分别。在 linux 内 console 就可以提供缓冲机制等不用 console 不能实现的东西。 2、enable_interrupts (1) 看名字应该是中断初始化代码。这里指的是 CPSR 中总中断标志位的使能。 (2) 因为我们 uboot 中没有使用中断因此没有定义 CONFIG_USE_IRQ 宏因此我们这里这个函数是个空壳子。 (3) uboot 中经常出现一种情况就是根据一个宏是否定义了来条件编译决定是否调用一个函数内部的代码。uboot 中有 2 种解决方案来处理这种情况方案一在调用函数处使用条件编译然后函数体实际完全提供代码。方案二在调用函数处直接调用然后在函数体处提供 2 个函数体一个是有实体的一个是空壳子用宏定义条件编译来决定实际编译时编译哪个函数进去。 3、loadaddr、bootfile 两个环境变量 (1) 这两个环境变量都是内核启动有关的在启动 linux 内核时会参考这两个环境变量的值。 4、board_late_init (1) 看名字这个函数就是开发板级别的一些初始化里比较晚的了就是晚期初始化。所以晚期就是前面该初始化的都初始化过了剩下的一些必须放在后面初始化的就在这里了。侧面说明了开发板级别的硬件软件初始化告一段落了。 (2) 对于 X210 来说这个函数是空的。 九、start_armboot解析14 1、eth_initialize (1) 看名字应该是网卡相关的初始化。这里不是 SoC 与网卡芯片连接时SoC 这边的初始化而是网卡芯片本身的一些初始化。 (2) 对于 X210DM9000来说这个函数是空的。X210 的网卡初始化在 board_init 函数中网卡芯片的初始化在驱动中。 2、x210_preboot_initLCD和logo显示 (1) x210 开发板在启动起来之前的一些初始化以及 LCD 屏幕上的 logo 显示。 3、check menukey to update from sd (1) uboot 启动的最后阶段设计了一个自动更新的功能。就是我们可以将要升级的镜像放到 SD 卡的固定目录中然后开机时在 uboot 启动的最后阶段检查升级标志是一个按键。按键中标志为 “LEFT” 的那个按键这个按键如果按下则表示 update mode如果启动时未按下则表示 boot mode。如果进入 update mode则 uboot 会自动从 SD 卡中读取镜像文件然后烧录到 iNand 中如果进入 boot mode 则 uboot 不执行 update直接启动正常运行。 (2) 这种机制能够帮助我们快速烧录系统常用于量产时用 SD 卡进行系统烧录部署。 4、死循环 (1) 解析器 (2) 开机倒数自动执行 (3) 命令补全 十、uboot 启动第 2 阶段总结 1、启动流程回顾、重点函数标出 (1) 第二阶段主要是对开发板级别的硬件、软件数据结构进行初始化。 (2) 代码流程顺序 init_sequencecpu_init 空的board_init 网卡、机器码、内存传参地址dm9000_pre_init 网卡gd-bd-bi_arch_number 机器码gd-bd-bi_boot_params 内存传参地址interrupt_init 定时器env_initinit_baudrate gd数据结构中波特率serial_init 空的console_init_f 空的display_banner 打印启动信息print_cpuinfo 打印CPU时钟设置信息checkboard 检验开发板名字dram_init gd数据结构中DDR信息display_dram_config 打印DDR配置信息表mem_malloc_init 初始化uboot自己维护的堆管理器的内存mmc_initialize inand/SD卡的SoC控制器和卡的初始化env_relocate 环境变量重定位gd-bd-bi_ip_addr gd数据结构赋值gd-bd-bi_enetaddr gd数据结构赋值devices_init 空的jumptable_init 不用关注的console_init_r 真正的控制台初始化enable_interrupts 空的loadaddr、bootfile 环境变量读出初始化全局变量board_late_init 空的eth_initialize 空的x210_preboot_init LCD初始化和显示logocheck_menu_update_from_sd 检查自动更新main_loop 主循环2、启动过程特征总结 (1) 第一阶段为汇编阶段、第二阶段为 C 阶段 (2) 第一阶段在 SRAM 中、第二阶段在 DRAM 中 (3) 第一阶段注重 SoC 内部、第二阶段注重 SoC 外部 Board 内部 3、移植时的注意点 (1) x210_sd.h 头文件中的宏定义 (2) 特定硬件的初始化函数位置譬如网卡。 源自朱有鹏老师.
http://www.w-s-a.com/news/689436/

相关文章:

  • 快速学做网站高水平的大连网站建设
  • 专业做房地产网站建设wordpress侧面小工具
  • 旅游网站开发的重要性wordpress添加广告插件
  • 关于网站建设管理工作的报告婚纱网站php
  • 东莞市建设培训中心网站那个网站可以看高速的建设情况
  • 网站开发工具安卓版专业小程序商城开发
  • 网站不备案影响收录吗深圳住房网站app
  • 交网站建设域名计入什么科目开发平台教程
  • 个人网站定制北京快速建站模板
  • 河南海华工程建设监理公司网站高端论坛网站建设
  • 网站建设网络推广方案图片编辑器免费
  • 如何用dw做网站设计设计头条
  • 网站建设基础及流程北京商场购物中心排名
  • 青州市城乡建设局网站自建网站步骤
  • wordpress文章延迟加载优化设计答案四年级上册语文
  • 做网站源码要给客户嘛怎么在运行打开wordpress
  • 北海住房和城乡建设局网站wordpress标题去掉私密
  • 织梦网站安装视频做网站都有那些步骤
  • 网站空间大小选择沈阳微信网站制作
  • 网站分享对联广告网站结构的类型
  • 三维家是在网站上做还是在app上北京网站建设 专业10年
  • 模拟网站建设网站建设认准猪八戒网
  • godaddy网站建设教程微信手机网站搭建
  • 网站建设 商城淄博网站制作哪家好
  • 廊坊手机网站团队国际贸易进口代理公司
  • 运用django做网站网站建设问题及解决办法
  • 商丘企业网站服务c mvc 网站开发
  • 太仓建设工程网站广州seo排名外包
  • 成都的教育品牌网站建设做网站不给提供ftp
  • 建站行业市场人力管理系统