---- 第1步–ring0->ring1 开始第一个进程,我们使用iretd指令来实现由ring0到ring1的转移,转移成功后,就可以认为A进程在运行了。...每个进程都有自己的LDT.所以当进程切换时需要重新加载ldtr 多进程的实现–交替执行A和B进程 一个进程如何由“睡眠”态变成“运行”态?...---- 系统调用 用户进程因为特权级的关系,无法访问某些权限更高的内存区域, 只能通过系统调用来实现,它是应用程序和操作系统之间的桥梁。 用中断可以方便地实现系统调用。...实现一个简单的系统调用 操作系统给应用程序提供一个get_ticks()的系统调用,用来获得当前总共发生了多少次时钟中断。...系统调用的过程: - 1、“问”,告诉操作系统自己要什么; - 2、操作系统“找”,即处理; - 3、“回答”,也就是把结果返回给进程。
---- 我们希望自己的操作系统内核至少应该在Linux下用GCC编译链接。 Loader要做的事有两件:加载内核入内存、跳入保护模式。...,它只不过是一段执行中的代码,它与操作系统的代码没有本质区别。...从操作系统角度看,进程必须是可控的,这就涉及到进程和操作系统之间执行的转换。因为CPU只有一个,同一时刻要么是客户进程在运行,要么是操作系统系统在运行。...如果实现进程,需要一种控制权转换机制,这种机制便是中断。 要添加中断处理,主要的工作有两项:设置8259A和建立IDT。...以一个divide_error为例,它在kernel.asm中是一个导出符号,而exception_handler是在protect.c中定义的一个处理程序,因为在init_prot初始化了,所以当发生
在保护模式下,CPU有着巨大的寻址能力,并为操作系统提供了虚拟内存和内存保护。...如何实现由实模式到保护模式的转换 1、准备GDT 初始化GDT中各个描述符的信息。...通过调用门进行控制转移的特权级检查: ? 通过调用门和call指令,可以实现从低特权级到高特权级的转移,无论目标代码段是一致的还是非一致的。...操作系统通过维护一个页目录和一些页表(存放在物理内存的某个位置)来留意这些页面。...如果当前被访问的页面不在物理内存中,处理器就会中断程序的执行(通过产生一个页错误异常)。然后操作系统就可以从硬盘上把该页面读入物理内存中,并继续执行刚才被中断的程序。
---- 一个操作系统从开机到开始运行,大致经历引导->加载内核入内存->跳入保护模式->开始执行内核这样一个过程。...如果文件内容大于512字节(一个扇区),这时候就需要用到FAT表了。 FAT表有两个,FAT2可看做FAT1的备份,它们通常是一样的。 FAT的结构有点像一个位图。...每12位称为一个FAT项,从第2项开始表示数据区的每一个簇,FAT项的值代表的是文件的下一个簇号,但如果值大于或等于0xFF8,则表示当前簇已经是本文件的最后一个簇了,所以只需要一直在FAT表里找下去直到最后一个簇号就能把该文件在数据区的所有簇号找到从而读出完整的数据内容...如果值为0xFF7,表示它是一个坏簇。 ---- 加载Loader到内存 BIOS中的中断int 13h可以完成读软盘的任务,从而把文件加载到内存中。...从磁盘将数据读入es:bx指向的缓冲区中,每次读出一个簇,直到Loader文件的所有数据都读到缓冲区为止。
例如:当一个鼠标移动了,硬件鼠标中断现在的程序来处理鼠标移动(移动鼠标,等等)。中断导致控制权转移到一个中断处理程序。中断处理程序是处理中断的程序。每种类型的 中断都分配了一个中断号。...由中断指令引起的中断称为软中断。DOS使 用这些类型的中断来实现它的API。 许多中断处理程序当它执行完成时,将控制权返回给被中断的程序。它 们恢复寄存器,里面的值与中断发生之前的值相同。...IDT的作用是将每一个中断向量和一个描述符对应起来。 联系调用门我们知道,其实中断门或者任务门的作用机理几乎是一样的,只不过使用调用门时使用call指令,而这里我们使用int指令。...8259A是可编程中断控制器,通过向相应的端口写入特定的ICW(Initialization Command Word)来实现的,在写入ICW2时涉及与中断向量号的对应,这里IRQ8~IRQ15被设置成对应中断向量...中断或异常发生时的堆栈 ? ---- 保护模式下的I/O 保护模式下对I/O做了限制,用户进程如果不被许可是无法进行I/O操作的。主要通过IOPL和I/O位图来实现。
Linux 2.4内核中不知道什么是“线程”,只有一个“task_struct”的数据结构,就是进程。...Linux内核有一个系统调用指令clone(),这个指令产生一个调用调用的进程的复件,而且这个复件与原进程使用同一地址空间。LinuxThreads计划使用这个系统调用来提供一个内核级的线程支持。...Native POSIX Thread Library 一个操作系统比较全面的支持线程是需要改内核的,怎么干改内核这个艰苦卓越的工作?Linux是开源、免费的,谁愿意来干这个活?...所以说Linux下通过NPTL创建的线程是内核线程,他会在内核创建一个线程结构供处理器调度,也就是所谓的1:1模型。...和baidu-rpc的做法 当然,这部分不是Linux做的,用户程序可以在内核线程的支持下实现 参考资料 The Native POSIX Thread Library for Linux Introducing
建立输入缓冲区 建立一个缓冲区,让keyboard_handler将每次收到的扫描码放入这个缓冲区,然后建立一个新的任务专门用来解析它们并做相应处理。...在实模式下,我们通过BIOS中断来实现打印字符。 在保护模式下,我们在GDT中建立了一个段,它的开始地址0xB8000,通过段寄存器gs对它进行写操作,从而实现数据的显示。...通过端口操作设置相应的寄存器就可以了。 ---- TTY任务 在TTY任务中执行一个循环,这个循环将轮训每一个TTY,处理它的事件。 ?...printf()的实现–可变参数 C调用约定,后面的参数先入栈,并且由调用者清理堆栈。 假设我们调用printf(fmt, i, j); 则堆栈情况将如下图: ?...,然后指定一个索引,执行sys_table相应的函数就可以了。
---- 概述 实现一个基于Intel x86的32位操作系统。 ---- 环境搭建 Ubuntu虚拟机。..._64 -fda a.img 配置Bochs模拟器 Bochs很强大,可以用来调试操作系统。...,比如jpeg文件格式以0xFFD8作为图像数据的开始标记),则BIOS认为它是一个引导扇区。...控制权的意思就是ip指针移到这个地方,CPU开始执行这里的代码逻辑。到此为止,计算机不再由BIOS中固有的程序来控制,而变成操作系统的一部分来控制。...TCP/IP 库提供了可移植处理Endian格式问题的方法的C函数。例如:htonl() 函数把一个双字(或长整形)从主机格式转换成了网络格 式。ntohl()函数执行一个相反的交换。
Fuchsia是Google内部孵化出来的一套新的全部开源操作系统。...这套系统是一套完全不基于Linux开发的系统,从它的能力和目标来看,他的目标是统一从高端嵌入式设备,手机,手表,汽车,平板电脑,台式电脑的大一统操作系统。...ARM端 因为系统支持的ARM64,这么来讲,一些低端的老的ARMv7指令集的CPU, 新操作系统不会支持的。 这就非常明确了,这套系统嵌入式系统的定位时中高端的嵌入式设备。...简而言之就是 在用户态实现一个linux的ABI,类似于Windows 里面的Posix Subsystem, OS/2 subsystem。...在疫情期间,Chromebook的增长远远高于Windows的系统。 微软的操作系统部门,如果不做大的调整,基本上会在这场大战中落败。
Hi~朋友,关注置顶防止错过消息 接下来几篇我都会写一下在实现操作系统相关功能涉及到的知识点,最后会实现一个mini的OS,如果感兴趣可以关注公众号置顶一波,一起成为有深度的Coder。...cld用来将标志寄存器的DF位置0,DF为的作用用来控制内存的方向,DF为0表示内存向高地址增加,DF为1表示内存向低地址减小。...在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后。 例如,以下三条指令执行后,SI自动加1,更新为0001H,此处为Intel的语法。...CLD MOV SI, 0000H LODSB ;将字串中的SI指针所指的一个字节装入AL b、w、l的区别?...这里只假设键盘缓冲器里没有数据,首先向0x64端口写入一个0xd1,表示开始向P2端口写入数据,紧接着向键盘输入缓冲器0x60端口写入0xdf(具体写向P2输出端口的数据),其二进制表示0b11011111
操作系统进程的实现---中---05 内核级线程实现 核心级线程的两套栈,核心是内核栈… 整个故事要从进入内核开始——某个中断开始… 切换五段论中的中断入口和中断出口 switch_to难点分析 另一个故事...结构: 子进程进入A,父进程等待… 终于可以让A执行了… 小结 ---- 内核级线程实现 进程=资源+执行序列。 执行序列=线程。...进程需要进入内核执行,所以进程里面的执行序列其实就是一个内核级线程。 而所谓对资源的管理,其实主要指的是对内存资源的管理。 因为要实现进程,首先需要实现一个内核级线程,然后再是对内存的管理。...INT 0X80实际上会去调用system_call ,因此还需要将system_call地址压入栈中,一会进入内核中后,首先弹出system_call地址,然后去执行 操作系统接口和调用–02...用栈切换,因为tss中的信息可以 写到内核栈中 下面讲解的是基于TSS完成进程切换的过程 在一个多任务环境中,当发生了任务切换,需保护现场,因此每个任务的应当用一个额外的内存区域保存相关信息,即任务状态段
操作系统进程的实现---04 温故知新 计算机硬件、操作系统、启动、接口… 知新 进程概念 管理CPU,先要使用CPU… 管理CPU的最直观方法 多道程序、交替执行,好东西啊!...多个执行序列+一个地址空间是否实用? 开始实现这个浏览器…、 Create? Yield?...线程有有用,通过上面浏览器的例子也可以看出来,线程具有下面两个特点: 共享进程资源 切换代价小 ---- 开始实现这个浏览器…、 在没讲线程之前,我们的认识中一个进程同时只能去执行一个指令序列,而了解到线程的存在后...操作系统中一个线程对应着一个TCB(Thread Control Block),叫做线程控制模块,控制着线程的运行和调度。...如果是采用用户级线程实现的浏览器,那么一般一个标签页对应一个用户线程,如果其中一个用户线程阻塞,那么会导致进程切换,即当前浏览器进程失去了对CPU的使用权,所以一旦一个标签卡住了,其他标签也动不了
外部中断 外部中断来自CPU的外部的某个硬件,因此又被称为硬件中断,比如网卡收到了一个数据包,它就会通知CPU,CPU得到通知便将数据拷贝到内核缓冲区。...软中断 软中断就是由软件主动引发的中断,可以认为是主动引发的,从而实现在CPU的支持下实现某种功能。...比如: int 0xxx 表示进行系统调用 int3 我们用gdb 或bochs 调试程序时,实际上就是调试器fork 了一个子进程, 子进程用于运行被调试的程序。...可被修复的异常 比如操作系统的缺页异常 终止程序的异常 中断描述符 一个中断源就会产生一个中断向量,每个中断向量都对应中断描述符表中的一个门描述符,任何中断 源都通过中断向量对应到中断描述符表中的门描述符...不同特权级别下处理器使用不同的栈,至于中断处 理程序使用的是哪个栈,要视它当时所在的特权级别,因为中断是可以在任何特权级别下发生的。
当今的操作系统如何工作?Abraham Silberschatz、Peter Baer Galvin和Greg Gagne将带你尽快了解计算机操作系统的所有关键概念。...采用流行的Java编程语言,此新版本以通俗易懂的方式引导你全面了解操作系统的理论基础,从而使你在进行更高级的计算机工作时能应用到许多系统中。...《国外优秀信息科学与技术系列教学用书·操作系统概念:Java实现(第7版翻译版)》第七版重新作了更新,包括当前最新的主题、应用及设计,以帮助你缩小理论与实践之间的差距。...全书结合客户机一服务器模式,带你逐步学习编程的主要内容。 无论你是新学Java,或是已经采用了Java,你都将欣赏Java Primer所包含的富有思想的内容。...版式设计使你更方便学习章节、丰富的例子、编程练习等,以帮助你吸收和加强所学的知识。通过这些全面的支持,你将有信心尽快进入操作系统设计的世界。
操作系统文件使用磁盘的实现---20 再一次使用磁盘,通过文件使用 file_write的工作过程应该就是… file_write的实现 create_block算盘块,文件抽象的核心 m_inode,...有了操作数据的起始偏移地址,就可以根据inode中保存的当前文件对应的盘块号索引,计算出当前要操作的数据位于哪一个盘块中。 然后由盘块号和buf等信息形成request请求,加入电梯队列中。...---- file_write的实现 首先计算是对文件进行追加操作,还是读写当前文件读写指针所处的位置。...不光一个普通有数据的文件叫做文件,一个设备文件也叫做文件。...如果当前inode代表一个设备文件,那么inode中保存的应该是主设备号和次设备号。
Talos Linux 是一个专为 Kubernetes 环境设计的开源操作系统,遵循 Apache 2.0 许可证。...Talos Linux 采用了 Linux 内核,但在用户空间部分进行了极大的简化和定制,旨在提供一个最小化且高度安全的操作系统环境,以运行和管理 Kubernetes 集群。...使用 Talos Linux 是一个专为运行 Kubernetes 集群设计的不可变操作系统。其设计目标是简化和增强 Kubernetes 的安全性和管理能力。...你可以编写脚本或使用工具来调用这些 API 实现自动化管理。...总结 Talos Linux 是一个高度专业化的操作系统,专为 Kubernetes 环境优化和设计。
Minix 介绍 Minix 是 Mini Unix 的缩写,一个迷你版类 Unix 操作系统 (约 300MB)。...Tanenbaum )教授所开发的一个类 UNIX 操作系统,开发初衷是方便教学使用(因为 AT&T 推出 Version 7 Unix 之后,将 Unix 源码进行了私有化)。...解释了为何他认为现有的操作系统不安全: 最严重的可靠性及安全问题是与操作系统相关的那些。...但事实恐怕不是我们以为的那样,你可能不知道,但在英特尔近些年推出的所有处理器中都运行着一个操作系统。...这就使得 MINIX 拥有至高无上的地位,而且只要你的电脑使用的是英特尔近些年推出的处理器,都有一个它在默默运行,这使得它成为名副其实的世界上最流行的系统。
页表项和目录项都是32bit,记录一个页的地址只需要20位,其余的12bit用作标记位。 ?...按照内存规划,把虚拟 3G - 4G 内存映射到 物理0-1M 内存上 最后一个页目录项填入了页目录表的物理地址,方便后续使用虚拟地址访问页表 涉及的寄存器 CR0 0位是保护允许位PE(Protedted...; 下面将页目录项0和0xc00都存为第一个页表的地址, ; 一个页表可表示4MB内存,这样0xc03fffff以下的地址和0x003fffff以下的地址都指向相同的页表, ; 这是为将地址映射为内核地址做准备...+ 0xc00], eax ; 一个页表项占用4字节,0xc00表示第768个页表占用的目录项,0xc00以上的目录项用于内核空间, ; 也就是页表的0xc0000000~...已经在上面通过eax赋值为0x101000,也就是第一个页表的地址 add edx,4096 ; edx inc esi loop .create_pte ;创建内核其它页表的
1987 的今天,Minix 诞生了 Minix 介绍 Minix 是 Mini Unix 的缩写,一个迷你版类 Unix 操作系统(约 300MB)。...Tanenbaum )教授所开发的一个类 UNIX 操作系统,开发初衷是方便教学使用(因为 AT&T 推出 Version 7 Unix 之后,将 Unix 源码进行了私有化)。...解释了为何他认为现有的操作系统不安全: 最严重的可靠性及安全问题是与操作系统相关的那些。...但事实恐怕不是我们以为的那样,你可能不知道,但在英特尔近些年推出的所有处理器中都运行着一个操作系统。...这就使得 MINIX 拥有至高无上的地位,而且只要你的电脑使用的是英特尔近些年推出的处理器,都有一个它在默默运行,这使得它成为名副其实的世界上最流行的系统。
操作系统的设计目标 操作系统的设计目标可以分为两种: 1、用户目标:方便使用、容易学习、可靠、安全以及流畅等 2、系统目标:易于实现与维护、灵活,可靠、不易出错、高效等。...操作系统的机制与策略 如何有效控制操作系统的复杂度?...需要充分考虑高内聚和低耦合 抽象:在模块化的基础上,将接口与内部实现分离。...分层:一个模块只能和同层模块以及相邻的上下层模块进行交互,不能跨层交互。 层级:首先将一些功能相近的模块组成一个具有清晰接口的自包含子系统,然后再将这些子系统递归地组成一个具有清晰接口的更大系统。...操作系统的内核架构 参考资料 《现代操作系统:原理与实现》陈海波 夏虞斌等著 转载请注明来源:https://www.longjin666.top/?p=1162
领取专属 10元无门槛券
手把手带您无忧上云