操作系统-核心级线程实现
2020-03-10 16:05:30来源:博客园 阅读 ()
操作系统-核心级线程实现
1. 从某个中断开始
INT 0X80中断,进入内核 ,调用函数就是system_call,接下来就是执行system_call
2. 五段论中的中断入口和中断出口以及schedule
- 首先又压栈一些用户态的信息,
- 接下来就是具体去处理sys_fork,也就是中断要产生的效果,但是在执行sys_fork的时候可能引起切换,
- 接下来就是看当前PCB中的state是否等于0,如果不是那么就要进行调度,就是靠schedule,完成五端论中的中间三步
- 看它的时间片是否等于0,时间片用光了也要进行调度
- 最后就是执行中断返回的函数ret_from_sys_call,iret也就是从内核栈到用户栈的切换
- 下图,在ret_from_sys_call中,首先popl一些信息,就是和压栈的信息对应,然后就是iret
关于schedule
- 调度的话首先要找下一个线程,这个在后面讲调度的时候详细说
- switch_to里面完成切换
- 把当前cpu中的所有指令放在当前TR指向的段中,也就是把当前执行的信息拍下来放到原tss中,
- 开始执行长跳转指令,
- 把TSS(n)指给TR,也就是把新tss里的信息扣到cpu上
关键三步骤:
- INT中断 进入内核
- schedule的里的switch_to里的ljmp完成切换
- ret_from_sys_call里的iret中断出口
3. ThreadCreate
tss是寄存器,TCB(线程控制块)
创建一个线程就是做出能切换的样子,核心就是上面切换时用到的tss
首先要有TCB,然后是内核栈,把tss做好就行了
copy_process函数在进程创建的fork函数中调用,主要完成进程数据结构,各种资源的初始化。初始化方式可以重新分配,也可以共享父进程资源,主要根据传入CLONE参数来确定。
- 申请内存空间,注意这是在内核中,用get_free_page(),而不是malloc
4. 如何执行我们想要的代码?
从exec这个系统调用开始
exec函数提供了一个在进程中启动另一个程序执行的方法
5. 总结
原文链接:https://www.cnblogs.com/mengd/p/12458788.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 操作系统第六次实验报告——使用信号量解决哲学家进餐问题 2020-05-28
- Linux基础(二)在vmwaer虚拟机 上安装Linux操作系统 2020-05-27
- 操作系统第五次实验报告——内存管理 2020-05-17
- 运维基础 2020-05-14
- 基于mykernel 2.0编写一个操作系统内核 2020-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash