看了谭玉刚的视频,为了防止以后忘记,特此先把现在的理解记下来,希望以后还能记得。这是链接
看完之后回来总结的,可能忘了一些东西或者表述不当。

p1 电与二进制
讲解了电与二进制。解释了如何用二进制来进行数据表示和处理。

p2 二进制算术和布尔代数
讲了二进制算术和布尔代数。

p3 晶体管的构成逻辑
解释晶体管,以及如何构成简单的逻辑门。即几个不同的电流输入情况制造想要的输出结果(有点还是没电),比如输入两个电流,输出是1,只输入一个电流,输出0。

p4 计算原理
通过简单的电路组合实现加法器。

p5 我们来造个cpu吧
通过回路设计实现电路存储,该电路可以保存0或1,于是便可以制造寄存器了。同时通过数个开关控制不同的寄存器打开与关闭(输入与读取),也就是通过地址线进行控制的雏形了。以及解释cpu的组成部分。
一条机器指令对应一个电路,这个电路执行响应功能,比如把总线中的值放到某个寄存器,是哪个寄存器取决于线路的开关。
寄存器也是一个线路,根据开关可以确定输出的是1或者是0。

p6 指令运行和计算机基本构成以及启动过程
解释了程序的执行过程:拿指令、读指令、写回结果。以及cpu的历史。
介绍了从通电开始计算机的工作步骤:通电自建完成后,执行预先写好的指令,也就是bios中的指令,bios会把基本的中断处理程序放到内存中的起始地址,这些中断控制着键盘的输入,显示器的显示等,这也可以理解为为什么他叫做基本输入输出系统了。
之后,bios会去硬盘的第一扇区,也就是零号扇区寻找启动程序,把它拉到内存上执行,然后bios的工作就结束了。也就是说,第一扇区的内容是电脑首先执行的,通常情况下这部分扇区的工作内容就是把硬盘上的操作系统放到内存中的0x7c00开始执行。
之后下载了相关编辑工具、汇编编译器工具,硬盘写入工具准备进行实操。

p7 运行第一个汇编程序
进行实操,实现功能为计算机启动,在电脑屏幕上输出字符串。
步骤:写好汇编程序,编译好,通过硬盘写入工具写到U盘的第一扇区上,也就是零号扇区。完毕。
原理:第一扇区是首先运行的程序。把程序放到那计算机一启动就开始运行了。

p8 硬盘的MBR分区
p7是在虚拟机上运行,p8真机上进行实操。将来MBR分区和硬盘的原理。

p9 详解汇编代码让显示器打字的过程和代码
对p7的汇编代码进行讲解。
主要原理很简单,是显示器会定时扫描内存中0xAFFFF-0xBFFFF这128k的地址空间,只需要把你要显示的字符串和显示模式等相关信息放入这一块内存就可以了。在代码中字符串可以写成字母的形式,但是要用引号括起来,然后编译器就知道把你的字母换成ASCII码的形式,如果直接代码中直接写ASCII的形式那么就不用引号括起来了。
还有一个要点是段寄存器,8086定址的方式是段寄存器的值x16+IP地址寄存器的值。往内存空间写入数据时要指定段寄存器的值。

p10 认识汇编和mov指令
讲解学汇编的作用:更容易理解高级语言。以及讲解了mov指令。

p11 深入mov指令和内存分段
讲解了8086地址内存分段的由来及结果,分成16段,每段64k(好像也可以有其他的划分方式)
指出了在p7的实操中,由bios把他写的代码加载进内存执行,但并没有指定是加载到内存中的哪里,实际上这是由bios决定的,通常情况下就是0x7c00,也就是所,bios在把程序移动到0x7c00的时候,自动把cs、es、ss的值设为0x7c00,那么程序中的数据和代码的地址就是正常的,比如在汇编中我们的mov指令在第五个字节,那么按照0x7c00:5就可以在内存中访问到真实的指令了。需要说明的是,我们要往内存写东西,那得指定写入位置,即指定段的位置,写在一个段寄存器上,还需要指定偏移量的位置。

p12 如何正确地调试汇编程序
下载bochs汇编程序,甚至可以看bios的代码。从后面介绍中断的内容得知,调试程序主要利用了调试中断,这是cpu自带的。

p13 如何git代码进行管理
详细介绍了我们日常进行代码管理的需求,最后隆重介绍了git以及GitHub以及使用方法。

p14 汇编的加减法和循环
介绍了汇编中的循环。以及加减中的进位等

p15 汇编的乘除法以及栈的定义使用
介绍了汇编的乘法和除法指令。介绍了栈这一个结构。栈其实没什么特殊的,就是规划了一段的内存地址,然后在这一块地址上进行各种操作。要想制造一个栈,首先在ss寄存器定义它的段基址,然后就可以通过sp寄存器操作偏移量 。就可以定位栈中的而数据了。
我是这么理解的:
我们日常使用push操作,并没有设置ss寄存器,所以它默认为0x0000(相对于cs寄存器定位到的那个段).我们使用栈都会先push操作,那么sp往下移动一位,但是往下没有内存了,所以根据减法的进位,下一位就是0xFFFF,也就是那个段的顶部,所以我们的栈数据都在顶部往下,而我们的数据和指令随着越写越多,是从底部往上,所以栈的数据跟指令数据很难起冲突,除非他俩的数据加起来超过64k。

p16 如何更优雅地打印字符串
汇编中section\align\vstart的使用,以我的理解,section 是人为的分段,为了使程序更加规整。
主要是vstart的理解,只要某个段写了vstart,编译结果就是该段的位置自动+vstart?如果说这是让汇编地址自动加上vstart,那之前的程序中为什么没有vstart,也没有设置段寄存器的值,程序也可以运行?段寄存器的值在加载的时候不是被初始化吗?
这一部分写了一个打印函数。方法如下:
1.定义了两个字符串
2.设置段寄存器es低起始地址为显存的映射地址,往这里边写数据就会在显示屏上显示出来。
3.把字符串的地址传送给si,根据es:si,所以就可以把字符串mov到显存映射地址中去了。

p17 使用汇编读取硬盘
写了一个读取硬盘的程序,把其中的字符串读出来并打印到屏幕上。方式如下:
1.先使用工具在硬盘上写字符串
2.在操纵硬件设备时,都是在该设备的寄存器写相关信息。在硬盘的寄存器上输入相关读取信息,包括从哪开始读,读多大块等信息。然后从相关寄存器把内容读出到通用寄存器。
3.把读出来的内容放到指定显存映射区域。

注:关于端口号的理解,端口号就是电脑上的寄存器,比如硬盘有几个寄存器,那么这几个寄存器综合起来就是一个端口,这个端口是分配给硬盘的,不知道这么理解有没有错。

p18 运行启动扇区外地程序
之前的程序都放在启动扇区内,那么计算机一开机就可以运行了。
这里做的就是运行启动扇区外的程序。
原理:
1.写启动扇区内的程序,这个程序这回老老实实做个引导程序,它的功能就是把硬盘上的程序加载到内存执行。这里加载的位置指定为0x10000,这个地址得分成段地址和偏移地址,放进段寄存器和偏移寄存器。
2.硬盘上的程序得把它的分段信息、入口函数等信息告诉引导程序,这样该程序才能正确加载带内存上并且重定位,然后正确执行。

这里内容很多,有点难以理解,这里先写下我想明白的:
1.程序访问内存时一定是一个任意段寄存器的值和任意一个偏移寄存器的值综合起来形成真实地址。
2.这里的分段是16k一段。
3.其实编译器一是做翻译工作,其他什么也没做?一个程序就是一段连续的数据,里边是一部分数据和一部分代码混合而成的,某一段是定义的数据还是代码完全都是可能的。既然这东西是数据代码混合而成的,那么计算机在运行这东西时时,为什么没有把数据当成指令来运行呢?。比如一个程序是 int a 10; mov ax, a; int b 20; mov bx b;汇编完成后,机器码的开始应该是一个占两字节的10的数据,然后是mov ax指令的机器码,10的地址,两个字节的20的数据,mov bx的机器码,20的地址。这些数据和指令连在一起。那么如果指定了从mov ax a;开始执行,那么下一条指令就是20,是一个数据。所以编译器的另一个工作应该是把指令了数据分开,那么指令就可以一条一条执行下去了。
4.为什么程序开头要写上段的数量,段的初始地址?
因为在每个段里,对数据的操作都是以当前的段的位置为起始位置,要操作其他段A的数据,得是A的地址加上那块数据的偏移量。当写到内存后,每个段的起始地址就不固定了,得根据加载位置对每个段重新计算段址,就可以正常操作了,每个段的偏移量不用管就行,因为都是相对于段的偏移量。
虽然ds已经指向到加载位置的的段地址了,但是还得重新确定程序中每个段的段地址,以及入口地址。

p19 调用显卡输出光标
这里也是写了一个往屏幕上输出字符串的,但是更高级, 因为字符串里边包括回车换行符号。得处理回车和换行符号,还在频幕上输出光标。根据字符控制光标的移动。
回车和换行是两个操作,回车是指把光标回到行首,换行是指把光标往下移动一行,平常的enter键是集合了回车和换行两个操作。
在屏幕上输出光标,实际上就是对显卡的操作,也是写显卡的寄存器。

p20 关于中断的讲解
主要分为硬件中断和软件中断,硬件中断是设备通过中断线传送过来的,CPU有两条硬件中断线引脚,一条是可屏蔽的,一条是不可屏蔽的。软件中断一种是是执行到中断指令进行的中断。一种是CPU自己产生的,比如当除数为零时。每个中断都有中断号,一个字节,总共256个中断号。
中断向量表保存每个中断的处理程序地址,根据号码排列,放在内存中的最开始处。
当电源启动,还没执行启动盘之前,硬件自检完成后就把各自的中断处理程序放到内存中的指定位置了,每个硬件都有自己的BIOS,里边存放着它们的处理程序。然后由主板上的BIOS程序把它们加载到中断向量表指定位置。
之前他写了一个打印程序,把字符串送到内存中的显存地址上,然后显示器就可以通过读那一块地址中的内容显示相应的文字。
显卡的中断处理程序也提供了这个功能,只需把相应文字内容送到指定寄存器,然后发起显卡的中断,就可以显示相关内容了,这样就不需要我们亲自操作写入内存来达到视频文字显示。
这也就是为什么BIOS被称作基本输入输出系统的原因吧,只需要调用相关中断就可以实现基本输入输出,而不需要自己操作相关寄存器或者内存。当然你也可以自己写相关逻辑来实现基本的这些输入输出,或者就调用由BIOS写好的,这样更方便。

p21 内存保护模式的引入
1.首先,程序进行分段,每个段的大小不一样。
2.所以,要描述一个段,就得是段的基址,段的大小,以及读写权限等。通过段描述符来表示。
3.所有的段描述符放在一张总的表里边,叫GDT表,通过这张表可以找到所有的段描述符,也就可以找到每个段的基址和大小了。GDT表放在一个寄存器中。
4.每个程序对应多个段,把这些段通过一张LDT表保存起来。计算机有很多的LDT表,这些表又通过一个表进行记录,形成二级结构。

p22 32位CPU及ToyOS的系统设计
这就是操作系统的开始了!
步骤如下:
1.编写bootloader,毕竟是是电脑启动的第一个程序。毕竟只有512个字节,功能比较少,只是负责把硬盘上的Initial.bin拉起来,initial放在指定位置,所以代码可以写死(也可以不用写死,fat文件系统支持查找),让他去处理事情。也就是一个日常的加载引导程序。
2.把initial.bin拉到内存中运行后,initial.bin的工作为进入32为工作模式,开启分页,进入64位、初始化多核等。最重要的一点,把kernel从硬盘中拉到内存去,kernel可以用c编写,反正编译完了以后也是机器语言。在程序的开头要放上程序的信息,包括入口地址、分段信息等。有了fat32文件系统后,就可以根据文件名查找kernel,所以kernel不需要放在硬盘上的指定位置。
3.kernel就是操作系统核心了,负责内存管理、进程调度、线程管理等。同时负责把shell拉起来,作为第一个程序,它是人机交互的,可以读取键盘输入的命令并执行。以及管理其他应用程序。

p23 硬盘、块设备访问和分区,MBR分区内容
讲了硬盘的相关知识,比如硬盘不是按照字节来分配,包括分区情况和文件系统等。
U盘或者各种硬件里边都有他们的处理逻辑或数据。比如一个空数据的硬盘开始位置会有硬盘格式数据如mbr,文件系统数据比如fat32,分区情况等数据,这些数据一般占据一定存储空间。这些数据可以有专门工具更改,比如更改分区情况,文件系统等等,不同的分区情况和文件系统采用不同的访问方法。文件系统就是记录或者说该硬盘中的内存是如何划分的,包括几个块,每个块多大,由什么数据结构或者那个字节保存这些数据,它是如何记录文件位置的等等。文件系统 还包括文件分层处理,就是文件中可能还包括文件。
不同的文件格式里边的数据处理和表示不同,比如相同的图片文件,不同的格式可能采用不同的位深,这些必要数据放在文件开始位置,只有了解了文件的具体格式,哪一位代表什么意思,才能知道这些数据的位置和代表含义,通过这些数据才能把这份文件数据正确处理。
不同的文件系统主要是影响寻址的快慢和最大寻址空间,比如fat32最大寻址空间才2T,在一些大机器上肯定是不够用。

p24 FAT32文件系统
详细介绍了FAT32文件系统,包括每一位代表的数据。

p25 汇编读FAT32文件系统的硬盘分区

谭玉刚从零开始之超硬核制造操作系统相关推荐

  1. 超硬核!操作系统学霸笔记,考试复习面试全靠它

    之后会发布基于基础知识的大部分算法的模拟代码合集,敬请关注. 进程基础 进程的基本概念 程序顺序执行的特征: 1)顺序性:处理机严格按照程序所规定的顺序执行,每一步操作必须在下一步操作开始前执行 2) ...

  2. 超硬核!兔兔阿里p7学长给的面试知识库

    一个阿里p7学长给的nosql面试知识库,绝对真实,学会了去面呀. 最近整理了一下超硬核系列的文章和面经系列的文章,可以持续关注下: 超硬核系列历史文章:(我保证每篇文章都有值得学习的地方,并且对小白 ...

  3. 超硬核!花33小时来造台3D打印机吧~

    超硬核!花33小时来造台3D打印机 3D打印机在实际应用中还是有不少用武之地的,从零开始直接买材料回来自己组装可以有效地提高性价比,用最低的价钱打造一台性价比不错的机子.这里我就用大概两天的时间,成本 ...

  4. mysql long类型_怒肝两个月MySQL源码,我总结出这篇2W字的MySQL协议详解(超硬核干货)!!...

    点击上方蓝色"冰河技术",关注并选择"设为星标" 持之以恒,贵在坚持,每天进步一点点! 作者个人研发的在高并发场景下,提供的简单.稳定.可扩展的延迟消息队列框架 ...

  5. 超硬核之傅里叶公式推导(上)

    超硬核之傅里叶公式推导 1.三角函数系与正交性 2.周期(2pi)函数的傅里叶展开(三角形式) 3.找到周期函数傅里叶展开的系数 结语 前言:再学习数学推导之前,popcorn建议读者感性的先去理解一 ...

  6. 十一长假我肝了这本超硬核PDF,现决定开源!!

    写在前面 在 [冰河技术] 微信公众号中的[互联网工程]专题,更新了不少文章,有些读者反馈说,在公众号中刷 历史文章不太方便,有时会忘记自己看到哪一篇了,当打开一篇文章时,似乎之前已经看过了,但就是不 ...

  7. 【Nginx】冰河又一本超硬核Nginx PDF教程免费开源!!

    写在前面 在 [冰河技术] 微信公众号中的[Nginx]专题,更新了不少文章,有些读者反馈说,在公众号中刷 历史文章不太方便,有时会忘记自己看到哪一篇了,当打开一篇文章时,似乎之前已经看过了, 但就是 ...

  8. 超硬核!苏州同程旅游学长给我的全面的面试知识库

    超硬核!苏州同程旅游学长给我的全面的面试知识库 1.简介 新生和经验丰富的C#面试常见问题解答 2.什么是C#? 3.用示例说明C#中的注释类型 4.可以执行多个catch块吗? 5. public, ...

  9. 超硬核!!!一篇文章搞定TCP、UDP、Socket、HTTP(详细网络编程内容+现实解释三次握手四次挥手+代码示例)【网络编程 1】

    TCP.UDP.Socket 一天面试的经验: 什么是网络编程 网络编程中两个主要的问题 网络协议是什么 为什么要对网络协议分层 计算机网络体系结构 1 TCP / UDP 1.1 什么是TCP/IP ...

最新文章

  1. spring InitializingBean接口分析
  2. flink DataStream API使用及原理
  3. python calu_Python基本数据类型
  4. Android 5.1 API 22 所有sdk文件下载地址
  5. 实数历史无穷小能否带领我们直接走向今日科学之辉煌?
  6. matlab 把区间等分分,MATLAB数学实验报告 定积分的近似计算
  7. coco 数据集_PyTorch版YOLOv4更新了,适用于自定义数据集
  8. 阿里巴巴Java开发文档2020版学习-命名风格
  9. 现代语音信号处理之语谱图(spectrogram)
  10. 大漠找图算法_新手用大漠找图识别数字,怎么将数字组合起来呢
  11. 求解sinx的n次方积分
  12. 将路由器作为AP组建局域网的方法
  13. python14张图下载_Python网络爬虫入门(三)—— 做个简陋的pixabay 图片下载器 (附源码)...
  14. 定性分析与定量分析的区别
  15. discuz 风格模板制作
  16. 深度学习系列2:框架tensorflow
  17. DNS缓存中毒攻击与防护
  18. Cloudera是个什么东西
  19. 看完这几道 JavaScript 面试题,让你与考官对答如流(中)
  20. App地推渠道归属:解决地推中存在的难题

热门文章

  1. 2016小米实习生面试心得
  2. 学计算机u盘多少g合适,装系统的u盘需要多大-大白菜装win7的系统一般要多少G的U?大 – 手机爱问...
  3. ROS- 激光雷达测距原理及主要参数
  4. 分析师入门常见错误 幸存者偏差,如何用匹配和加权法规避
  5. Escape Codec Library: ecl.js Shift_JISエンコードやEUC-JPエンコードなども可能な escape エンコード・デコード関数のライブラリ
  6. 计算机英语中poke什么意思,poke one是什么意思
  7. [经验共享] 影像下载篇——在NASA上下载MODIS免费卫星影像的方法
  8. 1.1 java基础
  9. response响应头设置总结
  10. linux 下网络编程 聊天室项目