操作系统实现原理

更新于 3月28日  约 7 分钟

写这些东西的目的

本人虽然是计算机专业,但是读书时候对计算机系统科学并没有认真学习,工作之后才感觉到自己计算机基础知识的不扎实,虽然大家都是curd或者socket boy。但是对底层的知识如果没有一个了解,那么就不能更好的协助开发!

这个专栏是我对于操作系统的学习心得与笔记,另附上linux操作系统实现的代码

专栏分为几块
1 汇编基础知识
1.1 存储设备概述


1.1.1 内存地址编号与寻址

变量到底是个啥?
变量名和变量类型
变量名是汇编语言中的标号,标号又是啥?标号就是人性化的内存地址的表现样子,最终被编译器转换为一个物理内存地址(区别与虚拟内存地址)
变量类型是表名该变量在内存中占用的大小!

int a =4;

汇编就是
.a
 db 4;
 
访问变量,就是通过 变量的起始地址+变量类型的大小

内存中的栈与堆

1.1.2 寄存器

1.1.2 硬盘

1.2 汇编
1.2.1 标号

1.2 实模式

实模式是个啥?
实模式下的寄存器
2.1 实模式下内存寻址/分段机制
16位8086型号的cpu的寻址

2.2 实模式下的汇编指令讲解
    mov数据传输指令
    
    movs(b/w/d/x)系列集 用于字符串在内存中的拷贝需要搭配cld与std还有rep
    
    
    loop 循环指令
    
 
    db dw cbw 与 cwd指令
    
    convert byte to word
    convert word to double word
    
    
    cmp 比较 进行标志位的改变
    cmpsb cmpsw cmpsd
    
    j系列条件跳转指令
    
    jmp 无条件跳转指令
    
   
   
   
    运算类型汇编
    add adc inc dec sub mul div idiv
    
    
    位运算指令
    not or and xor 
    
    call与ret
    
    位移动指令 
    ror(rotate旋转 right)
    rol
    shr
    shl
    
    
    栈操作指令
    push pushf/pushfd pop popf/popfd
    
    
    
   lgdt 全局描述符设置指令
   sgdt
   
    
    中断指令
    int3 int 中断号
    
    into   中断溢出指令
    
    iret
    
    
    cli(clear Interrupt  flag)与sti
    改变flag寄存器的if标志位
    
    hlt 处理器停止执行指令,可以通过外部中断指令来唤醒cpu
    
    
    
    arpl调整段选择子的rpl值


1.2 保护模式

保护模式下的内存寻址
1.2.1 全局描述符
lgdt 与 sgdt


1.2.2 保护模式下的特权级

1.3 内存分页/虚拟地址

函数与汇编
函数名与标号一样,只是地址的人性化展示,最终会被编译器转换为一个实际的数字地址

//定义函数,这个函数本身不在栈里面存储
int abc(int a,int b){

int d;
return a+b;

}

.abc
db d
add a,b
mov eax,a
ret

//调用函数,需要利用到栈
abc(3,4)

push 4
push 3
call abc;//把当前地址入栈 然后跳转到abc地址处执行

1.6 i/o汇编

特权级概述

1.7 中断与 系统(函数)调用

    8259a编程
    利用0x15中断获取内存大小
    
    

2 内存管理模块
1.1 bitmap与地址池

3 任务模块(线程/进程)

3 文件操作系统

1.1 文件操作系统大览(布局篇)

1.2 硬盘驱动编写(异步的,中断)
内核层对文件的处理本就是异步进行的,读的时候会告诉驱动程序读取的扇面号(比如是读写磁盘)和需要读取的缓冲区地址,驱动程序向文件控制模块发送指令后就干别的了,当硬件完成了工作后会向cpu发送中断信号从而被内核捕获,内核会从中断点开始继续执行。

1.3 

线程与进程

进程回收(父进程子进程与init进程)

进程间通信

4 socket编程篇(网络编程/网络进程通信)
https://www.jianshu.com/p/f86... 高性能网络编程
i/o模型(同步/异步 阻塞/非阻塞)

https://baijiahao.baidu.com/s?id=1610863451630993378&wfr=spider&for=pc

阻塞io 是自己去阻塞的 把线程/进程 变成阻塞状态
5种网络编程模型
https://blog.csdn.net/qq_2910...
单点
多进程
多线程

几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。这给网络编程带来了一个很大的问题,如在调用send()的同时,线程将被阻塞,在此期间,线程将无法执行任何运算或响应任何的网络请求。

一个简单的改进方案是在服务器端使用多线程(或多进程)。多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接。具体使用多进程还是多线程,并没有一个特定的模式。

原文链接:https://blog.csdn.net/yyxyong...
select/poll
epoll

阅读 59更新于 3月28日

推荐阅读
目录