No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

开始核心级线程

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

内核级线程对多核的支持怎么样?

和用户级相比,核心级线程有什么不同?

ThreadCreate 是系统调用,内核管理TCB ,内核负责切换线程

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

如何让切换成型? − − 内核栈,TCB

  • 用户栈是否还要用? 执行的代码仍然在用户态,还要进行函数调用
  • 一个栈到一套栈;两个栈到两套栈
  • TCB 关联内核栈,那用户栈怎么办?

 

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

用户栈和内核栈之间的关联

所有中断( 时钟、外设、INT指令) 都引起上述切换

中断( 硬件) 又一次帮助了操作系统…

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

仍然是那个A() ,B() ,C() ,D()…

认真体会从内核返回( 中断返回) 时的样子…

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

开始内核中的切换:switch_to

switch_to: 仍然是通过TCB 找到内核栈指针;然后通过ret 切到 某个内核程序; 最后再用CS:PC 切到

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

sys_read(){ 启动磁盘读; 将自己变成阻塞;找到next;switch_to(cur, next);}

回答上面的问号??, ???, ????…

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

 

???: sys_read 函数的某个地方

??: interrupt 之前的某个地方

???: sys_xxx 函数中的某个地方

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

最关键的地方来了: T 创建时如何填写?? , ????

?? 500 ,函数C()的开始地址

???? 一段能完成第二级返回的代码,一段包含iret 的代码…

内核线程switch_to 的五段论

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

ThreadCreate! 做成那个样子…

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

用户级线程、核心级线程的对比

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

 

操作系统Operating Systems内核级线程实现Create Kernel Threads

核心级线程的两套栈,核心是内核栈…

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

整个故事要从进入内核开始—— 某个中断开始…

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

切换五段论中的中断入口和中断出口

void sched_init(void)

{set_system_gate(0x80,&system_call);}

初始化时将各种中断处理设置好

_system_call:

push %ds..%fs

pushl %edx...

call sys_fork

pushl %eax

内核栈:

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

movl _current,%eax

cmpl $0,state(%eax)

jne reschedule

cmpl $0,counter(%eax)

je reschedule

ret_from_sys_call:

 

reschedule:

pushl $ret_from_sys_call

jmp _schedule

切换五段论中的schedule

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

 

切换五段论中的switch_to

Linux 0.11 用tss切换,但也可以用栈切换,因为tss 中的信息可以写到内核栈中

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

另一个故事ThreadCreate 就顺了…

从sys_fork 开始CreateThread

_sys_fork:

push %gs; pushl %esi

...

pushl %eax

call _copy_process

addl $20,%esp

ret

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

int copy_process(int nr,long ebp,long edi,long esi,long gs,longnone,long ebx,long ecx,long edx, longfs,long es,long ds,long eip,longcs,long eflags,long esp,long ss)

copy_process的细节:创建栈

p=(struct task_struct *)get_free_page();// 申请内存空间

p->tss.esp0 = PAGE_SIZE + (long) p;

p->tss.ss0 = 0x10;// 创建内核栈

p->tss.ss = ss & 0xffff;

p->tss.esp = esp;// 创建用户栈(和父进程共用栈)

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

申请内存空间;

创建TCB;

创建内核栈和用户栈;

填写两个 stack;

关联栈和TCB;

copy_process 的细节:执行前准备

p->tss.eip = eip;

p->tss.cs = cs & 0xffff;// 将执行地址cs:eip 放在tss 中

p->tss.eax = 0;

p->tss.ecx = ecx;// 执行时的寄存器也放进去了

p->tss.ldt = _LDT(nr);

set_tss_desc(gdt+(nr<<1) + 仔细体会tss 将要承担的作用…

FIRST_TSS_ENTRY, &(p->tss));

set_ldt_desc(gdt+(nr<<1) +

FIRST_LDT_ENTRY, &(p->ldt));// 内存跟着切换

p->state = TASK_RUNNING;

 

copy_process( ...,long eip,long cs,longe flags,long esp,long ss)

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

 

...

填写两个stack;

第三个故事: 如何执行我们想要的代码?

int main(int argc, char * argv[])

{ while(1) { scanf("%s", cmd);

if(!fork()) {exec(cmd);} wait(0); }

ThreadCreate(*A) 中的A 必须体现? 用户输入hello 命令,exec(hello)

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

fork() 何时返回0 ,何时不会? 首先要找到fork() 怎么返回?

mov %eax, __NR_fork

INT 0x80

mov res,%eax 如何到这条指令?

 

父进程用iret ,因为要从核心态到用户态;那么子进程呢? 仔细想一想…

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

结构: 子进程进入A ,父进程等待…

故事要从exec 这个系统调用开始

if(!fork()) {exec(cmd);}

 

_system_call:

push %ds .. %fs

pushl %edx..

call sys_execve

 

_sys_execve:

lea EIP(%esp),%eax

pushl %eax

call _do_execve

 

EIP = 0x1C

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

终于可以让AA 执行了…

int do_execve( * eip,...

{     p += change_ldt(...;

  eip[0] = ex.a_entry;

  eip[3] = p; ...

 

struct exec {

unsigned long a_magic;

unsigned a_entry; //口 入口 };

 

eip[0] = esp + 0x1C; eip[3] = esp +0x1C+0x0C = esp + 0x28 ( 正好是SP)

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

ex.a_entry 是可执行程序入口地址,产生可执行文件时写入…

No00003A操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

  • 理解switch_to 对应的栈切换,将自己变成计算机
  • ThreadCreate的目的就是初始化这样一套栈

 

更多相关文章
  • 前面我们介绍了c++作为一个面向对象的高级编程语言,知道了面向对象的特征.今天就开始正式的学习c++了.          我们知道,c++的核心就是把程序功能化,结构化,那么结构化,就必须有类.          一个类,里面有变量,有方法(函数).类里边的变量,我们称他为成员变量,函数就称为成员 ...
  • 编者按:本文<图片+社交>来自于友群的创始人李杨,他在参加了36氪与经纬中国合作的#经纬中国线下分享会#后对于社交产品有一些想法. 图片+社交是一个老话题.今天在36氪的经纬活动上,大家的讨论也很认真,想到了一些问题,随手写下来. Harry提到一个有点尖锐的看法.大意是,如果你在国内做 ...
  • 随着业务.企业规模的日益壮大,DB的数量也在不断增多,配置一台新增DB,从服务器的参数配置,磁盘阵列规划,DB安装部署,DB参数调优等等一列步骤下来,手工操作的效率变得越来越低,因为我负责的数据库近些时间,不断地迁移.新增,很能感觉到1人安装多台DB的问题,有两点:1. 要随时盯着安装进度,2单线程 ...
  • Network Connectivity 1. Important terminologies 1) Link 设备连接的连线.Link本身既可以是有线的,也可以是无线的. 2) Node 设备.电脑,笔记本电脑,手机都可以是Node. 3) Point-to-point 连接的设备只有两个. 4) ...
  • 文/王利阳前几日乐视TV超级电视S40降价引发了与联想的口水战,双方你来我往吵了几个回合.对乐视的价格调整,联想中国区智能电视事业部总经理任中伟认为,这是一种自杀行为,这种做法几乎完全不考虑产品的硬件成本.而乐视TV彭钢看法是,传统厂商只看到超级电视硬件价格低,而枉顾创造用户价值最大化的商业模式与高 ...
  • 图中为网秦CEO林宇易网科技讯 美国时间5月5日消息,国内移动互联网安全企业网秦今日在纽约交易所上市交易.开市钟敲响之前,网秦高管齐聚纽交所一楼交易大厅,讨论即将到来的开盘价格."应该在20美元左右."多名高管相互讨论.而开盘11.5美元的价格,开盘两分钟后随即破发,这让身在交易 ...
一周排行
  •   --解锁用户,需要使用dba权限 conn sys/1234 as dba; alert user scott account unlock; / --initcap方法,实现字符串首字符大写,其余字符小写,受空 ...
  • 经常上网的朋友可能会到过这样一些网站,一进入首页即时会弹出一个窗口,或按一个连接或按钮弹出,通常在这个窗口里会显示一些注意事项.版权信息.警告.欢迎光顾之类的话或作者想要特别提示的信息.其实制作这样的页面效果非常的容 ...
  • 在过去的一年中,互联网上的各大讨论区或者电子邮件的讨论列表都对微软的VB.NET以及C#的各种优越性做了探讨.这些讨论围绕的主要问题就是,我应该先学哪一个,VB.NET还是C#?? 我写这篇文章的目的就是想帮您解决这 ...
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml ...
  • 开源网管Cacti系列讲座有以下主题 (一)Cacti概述与应用示例 (二)Cacti安装与部署[上,下] (三)Cacti设备管理与模版应用 (四)Cacti的多种数据采集方式 (五)Cacti插件架构与插件安装 ...
  • 目前在linux开发一个分析实时路况的应用程序,在联合测试中发现程序存在内存泄露的情况. 这下着急了,马上就要上线了,还好发现了一款Valgrind工具,完美的解决了内存泄露的问题. 推荐大家可以使用看看.   Va ...
  •        这个项目也算很小,在大部分人看来没有什么.       之前问一位前辈,所谓的项目经验是什么,我写个贪吃蛇,坦克大战,俄罗斯方块算是吗,他说,要有数据库,有前台有后台.其实我之前也不知道有Java EE ...
  • <!DOCTYPE html> <!--HTML5列表的使用--> <html> <head lang="zh"> <meta charset ...
  •     导师安排我做一个小项目,其中涉及到利用Adapter作为ListView的适配器,为ListView提供数据.选中某一项后,要让这一项变成选中状态,也就是背景图片要换一下.下面我就用一个小例子来模拟.重点不在 ...
  • 前面的一节,介绍了如何组合使用Gallery和ImageView.但是,有的时候当你在gallery中点击一个图片,你可能不希望一个图片“突然地”在imageview中显示出来.例如,你可能希望给某个图片设置一些切换 ...