1、内存分布示意图

再附一张,描述符表。

主要说一下全局描述符中的内容:

每一项都是8个字节。

第一项为全0,没有被使用。

第二项为存储段描述符,DT=1,DPL=00,代码段描述符,基地址是0,段界限是16MB。

第三项为存储段描述符,DT=1,DPL=00,数据段描述符,基地址是0,段界限是16MB。

第四项为全0,没有被使用。

第五项为系统段描述符,DT=0,DPL=00,进程0的任务状态段,基地址指向进程0的TSS的地址,段界限是进程0的TSS的长度。

第六项为系统段描述符,DT=0,DPL=00,进程0的局部描述符表,基地址指向进程0的LDT的地址,段界限是进程0的LDT的长度。

第七项 以后类推 进程1 进程2 ......

最后形成如下图:

中断描述符表如下:

每一项都是门描述符,分为三种,一是中断门,TYPE为110,DPL为00。二是陷阱门,TYPE为111,DPL为00。三是系统门,TYPE为111,DPL为11。seletor都是0x08,选择了代码段描述符,基地址是0,段界限是16MB。偏移就是具体中断处理函数的偏移。

进程0的LDT如下:

第一项为全零。

第二项为存储段描述符,DT=1,DPL=11,代码段描述符,基地址是0,段界限是640KB。

第三项为存储段描述符,DT=1,DPL=11,数据段描述符,基地址是0,段界限是640KB。

进程1的LDT如下:

第一项为全零。

第二项为存储段描述符,DT=1,DPL=11,代码段描述符,基地址是64MB,段界限是640KB。

第三项为存储段描述符,DT=1,DPL=11,数据段描述符,基地址是64MB,段界限是640KB。

进程2的LDT如下:

第一项为全零。

第二项为存储段描述符,DT=1,DPL=11,代码段描述符,基地址是128MB,段界限是640KB。

第三项为存储段描述符,DT=1,DPL=11,数据段描述符,基地址是128MB,段界限是640KB。

以此类推。

但进程2后来执行了如下代码:

void init(void)

{

int pid,i;

...

if (!(pid=fork())) {//进程1创建进程2

close(0);

if (open("/etc/rc",O_RDONLY,0))

_exit(1);

execve("/bin/sh",argv_rc,envp_rc);

_exit(2);

}

if (pid>0)

while (pid != wait(&i))

/* nothing */;

...

}

那么:shell的LDT如下:

第一项为全零。

第二项为存储段描述符,DT=1,DPL=11,代码段描述符,基地址是128MB,段界限是shell程序的实际长度。

第三项为存储段描述符,DT=1,DPL=11,数据段描述符,基地址是128MB,段界限是64MB(这样页目录项会占从32~48的位置)。

2、下面介绍80386寄存器

内核态,CS选择器 TI=0,表示从GDT表中选择,RPL=00,内核态,描述符索引是1,选择GDT表中第二个代码段描述符。

内核态,SS,DS,ES,FS,GS选择器 TI=0,表示从GDT表中选择,RPL=00,内核态,描述符索引是2,选择GDT表中第三个数据段描述符。

用户态,CS选择器 TI=1,表示从LDT表中选择,RPL=11,用户态,描述符索引是1,选择LDT表中第二个代码段描述符。

用户态,SS,DS,ES,FS,GS选择器 TI=1,表示从LDT表中选择,RPL=11,用户态,描述符索引是2,选择LDT表中第三个数据段描述符。

LDTR选择器,TI=1,表示从GDT表中选择,RPL=00,内核态,描述符索引和进程有关,进程0的描述符索引是3,进程1的描述符索引是5,选择GDT表中第四个,或者第六个系统段描述符。依次类推。

TR选择器,TI=1,表示从GDT表中选择,RPL=00,内核态,描述符索引和进程有关,进程0的描述符索引是4,进程1的描述符索引是6,选择GDT表中第五个,或者第七个系统段描述符。依次类推。

描述符高速缓存寄存器和LDTR高速缓存寄存器和TR高速缓存寄存器,0-31存放段首地址,0-19存放段界限,0-11存放段属性。就是分别对应上面取得的存储段描述符和系统段描述符(也是64位)。

GDTR,0~31位存放的是内存分配图中GDT(全局描述符表)的基地址,0~15位存放的是内存分配图中GDT(全局描述符表)的界限。

IDTR,0~31位存放的是内存分配图中IDT(中断描述符表)的基地址,0~15位存放的是内存分配图中IDT(中断描述符表)的界限。

3、特权级切换的本质:

中断int 0x80从特权级3进入特权级0,并把ss,esp,eflags,cs,eip等寄存器保存在特权级0的堆栈中(TSS的esp0,ss0),iret从特权级0返回特权级3。

由于seletor都是0x08,表示是内核态的cs选择器,从GDT中取描述符,所以中断处理程序已经处于0特权级,内核态。压栈是ss也0x10,后来ds,es,fs,gs也变成了0x10。

所以特权级变化的本质是,cs,ds,es,fs,gs,ss的不同,特权级0从GDT中取得描述符,前面这些寄存器后3位为000,描述符特权级为00;特权级3从LDT中取得描述符,前面这些寄存器后3位为111,描述符特权级为11。

4、进程切换的本质:

把当前的寄存器状态保存在当前进程的TSS中,把要切换的进程的寄存器恢复成要切换的进程的TSS中的内容。要着重理解LDTR选择器,TR选择器。LDTR选择器在GDT表中找出了当前进程的LDTR高速缓存,也就是LDT表的基地址和界限。TR选择器在GDT表中找出了当前进程的TR高速缓存,也就是TSS表的基地址和界限。

5、中断的本质:

中断和特权级切换的过程类似,只是中断可能发生在用户态或者内核态,而特权级切换只发生在用户态。当中断发生在内核态时,压入特权级0堆栈的cs,esp,eflags,cs,eips是内核态的寄存器值。

6、创建进程的本质:

获取了一页内存如下图:

(1) task_struct是复制父进程的数据得来的。会修改pid,father,tss中数据eip,cs指向的是父进程将要执行的下行代码。ldt中数据直接继承下来,后面还要修改。

(2)设置子进程ldt代码段和数据段的基地址为nr * 64MB,段界限为640KB。

(3)设置进程的页目录项,进程0是第一项;进程1是第16项,进程2是第32项。先获取一页内存,再复制父进程的页表项到这个内存中。这样父子进程共享实际内存。

(4)子进程也继承了父进程的pwd,root,filp。计数加1。

(5)设置tast_stuct中的tss,ldt在gdt中系统段描述符。把tss,ldt的基地址和段界限放入gdt中。

父进程fork返回非0,子进程fork返回0,但都是执行fork后面的代码,可以通过if语句来区分。

7、执行程序的本质:

首先释放原进程页目录项和页表项,然后重新建立起页目录项和页表项,最后返回到用户空间执行。具体参考通过进程2加载shell进程,详解execve。

8、进程调度的本质:

一种是时钟中断,每10ms一次,但是只有发生时钟时,处于用户态,才会产生进程切换。

一种是进程在内核态主动调用schedue()。

9、schedue函数:

找出counter最大的就绪进程运行。如果没有就绪的进程就切换到进程0怠速。如果有就绪的进程但counter值都为0,那么就重新分配时间片。

10、进程状态TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE。

TASK_INTERRUPTIBLE如果当前进程接收到信号,那么schedue时会把这个进程变成TASK_RUN。但是TASK_UNINTERRUPTIBLE,是不会理睬信号的。

TASK_UNINTERRUPTIBLE只能由wake_up唤醒,变成TASK_RUN。

一般在pause时会把进程设置为TASK_INTERRUPTIBLE。在sleep_on时会把进程设置为TASK_UNINTERRUPTIBLE。

11、信号的本质

发送信号:就是在目标进程的signal,对应的设置为1。

接收信号:一种在系统调用返回之前检测当前进程是否接收到信号;另一种方式是时钟中断发生后,其中断服务程序执行结束之前,检测当前进程是否接收到信号。

会根据signal检测是否接收到信号,并根据signal找到current->sigaction + signr - 1找到对应的信号处理函数。

从系统调用返回后先执行信号处理函数,然后再转到发生系统调用的下一条指令执行。参考Linux内核设计的艺术-进程间通信-信号。

12、管道的本质

管道的本质是操作系统在内存中为每个管道开辟一页内存,给这一页内存赋予了文件的属性。这一页内存由两个进程共享。

inode->i_size=get_free_page();

f[0]->f_inode = f[1]->f_inode = inode;

13、put_page的本质:

unsigned long put_page(unsigned long page,unsigned long address)

address是线性地址,page指向页面的地址。

执行完函数后,会建立从线性地址到页面的地址的映射。也就是说建立了页目录项和页表项。然后线性地址-->分页机制-->实际物理页面的地址。

14、write的本质

首先写入缓冲区,b_dirt为1,然后再同步到硬盘中。

15、bread_page的本质

首先从硬盘的数据写入缓冲区,然后再复制缓冲区的数据到新申请的页面。

16,Linux2.4,申请的页面(换入)用于存放可执行的代码,用于存放要同步到硬盘的数据,用于task_struct,页表。应该是用buffer_head统一管理。有申请就有释放,就有页面不够用的情况,就要释放,以便能重新用于申请。这就是所谓的换出。

linux0.11中断描述符,Linux 0.11总结相关推荐

  1. Linux 0.11 内核解析:中断相关(1)asm.s文件中断处理分析

    0 源代码 有两个版本的,一个是带中文注释,Intel格式的:一个是不带注释是AT&T格式的. Linux 0.11 中文注释版 Linux 0.11 源码,基于<Linux内核完全注释 ...

  2. Linux 0.11内核分析04:多进程视图

    目录 1 进程概念的引入 1.1 使用CPU的直观想法 1.2 直观用法的缺点 1.3 直观用法的改进 1.4 进程的概念 1.4.1 保存程序执行状态 1.4.2 进程与PCB 1.5 Linux ...

  3. linux kernel的中断子系统之(三):IRQ number和中断描述符【转】

    转自:http://www.wowotech.net/linux_kenrel/interrupt_descriptor.html 一.前言 本文主要围绕IRQ number和中断描述符(interr ...

  4. Linux 0.11内核分析03:系统调用

    目录 1 概述 1.1 什么是系统调用 1.2 为什么需要系统调用 2 系统调用基础设施 2.1 安装系统门 2.1.1 中断描述符 2.1.2 中断描述符安装函数 2.1.3 安装0x80系统门 2 ...

  5. Linux 0.11 fork 函数(二)

    Linux 0.11 系列文章 Linux 0.11启动过程分析(一) Linux 0.11 fork 函数(二) Linux0.11 缺页处理(三) Linux0.11 根文件系统挂载(四) Lin ...

  6. Linux 0.11内核分析02:系统启动

    目录 1. 内核镜像的构建 1.1 内核源码结构 1.1.1 boot 1.1.2 fs 1.1.3 include 1.1.4 init 1.1.5 kernel 1.1.6 lib 1.1.7 m ...

  7. linux 0.11 init/main.c初始化部分

    在head设置了页表.GDT和IDT之后,然后就进入了main程序,这里首先介绍一些参数: ORIG_ROOT_DEV,该参数是读取0x901FC的两个byte读取的数据,这两个byte就是boots ...

  8. linux 0.11 内核学习 -- bootsect.s, 万里长征第一步

    呵呵,终于将linux 0.11 下面的boot文件夹下的三个文件读完,下面是相关注释,没有汇编基础的人也是可以读的.废话少说,下面就是linux的源码了. 参考资料 Linux内核完全注释.pdf ...

  9. linux如何切换任务,linux 0.11中简单的任务切换中遇到的问题

    linux 0.11中简单的任务切换中遇到的问题 发布时间:2012-03-04 09:49:45来源:红联作者: 最近在学习linux0.11,用的是赵迥博士的一本书,其中有一个模仿Linus 当年 ...

最新文章

  1. 用户名字符串和密码字符串登录验证
  2. 我所知道的网络管理软件
  3. 使用python的Flask实现一个RESTful API服务器端
  4. linux进程增删改查,iptables的增删改查
  5. oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)
  6. 中国十大科技进展2项,世界十大科技进展6项生物相关;相比工程,生物与国际差距还是较大...
  7. Browser增加下载路径选择功能
  8. 算法的优缺点_朴素贝叶斯算法的优缺点
  9. PDI(KETTLE)学习笔记
  10. 【数据库原理及应用教程(第4版|微课版)陈志泊】【第六章习题】
  11. 条形码编码规则及标准
  12. html5制作旋转正方体,html5—旋转立方体
  13. 《大话设计模式》读后感
  14. Sci-Hub丨科研文献实时更新
  15. win10高性能模式
  16. 在h5页面中调起支付宝小程序中的某一个页面以及URLScheme 之 支付宝
  17. MPU6050陀螺仪 GY-25模块调试
  18. Python IDE开发环境
  19. pdf压缩的网站?pdf文件在线压缩?在线压缩pdf文件大小?pdf文档压缩,在线压缩pdf文件大小,压缩pdf大小的方法?
  20. ae怎么设置gpu渲染_有玩AE的吗?求教GPU渲染问题!!

热门文章

  1. matlab中rms代表什么_电气施工图纸中BV、ZRBLV和TC、SC符号代表什么?
  2. 台湾大学公开课《概率》第五周一道不会作的作业题 ,一种看不懂的解法
  3. mysql 回滚_一个集审核、执行、备份及生成回滚语句于一身的MySQL运维工具
  4. Unity3D技术之优化图形性能绘制调用批处理浅析
  5. c#中onclick事件请求的两种区别
  6. LVS+keepalived高可用负载均衡集群部署(一) ----数据库的读写分离
  7. Linux学习:第一天,
  8. 关于按字寻址和按字节寻址的理解
  9. linux x64下安装oracle 11g
  10. 现实世界的Windows Azure:Quest Software and OnDemand Migration for Email