操作系统的认识-随便记一些

  1. 进程有一个内核空间,有一个用户空间。一般来说,内核地址空间是虚拟地址的低地址,用户地址空间是虚拟地址的高地址。他们共用一份页表,内核空间的页表可以为identical映射,用户空间的页表映射在fork的时候,由内核指定。内核空间中包含了系统调用的代码、内核栈等。进程的内核空间与存放内核代码的物理内存空间是不一样的。后者存放了操作系统的一堆等待执行的代码,比如进程调度、内存管理、系统调用的代码等。普通进程可以通过内核空间访问到系统调用的代码,但不会访问到进程调度的代码。

  2. 内核态不止一个,在ARM中有SYS, SVC, IRQ, ABT等。开机reset后进入SVC态,并且运行固定物理地址的代码,在ARM中是0x10000,这些代码常常是写在ROM中的代码,它完成一些BIOS工作,然后从硬盘中找到启动盘,将启动盘中的操作系统加载并执行。

  3. 我将操作系统最初运行的代码称为reset_handler。reset_handler最初常运行在实模式下,即没有启用MMU的虚拟内存功能,在该模式下完成写向量表、分配栈指针等任务。在实模式下只能进行是不能进行过程调用的(比如在汇编代码调用一段C语言编译的代码),这是因为过程调用BL的目的地址是虚拟地址,而此时还未开启虚拟内存功能。然后在内存中写PROC0——操作系统内核的第一个进程的页表,写页表基址寄存器、页表控制寄存器等启动虚拟内存模式。

  4. 进入各个内核态以后,执行的代码由中断向量表给定,reset_handler的一个任务就是写中断向量表(在ARM中,开头对应物理地址0x0,向量表的每一项如何填写硬件厂商有明确的规定),还有一个任务是设定每个内核态的栈空间与栈指针。SVC的栈指针指向PROC0的内核栈。

  5. 内核维护一个running的指针,它指向当前正在运行的进程,最初为PROC0。当进行进程切换的时候,就把running指向新的进程的PCB。PCB是存放在操作系统内核的地址空间的一些数据结构,比较重要的内容包括 cspr, ksp, kstack, upc, usp, pagepointer等(保存的机器状态,内核栈指针,内核栈,用户态的pc,用户态的sp,页表指针)。

  6. 系统调用其实就是内核空间里的一堆代码,以共享库的形式存在。进程先在r0-r3中写入系统调用的参数,然后通过SWI指令进入内核态(SVC),SVC_handler进行路由,选择一段系统调用代码执行。

  7. 进程有一个内核栈,有一个用户栈。这一机制的实现得益于CPU在不同权限下,有不同的sp指针。用户编程时操作的是用户栈。内核栈是PCB中的一个数组,它主要用来保存机器状态。当在内核态进行进程切换的时候,此时sp指向pre_running的内核栈,然后在pre_running的内核栈中保存机器状态,将PCB中的ksp指向保存后的sp。把内核态的sp指向new_running的内核栈,恢复机器状态。这些工作是底层的机制完成的。上层的策略只负责选择哪个进程的PCB作为running,被选择的PCB只能来自ready队列。

  8. 进程切换开销大的最主要原因是要刷新TLB,造成许多cache miss。

  9. 当该页表项没有映射的物理地址的时候,页表项的某一位为0。缺页中断的捕捉正式基于此,此时进入ABT特权模式,进行缺页中断的处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值