[Zedboard Linux系统移植]-从MACHINE_START开始
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了[Zedboard Linux系统移植]-从MACHINE_START开始,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3630字,纯文字阅读大概需要6分钟。
内容图文
![[Zedboard Linux系统移植]-从MACHINE_START开始](/upload/InfoBanner/zyjiaocheng/452/ae1c8d152bff4ec68d68fb8393c1ce91.jpg)
zynq_init_machine---> 当前的zybo的机器初始化主函数。如需上点后初始化该板子的其他外设,可以在本函数内添加相应的初始化功能。
玩过或者移植过arm-linux的都应该知道在/arch/arm目录下有许多与具体处理器相关的目录,当然对于zynq的话所对应的目录就是mach-zynq,在里面找到与具体板子相关的文件\Linux-Digilent-Dev-master\arch\arm\mach-zynq\armcommon.c,没错,就是它。无论是出于想移植到新的内核还是出于想深入学习某一款arm等,对这个文件的学习是必不可少的。这个文件大部分内容是对平台设备的结构体初始化,在这个文件的最后有一个非常重要的宏:
DT_MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform")
/* 64KB way size, 8-way associativity, parity disabled */
.l2c_aux_val = 0x00000000,
.l2c_aux_mask = 0xffffffff,
.smp = smp_ops(zynq_smp_ops),
.map_io = zynq_map_io,
.init_irq = zynq_irq_init,
.init_machine = zynq_init_machine,
.init_late = zynq_init_late,
.init_time = zynq_timer_init,
.dt_compat = zynq_dt_match,
.reserve = zynq_memory_init,
.restart = zynq_system_reset,
MACHINE_END
DT_:qMACHINE_START的定义在arch/arm/include/asm/mach/arch.h,如下:
#define DT_MACHINE_START(_name, _namestr) \
static const struct machine_desc __mach_desc_##_name \
__used __attribute__((__section__(".arch.info.init"))) = { .nr = ~0, .name = _namestr,
#endif
噢,其实就是定义了一个struct machine_desc类型结构体变量,这个结构体还定义了其他一些成员,接下来着重关注.init_machine这个成员,它是一个函数指针,值为zynq_init_machine,这个函数也在common.c中定义。内容是什么呢?呵呵,因为在这里只给出大体流程,具体内容先不分析。现在最关心的是这个结构体变量在哪里被调用,从而调用它里面的成员和成员函数呢?先来看/arch/arm/kernel/setup.c里面的setup_arch()函数:
void __init setup_arch(char **cmdline_p)
{
const struct machine_desc *mdesc;
setup_processor();
mdesc = setup_machine_fdt(__atags_pointer);
if (!mdesc)
mdesc = setup_machine_tags(__atags_pointer, __machine_arch_type);
machine_desc = mdesc;
machine_name = mdesc->name;
if (mdesc->reboot_mode != REBOOT_HARD)
reboot_mode = mdesc->reboot_mode;
init_mm.start_code = (unsigned long) _text;
init_mm.end_code = (unsigned long) _etext;
init_mm.end_data = (unsigned long) _edata;
init_mm.brk = (unsigned long) _end;
/* populate cmd_line too for later use, preserving boot_command_line */
strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);
*cmdline_p = cmd_line;
parse_early_param();
early_paging_init(mdesc, lookup_processor_type(read_cpuid_id()));
setup_dma_zone(mdesc);
sanity_check_meminfo();
arm_memblock_init(mdesc);
paging_init(mdesc);
request_standard_resources(mdesc);
if (mdesc->restart)
arm_pm_restart = mdesc->restart;
unflatten_device_tree();
arm_dt_init_cpu_maps();
psci_init();
......................
这个函数在/init/main.c的start_kernel()函数里被调用。看到第10行,这里的setup_machine()函数的作用就是找到我们想要的struct machine_desc类型的变量,也就是在common.c里定义那个变量。函数的参数machine_arch_type的值是什么呢?继续看:
版权声明:本文为博主原创文章,未经博主允许不得转载。
[Zedboard Linux系统移植]-从MACHINE_START开始
标签:移植 内核
本文系统来源:http://blog.csdn.net/xiabodan/article/details/46835827
内容总结
以上是互联网集市为您收集整理的[Zedboard Linux系统移植]-从MACHINE_START开始全部内容,希望文章能够帮你解决[Zedboard Linux系统移植]-从MACHINE_START开始所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。