• neohope
    置顶
    2021-07-06
    一、数据结构 thread_t表示一个线程,包括: 锁【并发】、链表 进程标志、进程状态、进程编号【内存地址】、CPU编号【当前全是0】、CPU时间片、进程权限【内核or用户】、优先级【越小越高】、运行模式 栈信息【内核栈、应用栈】,每个进程的栈是独立的,向下生长 内存地址空间信息virmemadrs_t,每个进程的内核部分是共用的,应用部分是独立的,通过页表实现 上下文信息,用于进程切换 进程打开资源的描述符,最多TD_HAND_MAX个 二、新建进程 init_krl->init_krlcpuidle->new_cpuidle->new_cpuidle_thread->krlnew_thread ->krlnew_kern_thread_core新建内核进程 ->krlnew_user_thread_core新建用户进程 krlnew_kern_thread_core: A、krlnew分配内核栈空间 B、krlnew_thread_dsc建立thread_t结构体的实例变量,并初始化 C、设置进程权限,优先级,进程的内核栈顶和内核栈开始地址 D、初始化进程的内核栈 E、加入进程调度系统,sschedcls.scls_schda[cpuid].sda_thdlst[td_priority].tdl_lsth krlnew_user_thread_core: A、krlnew分配应用程序栈空间 B、krlnew分配内核栈空间 C、krlnew_thread_dsc建立thread_t结构体的实例变量,并初始化 D、设置进程权限,优先级,进程的内核栈顶和内核栈开始地址,进程用户栈顶和内核栈开始地址 E、初始化进程的应用栈 F、加入进程调度系统,sschedcls.scls_schda[cpuid].sda_thdlst[td_priority].tdl_lsth 三、中断进程切换【以硬件中断为例】 A、定义了宏HARWINT,其中硬件中断分发器函数为hal_hwint_allocator %macro HARWINT 1 保存现场...... mov rdi, %1 mov rsi,rsp call hal_hwint_allocator 恢复现场...... %endmacro B、定义了各种硬件中断编号,比如hxi_hwint00,作为中断处理入口 ALIGN 16 hxi_hwint00: HARWINT (INT_VECTOR_IRQ0+0) C、有硬件中断时 CPU 会根据中断门描述里的目标段选择子,进行必要的特权级切换; 特权级的切换就必须要切换栈,CPU 硬件会自己把当前 rsp 寄存器保存到内部的临时寄存器 tmprsp; 然后从 x64tss_t 结构体 【地址在GDT表,由 CPU 的 tr 寄存器指向】中找出对应的栈地址,装入 rsp 寄存器中; 接着,再把当前的 ss、tmprsp、rflags、cs、rip,依次压入当前 rsp 指向的栈中。 D、然后会先到达中断处理入口 保护现场 调用到硬件中断分发器函数hal_hwint_allocator 第一个参数为中断编号,在rdi 第二个参数为中断发生时的栈指针,在rsi 然后调用异常处理函数hal_do_hwint E、hal_do_hwint ->调用中断回调函数hal_run_intflthandle 先获取中断异常表intfltdsc_t 然后调用intfltdsc_t.i_serlist 链表上,所有挂载intserdsc_t 结构中的,中断处理的回调函数,让函数自行判断是否处理中断 ->中断处理完毕后调用krlsched_chkneed_pmptsched ->->一路返回,直到中断处理入口,还原现场,继续执行 ->->或者调用krlschedul,继续进行调度,其实就可以返回用户态了 中断进程切换这部分,是硬理解的,不知道能对多少,还请老师指正。
    展开

    作者回复: 是正确的

    
    10
  • pedro
    2021-07-02
    每个进程都有一个内核栈,指向同一个块内核内存区域,共享一份内核代码和内核数据。内核进程一份页表,用户进程两份页表,用户进程多了一份用户空间页表,与其它用户进程互不干扰。

    作者回复: 聪明如你

    
    14
  • 嗣树
    2021-07-02
    各个进程内核空间都使用同一份页表,通过页表映射到同一物理内存。 咱们的进度还是挺快的,一不留神这周都挺近进程了哈哈哈

    作者回复: 是的

    
    2
  • blentle
    2021-07-02
    内存管理算是讲完了吗

    编辑回复: 是啊,告一段落了。关键之处课里都讲了,你还可以结合源代码(见Gitee)继续深入学习。

    
    1
  • Slience-0°C
    2023-02-16 来自山东
    开源代码项目在哪里?老师

    编辑回复: 请看LMOS朋友助阵写的加餐:https://time.geekbang.org/column/article/429070

    
    
  • 温雅小公子
    2022-10-10 来自湖北
    进程是传说中的PCB吗?

    作者回复: PCB是进程的管理数据

    
    
  • 严杰
    2022-09-29 来自湖北
    进程有对应的结构,那线程呢?线程和进程是怎么关联的?

    作者回复: 往下看

    
    
  • 弋
    2022-07-15
    内核栈krlstkadr = krlnew(krlstksz); 这个地方,返回的还是物理地址,新建进程的这一部分好像没看到有建立页表的内容

    作者回复: 是虚拟地址

    共 2 条评论
    
  • ifelse
    2022-02-17
    膜拜各位大神

    作者回复: 哈哈

    
    
  • O俊
    2021-09-17
    老师你好,我想问下,线程用到的栈空间在哪个地方?是在进程地址空间中的栈段吗?

    作者回复: 我没支持线程

    
    