操作系统实现原理

柯里磷火
• 阅读 1763

写这些东西的目的

本人虽然是计算机专业,但是读书时候对计算机系统科学并没有认真学习,工作之后才感觉到自己计算机基础知识的不扎实,虽然大家都是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

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这