理解进程创建、可执行文件的加载和进程执行进程切换

本文详细探讨了Linux系统中进程的创建过程,通过fork系统调用和do_fork函数,阐述了如何复制父进程并创建子进程。接着讲解了可执行文件的加载,涉及编译链接、静态链接和动态链接的概念。最后,分析了进程切换的内部机制,通过schedule函数和switch_to实现。总结了进程调度的时机和上下文切换的本质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/

一、进程创建

fork系统调用

  • 通过调用do_fork来实现进程的创建;
  • 复制父进程PCB–task_struct来创建一个新进程,要给新进程分配一个新的内核堆栈;
  • 修改复制过来的进程数据,比如pid、进程链表等等执行copy_process和copy_thread
  • 成功创建新进程

调用过程:fork()-> sys_clone() -> do_fork() -> dup_task_struct() -> copy_process() -> copy_thread() -> ret_from_fork()

其中关键函数do_fork代码如下:

long do_fork(unsigned long clone_flags,
          unsigned long stack_start,
          unsigned long stack_size,
          int __user *parent_tidptr,
          int __user *child_tidptr)
{
   
   
    struct task_struct *p;
    int trace = 0;
    long nr;

    p = copy_process(clone_flags, stack_start, stack_size,
             child_tidptr, NULL, trace);

    if (!IS_ERR(p)) {
   
   
        struct completion vfork;
        struct pid *pid;

        trace_sched_process_fork(current, p);

        pid = get_task_pid(p, PIDTYPE_PID);
        n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值