[OS64][026]源码阅读:程序4-11 切换到第二个进程

2019-06-18  本文已影响0人  AkuRinbu

[OS64][025]源码阅读:程序4-11:运行结果,数据结构,第一个进程init_task_union

https://www.jianshu.com/p/b30fb97a1dc4

程序4-11 程序执行过程示意图

task_init()

kernel_thread()

struct pt_regs regs;
memset(&regs,0,sizeof(regs));
struct pt_regs
{
    unsigned long r15;
    unsigned long r14;
    unsigned long r13;
    unsigned long r12;
    unsigned long r11;
    unsigned long r10;
    unsigned long r9;
    unsigned long r8;
    unsigned long rbx;
    unsigned long rcx;
    unsigned long rdx;
    unsigned long rsi;
    unsigned long rdi;
    unsigned long rbp;
    unsigned long ds;
    unsigned long es;
    unsigned long rax;
    unsigned long func;
    unsigned long errcode;
    unsigned long rip;
    unsigned long cs;
    unsigned long rflags;
    unsigned long rsp;
    unsigned long ss;
};

do_fork()

memcpy(regs,
(void *)((unsigned long)tsk + STACK_SIZE - sizeof(struct pt_regs)),
sizeof(struct pt_regs));

(这之前有使用alloc_pages分配一个2MB物理页,地址是0x200000起始,示意图没有体现,这里说明一下)

switch_to()

把 init改成helloworld更容易看清楚第二个进程的本质

将init 改成 hello world
unsigned long helloworld(unsigned long arg)
{
    color_printk(YELLOW,BLACK,"hello world is running,arg:%#018lx\n",arg);

    return 1;
}

void task_init()
{

    kernel_thread(helloworld,10,CLONE_FS | CLONE_FILES | CLONE_SIGNAL);

}

参考资料

汇编视角
RDI = a
RSI  = b
RDX = c
RCX =d
R8 = e
R9 = f
其余通过 memory 传递
RAX = 返回值

https://www.jianshu.com/p/c870f2144172

上一篇 下一篇

猜你喜欢

热点阅读