最近一直在学一些零零碎碎的东西,
首先,将《鸟哥的 Linux 私房菜 -- 基础学习篇》过了一遍。
因为有了Windows驱动,PCI/PCIe, USB, xHCI, Windows内核编程的基础,
加上自己以前也动手写过Linux设备驱动, 研究过Makefile, KConfig, make menuconfig, GIT的部分内容
鸟哥的这本书确实写得非常通俗易懂,帮我解开了一些以前知道怎么操作, 但不知道为什么要这样操作的疑惑。
另外,基本完成了USB Audio/Video Class设备端的:裸金属代码与Linux驱动代码。
USB xHCI主机端的Windows WDDM驱动,与Linux的DRM/KMS 驱动还在有条不紊地行进中与优化中。
通过这个项目,
技术上:
USB Audio/Video Class
HDMI
DDR memory controller
LCD controller
VESA/CEA-861-D
I2S, I2C
SoC: Cache(D/I cache, L2 cache & Internal SRAM), CP15, MMU
Linux driver/module
等有了更进一步的深入理解
比起以前负责的项目(avstream/bda driver, cypress fx2 firmware, usb audio class, usb video class), usb audio/video class项目不仅从技术上得到了加强与锻炼,同时也在一线技术管理,项目安排,规划方面,外部交流中得到了一定的锻炼。
另外,最近也研究了一下:
arm的vector.s, init.s, scatter loading(xxx_ld.script, 在Eclipse的项目,属性,ARM RealView Linker, Output, Scatter Description File --scatter= 设置).
arm从0地址开始执行,首先运行的是:
Reset_handler(init.s) (LDR PC, Reset_addr),在其中做了一些硬件初始化后(比如,MMU开关, I/D CACHE开关, 异常向量在高/低端的设置, SoC内部的SRAM是用作L2 CACHE还是SRAM的设置)
各个模式(例如SVC, IRQ, FIQ, ABT, UND, SYS/USER)的准备(主要是STACK的基地址设置)
以上设置部分需要涉及到CP15的读写。
之后,PC就跳转到__main (不是main).
然后,PC跳到__scatterload (包括 __scatterload_r, __scatterload_n(__scatterload_n就是__scatterload_null))
之后,运行__decompress (__scatterload_null 调用了__decompress)
之后,运行__scatterload_z (zero init)
之后,运行__rt_entry
{
__rt_stackheap_init
__user_setup_stackheap
__rt_stackheap_storage
__platform_post_stackheap_init
__fp_init
__rt_fp_status_addr
__ARM_argv_veneer
__heap_extend
__rt_heap_extend
__rt_heap_descriptor
__heap_guard
__heap_provide_memory
__init_alloc
srand
__rand_init
__aeabi_memclr4
__memset_w
__mutex_initialize
__sys_open
似乎并没有全部列出来
}
最后,才开始执行main (c代码中的main)
总结一下:
_main()引导库函数完成C执行环境的初始化,具体过程如下:
◇将非启动代码的RO和RW执行域代码从加载域地址复制到执行域地址;
◇将ZI域清零;
◇跳转到_rt_entry。
_main()并没有建立C库运行必须的环境,这项工作由_rt_entry()完成,主要调用过程为:
◇调用_rt_stackheap_init()建立堆和栈;
◇调用_rt_lib_init()初始化引用的库函数;假如需要,建立main()函数的参数argc和argv等;(似乎我没跟踪到_rt_lib_init(), 但是看到了strlen,难道这就是在调用?)
◇调用main()函数,执行应用程式,能够应用库函数;
◇用main()函数的返回值作参数调用exit()。
在ADS1.2的环境中,如果在C入口没有调用编译器的链接库(__main),那么在C程序一开始要调用该函数以初始化运行时的函数库,以保证对ADS提供的某些库函数能够正常调用。从这个函数开始,我们已经在C语言环境下了。