水手勇敢

  • 2025-01-03
  • 发表了主题帖: 《Linux内核深度解析》之进程的创建

    进程的创新主要有fork、clone等的系统调用来完成。通过函数_do_fork实现。 _do_fork主要完成以下工作: 1、调用copy_process函数 2、调用wake_up_new_task函数唤醒新进程 /* * Ok, this is the main fork-routine. * * It copies the process, and if successful kick-starts * it and waits for it to finish using the VM if required. */ long do_fork(unsigned long clone_flags, unsigned long stack_start, struct pt_regs *regs, unsigned long stack_size, int __user *parent_tidptr, int __user *child_tidptr) { struct task_struct *p; int trace = 0; long pid; if (unlikely(current->ptrace)) { trace = fork_traceflag (clone_flags); if (trace) clone_flags |= CLONE_PTRACE; } p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr); /* * Do this prior waking up the new thread - the thread pointer * might get invalid after that point, if the thread exits quickly. */ pid = IS_ERR(p) ? PTR_ERR(p) : p->pid; if (!IS_ERR(p)) { struct completion vfork; if (clone_flags & CLONE_VFORK) { p->vfork_done = &vfork; init_completion(&vfork); } if ((p->ptrace & PT_PTRACED) || (clone_flags & CLONE_STOPPED)) { /* * We'll start up with an immediate SIGSTOP. */ sigaddset(&p->pending.signal, SIGSTOP); set_tsk_thread_flag(p, TIF_SIGPENDING); } p->state = TASK_STOPPED; if (!(clone_flags & CLONE_STOPPED)) wake_up_forked_process(p); /* do this last */ ++total_forks; if (unlikely (trace)) { current->ptrace_message = pid; ptrace_notify ((trace << 8) | SIGTRAP); } if (clone_flags & CLONE_VFORK) { wait_for_completion(&vfork); if (unlikely (current->ptrace & PT_TRACE_VFORK_DONE)) ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP); } else /* * Let the child process run first, to avoid most of the * COW overhead when the child exec()s afterwards. */ set_need_resched(); } return pid; } copy_process函数的主要工作: 通过dup_task_struct函数为进程分配内存空间。 通过sched_fork函数为进程设置调度器 通过copy_semundo、copy_files、copy_fs、copy_sighand、copy_signal、copy_mm、copy_namespaces、copy_io、copy_thread_tls函数复制共享资源。   wake_up_new_task函数的主要工作: 将新进程的状态切换到TASK_RUNNING 将新进程加入到运行队列

  • 2024-12-25
  • 回复了主题帖: 《Linux内核深度解析》之环境准备与第一章学习

    qzgiky 发表于 2024-12-24 11:28 学习手搓一个操作系统 一开始想着自已做一个的,不过这个系统有点太庞大了。现在感觉如果想自己编,应该从基础学起,比如说:有一定的RTOS的基础,然后如果做的话,先考虑低版本的系统开始做。

  • 2024-12-24
  • 发表了主题帖: 《Linux内核深度解析》之环境准备与第一章学习

    《Linux内核深度解析》第一章学习 一、准备工作 首先在Index of /pub/linux/kernel/v4.x/网站下载对应的4.12版本。   通过sourceinsight进行代码查看.     没有发现start.S文件,怀疑自己的解压方式有问题,采用lubuntu的share文件夹进行解压,依然没有发现对应文件。   学习代码结构 start.S的作用 Start.S左右启动的开始主要有以下作用: 通过调用各种板卡函数save_bool_params来保存重要的寄存器。 调用函数reset_sctrl来初始化系统控制寄存器。 根据处理器异常情况设置寄存器。 为处理器的缺陷打补丁。 简单设置主从处理器 跳到main函数 main函数的作用 为调用函数board_init_f做准备。调用board_init_f函数 把 U-Boot 程序复制到内存中,之后处理器从内存中取数据。 重新定位栈 调用函数 board_init_r,以此执行 init_sequence_r中的每个函数,直到run_main_loop函数。

  • 2024-12-11
  • 回复了主题帖: 读书入围名单: 《Linux内核深度解析》

    个人信息无误,确认可以完成阅读分享计划

最近访客

< 1/1 >

统计信息

已有4人来访过

  • 芯积分:59
  • 好友:--
  • 主题:2
  • 回复:2

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言