解决了函数调用多时系统无响应的问题,现在来解决初始化 buddy 链表头时卡在INIT_LIST_HEAD 宏的问题,把难啃的骨头留在后边,最后再腾出功夫来看中断无法初始化是怎么回事。
函数卡在INIT_LIST_HEAD 宏,无法初始化全局链表数组,该数组的每个元素分别是一组同阶的buddy链表的链表头。数组为全局变量,存储在bss段。既然无法修改bss的内容,尝试在函数内部定义一个连表节点变量,将该变量的两个指针成员指向自身,结果是成功的。查看变量的地址,靠近内存最高端的栈里,这是因为arm的堆栈是满递减结构,从顶向下增长的。再回头看数组的地址:0x00000420,在前4K,这个地址是CPU内部STEPSTONE使用的,那么要解决这个问题就要修改bss段的链接地址了,将其避开前4K地址。做法是将链接脚本中bss段从kernel段上边拿到下边,原链接脚本:
/********************************************************************
*
* @ File Name : link.lds
* @ Date : 2012-03-24
* @ Author : gaofeilong <gaofeilonglcu@163.com>
*
* @ Description: lin