浅谈Linux操作系统是如何工作的?

    SA****243 石润成

    操作系统工作的三个关键基础分别是:存储程序计算机、堆栈(函数调用堆栈)机制和中断机制;

    操作系统其实也是一个程序,linux的操作系统主要由汇编和C语言组成。

    那么从整个角度考虑,程序是需要被装载到存储器中的,当我们将程序代码编译成ELF格式时,里面包含了整个程序运行时所需要的各种信息(代码段、数据段等等),存储程序计算机存在哈佛结构和冯诺依曼机构,结构不同,程序各段的存储位置也不相同。

    当程序被加载到内存中运行时,是通过CPU将一条一条的指令从代码存储器中读取出来的执行的,如果不需要多任务,且没有函数调用什么的,CPU只需一条一条指令的读取运行下去就可以。明显这种机制是不利于程序模块化,这样有了堆栈,就可以将函数代码进行隔离,请参考http://blog.csdn.net/ustc_max/article/details/8917979,这里再多加一点就是,CS:EIP(CS是包含程序指令的的段,EIP为指令段偏移量)为指向当前CPU所要执行的指令, 而EBP和ESP用来保护一个函数的栈基地址和栈顶,主要保存函数的返回地址和函数的内存局部变量参数,这样当函数调用结束后能够及时返回上层调用函数的下一句执行语句继续执行。

    但随着计算机越来越复杂,有时候会有一些突发事件需要及时处理,这就诞生了中断机制,linux操作系统的中断通常分为同步中断和异步中断,主要通过IDT中断描述符表来描述,IDT包括中断和异常向量,当发生了一个中断或者异常时,系统会根据中断向量号来调用相应的中断异常程序,那么中断的过程中,同样会涉及中断现场保存和恢复的机制,由堆栈完成,涉及的寄存器有idtr寄存器用来指向IDT表项的第i项,找到对应的段选择符,根据段选择符在GDT全局描述符中找到自己的段描述符,也就知道了中断或异常的程序地址,故障发生时保存引起故障的指令地址到cs和eip中,并在栈中保存eflags,cs和eip内容,若有硬件出错码,则也保存在栈中,然后执行中断程序代码,当处理完时,通过iret返回,中断也分优先级用于中断嵌套,整个中断在内核中发生。

   为了实现多任务操作系统,这就有了进程和线程,这里只讨论进程,多任务就意味着多个程序并发的执行,并发并不意味着并行,而是在不同的进程之间切换,中断处理与进程切换有一个明显的差异就是,中断处理是一个内核控制进程,它是在单个进程中发生的,因而比进程要轻得多,从linux的内核代码分析,进程的描述符结构是task_struct,进程是以链表形式存储的,且根据进程状态的不同分别形成不同的链表存储,而内核对进程的切换和调用的关键点在于schedule()这个函数,这个函数的主要功能是切换页全局目录以安装一个新的地址空间以及切换内核态堆栈和硬件上下文,其中关键宏switch_to宏完成进程你内核态和硬件上下文的切换。为了使不同进程之间公平的竞争CPU,Linux最常用的机制是动态优先级机制,进程的优先级会随着时间和自身的优先级改变,另外linux还提供了进程通信机制,让进程运行更加灵活。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值