快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
ADSP-BF561
uclinux-2008r1.5-RC3(smp patch)
Visual DSP++ 5.0(update 5)
欢迎转载,但请保留作者信息
系统中的第一个用户线程应该是/bin/init。内核使用了
run_init_process("/bin/init");
创建用户线程。这个函数的实现为:
static void run_init_process(char *init_filename)
{
argv_init[0] = init_filename;
kernel_execve(init_filename, argv_init, envp_init);
}
即它将调用kernel_execve函数创建用户线程。kernel_execve的实现在文件arch\blackfin\mach-common\entry.S中:
ENTRY(_kernel_execve)
link SIZEOF_PTREGS;
p0 = sp;
r3 = SIZEOF_PTREGS / 4;
r4 = 0(x);
.Lclear_regs:
[p0++] = r4;
r3 += -1;
cc = r3 == 0;
if !cc jump .Lclear_regs (bp);
p0 = sp;
sp += -16;
[sp + 12] = p0;
call _do_execve;
SP += 16;
cc = r0 == 0;
if ! cc jump .Lexecve_failed;
/* Success. Copy our temporary pt_regs to the top of the kernel
* stack and do a normal exception return.
*/
r1 = sp;
r0 = (-KERNEL_STACK_SIZE) (x);
r1 = r1 & r0;
p2 = r1;
p3 = [p2];
r0 = KERNEL_STACK_SIZE - 4 (z);
p1 = r0;
p1 = p1 + p2;
p0 = fp;
r4 = [p0--];
r3 = SIZEOF_PTREGS / 4;
.Lcopy_regs:
r4 = [p0--];
[p1--] = r4;
r3 += -1;
cc = r3 == 0;
if ! cc jump .Lcopy_regs (bp);
r0 = (KERNEL_STACK_SIZE - SIZEOF_PTREGS) (z);
p1 = r0;
p1 = p1 + p2;
sp = p1;
r0 = syscfg;
[SP + PT_SYSCFG] = r0;
[p3 + (TASK_THREAD + THREAD_KSP)] = sp;
RESTORE_CONTEXT;
rti;
.Lexecve_failed:
unlink;
rts;
ENDPROC(_kernel_execve)
这个函数首先在当前内核线程的栈上留了一个struct pt_regs的空间并将它们全部置0,接着调用do_execve。内核调用kernel_execve时传递了三个参数进来,分别保存在R0, R1, R2三个寄存器中,但是do_execve有四个参数
int do_execve(char * filename,
char __user *__user *argv,
char __user *__user *envp,
struct pt_regs * regs)
因此还要将regs的指针传递进去,由于这是第四个参数,需要通过栈来传递。在执行完do_execve函数后,regs中将保存用户程序开始执行时所必须的各个寄存器的值,其PC指针将指向用户程序在SDRAM中的第一行可执行程序,而SP将指向动态创建的thread_info。
在此之后,执行RESTORE_CONTEXT,这个宏将把RETI寄存器的值设置为struct pt_regs结构体中的pc成员的值,因此在最后执行rti指令的时候就将跳转到用户程序开始执行。
在内核中调用用户程序时,通常处于时钟中断或者中断15的状态,因此最后一条rti指令将使DSP退出super mode,从而进入user mode运行。
uclinux第一个内核线程的运行(2009-4-23)
uclinux内核线程的创建(2009-4-23)
从fork_init看uclinux内核的线程数量限制(2009-4-22)
uclinux内核的任务优先级及其load_weight(2009-4-22)
init_thread_union猜想(2009-1-17)
uclinux2.6(bf561)内核中的current_thread_info(2008/5/12)
分享到:
相关推荐
如何在 uClinux 中添加新的用户应用程序 ‘如何在 uClinux 中添加新的用户应用程序
在uclinux中添加自己应用程序的详细过程
STM32_uClinux程序.zip.ZIPSTM32_uClinux程序.zip.ZIPSTM32_uClinux程序.zip.ZIPSTM32_uClinux程序.zip.ZIPSTM32_uClinux程序.zip.ZIPSTM32_uClinux程序.zip.ZIPSTM32_uClinux程序.zip.ZIP
学习嵌入式uCLinux上实现设备驱动程序的添加非常好的资料
给出了在LINUX下加载驱动程序的步骤和代码,包括动态和静态两种方式
介绍了以MCF5307微处理器为核心的硬件平台上的操作系统uClinux的应用程序设计与标准linux应用程序设计的区别,并且介绍了裁剪uClinux的要点。
嵌入式uClinux应用程序的NFS开发 嵌入式uClinux应用程序的NFS开发
基于uCLinux嵌入式平台上USB设备驱动程序开发 基于uCLinux嵌入式平台上USB设备驱动程序开发
在uclinux中添加自己应用程序的详细过程.pdf
( 文中所用的路径为uclinux 安装的相对路径, 比如: /uClinux-Samsung)编译uclinux 并运行成功后, 下一步的工作就是写个最经典、最简单的程序“ hello, world” 。 在uclinux下, 当然要比在
目前关于uclinux的官网被封,因此不能再其官网上下载uclinux的相关版本信息。... 为了和我一样下载uclinux资源而陷入茫茫的搜索中的朋友提供一条路径,因此,附上uclinux的下载网站,含各种uclinux版本。
44b0uclinux串口驱动程序-,Unix_Linux,嵌入式Linux
在uclinux下添加自定义应用程序的过程要比在普通的OS下麻烦些。文中使用ANYWHERE-Ⅱ开发板,基本是按照Documentation/Adding-User-Apps-HOWTO的步骤介绍了在UcLinux添加自定义应用程序的步骤。
uCLinux操作系统实验-驱动程序和源代码
STM32F10X单片机启动uCLinux的BootLoader程序,可代替官方发布的BootLoader。仅限于启动基于STM3210E开发板的xipImage内核,并且要去掉内核中的Splash输出。
如何将自己的应用程序编译到uCLinux.pdf
This is a Kernel module for uClinux 2.4.x . This module let uClinux 2.4.x can use pwm.
Uclinux Book
文章从构建一个针对S3C4510B硬件平台的嵌入式uClinux操作系统和在其上进行应用程序的开发入手,逐步讲述如何在Linux环境下编写用户应用程序的方法和步骤,并为熟悉Windows操作系统的用户介绍在这种平台之上,使用何...
1:对新手学习uclinux有良好的指导作用 2:具有普通的中断....演示