快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
ADI bf561 DSP
uclinux-2008r1.5-rc3 (移植到vdsp5)
Visual DSP++ 5.0(update 5)
欢迎转载,但请保留作者信息
/*
* load the current thread pointer and stack
*/
r1.l = _init_thread_union;
r1.h = _init_thread_union;
r2.l = 0x2000;
r2.h = 0x0000;
r1 = r1 + r2;
sp = r1;
usp = sp;
fp = sp;
在此之前,SP一直使用4k的scratch pad,现在终于要进入正题了。可以将uclinux内核的初始化阶段也看成一个线程,用一个表示线程的全局结构来表示它,这就是init_thread_union。
/*
* Initial thread structure.
*
* We need to make sure that this is 8192-byte aligned due to the
* way process stacks are handled. This is done by having a special
* "init_task" linker map entry.
*/
union thread_union init_thread_union
__attribute__ ((__section__(".data.init_task"))) = {
INIT_THREAD_INFO(init_task)};
它是一个thread_union,定义如下:
union thread_union {
struct thread_info thread_info;
unsigned long stack[THREAD_SIZE/sizeof(long)];
};
thread_info由低向高排列,stack则从高往低使用,因此在head.s中,将sp设置为指向init_thread_union的最高位置。
/*
* Size of kernel stack for each process. This must be a power of 2...
*/
#define THREAD_SIZE 8192 /* 2 pages */
8192的16进制即为0x2000。
head.s分析(1):保存u-boot传递过来的指针(2009-1-19)
head.s分析(2):SYSCFG配置(2009-1-19)
head.s分析(3):数据及指针寄存器清0(2009-1-19)
head.s分析(4):关闭CACHE(2009-01-19)
head.s分析(5):关闭串口(2009-01-19)
head.s分析(6):栈指针初始化(2009-01-19)
head.s分析(7):init_early_exception_vectors(2009-1-19)
head.s分析(8):配置PLL及SDRAM(2009-01-20)
head.s分析(9):EBIU配置(2009-01-20)
head.s分析(10):转入中断15(2009-01-20)
head.s分析(11):关闭WATCHDOG(2009-01-20)
head.s分析(12):bss段清0(2009-01-20)
head.s分析(13):代码段前空间清0(2009-01-20)
head.s分析(14):L2空间清0(2009-01-20)
head.s分析(15):复制u-boot传递的参数(2009-01-20)
head.s分析(16):取_rambase和_ramstart的值(2009-1-20)
分享到:
相关推荐
- `InsertNode(TEST *head, TEST *s)`:在链表中插入一个新的题目节点。 - `TEST`结构体:文档中显示了该结构体的定义,它包括题干、四个选项、正确答案的key以及指向下一个题目的指针。 4. 随机数生成和测试逻辑...
- **SP**:设置堆栈指针`sp`为解压代码的堆栈指针。 - **R4**:设置`r4`为内核入口点的物理地址。 #### 1.3 Link Address and BSS Zeroing - **链接地址检查**:检查是否在链接地址运行,并在必要时调整全局偏移...
1. **设置栈指针**:在`head.S`中,首先设置栈指针SP,以便在后续的C函数调用中正确地管理函数调用的上下文。 2. **关闭WATCHDOG**:WATCHDOG定时器是一个硬件机制,用于检测系统是否死锁或无响应。在初始化阶段,...
2.void add_rcd(STD *sp) 将缓冲区sp添加到链表当前结点后,生成一新记录结点,并置当前指针指向新结点。 3.int find_rcd(char *xh) 从当前结点开始按学号搜索结点,成功返回1,并置当前指针指向该结点,失败返回...
- **自解压头**: 在内核源码的`arch/arm/boot/compressed/head.S`文件中,`start`符号标记了zImage自解压的开始位置。自解压头会读取一些重要的魔数(`0x016f2818`),以及解压后的绝对地址等信息。 - **关键指令**: ...
4) head: Session的头, head[0]为第一个Session, head[max-1]为最后一个session 5) init: 这一服务中每个Session需要执行的初始化操作. (函数指针) 6) process: 这一服务中消息的处理函数 7) closure: 这一服务中...
4) head: Session的头, head[0]为第一个Session, head[max-1]为最后一个session 5) init: 这一服务中每个Session需要执行的初始化操作. (函数指针) 6) process: 这一服务中消息的处理函数 7) closure: 这一服务中...
在 ARM 架构下,解压缩代码位于 arch/arm/boot/compressed/head.s 文件中。该文件中的代码负责解压缩内核镜像并将其加载到内存中。 2. 初始化 在解压缩完成后,下一步是初始化。初始化是指对系统进行初始化,以便...
栈顶指针SP通常用来指示栈的状态,空栈时SP指向栈底,满栈时SP指向栈顶。 21. **8086寻址方式**: 包括直接寻址、立即寻址、寄存器寻址、间接寻址、基址变址寻址等,如示例`MOV AX, [BX]`是寄存器间接寻址。 22. **...
首先,我们来看`head.S`文件的内容。这是一个汇编语言文件,它负责初始化系统并设置中断向量表。中断向量表是处理器在遇到异常或中断时会跳转执行的地址集合。在这个例子中,除了Reset(复位)和HandleIRQ(中断处理...
- 由于是原地修改,因此无需额外空间。 **2. 判断链表是否有环** **源码分析**: ```c bool isLoop(link *head) { link *p = head; link *q = head; while (p != NULL && q != NULL && q->next != NULL) { p =...
除了上述SFR,STC12C5620AD还定义了一系列基础寄存器,如`P0`至`P3`端口寄存器,`PSW`程序状态字寄存器,`ACC`累加器,`B`辅助寄存器,以及堆栈指针`SP`等,这些寄存器对于实现基本的微控制器功能至关重要。...
将堆栈指针sp 指向0x9ff00(即0x9000:0xff00)处 mov ss,ax mov sp,#0xFF00 ! arbitrary value >>512 ! 由于代码段移动过了,所以要重新设置堆栈段的位置。 ! sp 只要指向远大于512 偏移(即地址0x90200)处 ! 都可以...
通过这样的途径当你更换使用的数据库时,可以轻松的更改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。 - 可扩展性 就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个...
- **Log Management**:`log_thread_context *logger`、`log_buff *w_buffer` 和 `FILE *log_fp`分别表示日志线程上下文、写入缓冲区和日志文件指针。 - **Event Polling**:`struct mtcp_epoll *ep`表示事件轮询...
而其他选项均存在语法错误或不当之处:选项A中的`*sp`应当是指向字符的指针而非指向字符串的指针;选项B和C试图将一个字符串赋值给数组变量`s`,但在C语言中这样做是非法的。 ### 4. Java中的缓冲区写入换行符 在...