圆梦,手写了个操作系统

大家好,我是发哥。

我不止一次在公众号上强调学习操作系统的重要性。至于学习的方法,无外乎看书、看视频、看源码等等。

也有推荐过跟着老师一起手写操作系统,但很少有学习方法能同时兼顾以下三点:

1、Linux内核

2、Windows内核

3、自己写操作系统

如果只学一种操作系统,很容易陷入到一种认知偏差,觉得操作系统只能这样,或者把某个操作系统的实现就认为是所有操作系统的标准。

今天,我要推荐的一个学习方式,就把这三点完全融合起来了。既学习了主流的Windows和Linux内核知识,还要动手写自己的内核,可以说是把理论、实战、实用非常好的结合了起来。

这类修内功的课程,市面上少有人做,做相关课程的人,大多缺实战经验,所以课程偏理论,大家学起来总感觉软绵绵的不得劲…

这个操作系统课程的老师是子牙老师,我之前已经推荐过。子牙老师之前是JVM专家,离开图灵后做了手写JVM小班,一举成功,这次带来的是他的新课程手写操作系统,非常硬核、重实战…推荐给大家


哈喽,小伙伴们好,我是子牙。深入研究Windows内核、Linux内核、Hotspot源码…

大家期待已久的手写操作系统课程终于来啦!既手写JVM课程后又一全网唯一的硬核课程!一期包含七大专题,三个月时间,直播授课,手把手带你实现一个可运行的操作系统。

知道你有很多问题想问,别急,听我娓娓道来。为了方便大家更好地了解课程,我录了个更相信的视频版。虽然是课程试看视频,我也其中也分享了很多与操作系统学习相关的知识…


01

手写操作系统

手写一个操作系统,应该是所有Coder的梦想吧。奈何这方面的资料奇缺,虽然有部分书籍,但是没有一定的基础也是看不懂的,导致很多Coder这一生都没能实现这个梦想。

我比较幸运,十多年时间,误打误撞补齐了手写操作系统需要的绝大多数基础,于是在手写JVM课程做完之后,做了这个课程。

先说下一个完整的操作系统包含哪些,如图

301f7da3491d282da19aeb313fd4d941.png

那实现一个操作系统需要哪些基础呢:

  1. 语言层面:汇编、C语言。这两门语言要达到精通级别,能融会贯通使用才行。因为写内核会涉及到汇编与C语言之间的互相调用

  2. 操作系统层面,对操作系统的中断机制、进程线程机制、内存机制要非常了解,最好是了解Windows、Linux两个内核对于此的底层实现。这些机制是你写一个能跑的操作系统必备的,你脑海中没有那么多底料,在实现的时候遇到各种奇葩问题,你将束手无策

  3. 尤其要对操作系统的执行流机制非常熟悉,要熟练使用ROP技术构建执行流,在写内核的时候会经常用到此技术,比如任务的退出、fork函数

  4. 硬件层面,需要对BIOS中断、屏幕操作、键盘操作、时钟中断、CPU段页门非常熟悉,熟练使用

  5. 还要了解Linux的可执行文件格式ELF,要熟练使用gcc、nasm,深刻理解编译、链接,没有这一块的知识点,你写的内核将无法调试,也就意味着你写不出来

  6. ……

看到这,有些小伙伴就慌了:这我能学得会吗?稳住,别怕,有我!课程会在合适的节点穿插讲汇编、C语言、操作系统内核、硬件、gcc、elf、Makefile等关联知识,还有课后答疑及课后练习。

你只要感兴趣,都可以学,不用担心基础问题,是真的能让你学得会的操作系统课程

不过你确实需要花费一点努力,下点苦功夫才能学会。这些知识你今天不学,迟早还是要学。技术这行,如果没有实力支撑,就是吃青春饭,底层功力扎实,才能越老越吃香!而且互联网红利已经结束,进入内卷时代,与其被别人卷,不如主动卷,成为TOP!


02

学这个课有什么用

咱们也不能空谈理想,聊点现实的:写一个操作系统,有什么现实意义呢?

一、从面试角度来说,无论你是Java、Python、go,亦或是c、c++,面试中都会被问到操作系统或者硬件相关的问题,你可能不知道,或者背答案应付。问题一变,就哑口无言了。如果你写过一个操作系统,你将深入理解这些,面试官问一个问题,你能答出一串,获得好感,占得谈薪先机

二、从工作角度来说,如果你写过操作系统,打通了这层认知,你写的每一行代码,你能一眼看穿它的本质,想想这种坚定的感觉,再想想你平时惴惴不安的感觉,你选哪个?

三、从就业角度来说,未来是万物互联时代,IOT、人工智能、虚拟现实等这些产业的背后涉及的操作系统,无不是Linux系。我的这个手写操作系统课程,会结合讲Windows内核、Linux内核,写一个自己的内核。一个课程,让你学会三个操作系统,为不确定的未来留点后路

四、从学习角度来说,新技术层出不穷,底层技术已经基本稳定。追逐新技术,没有尽头。万变不离其宗,操作系统就是技术行业的宗,学一次,受益终身。学习,要追求效率,要学习那些相对不变的,有个这个基础,再去学那些变化的,秒懂。比如你学会了linux的多线程,就等于同时学会了所有编程语言的多线程

五、从个人发展角度来说,如果你没有底层功力,技术这行你能达到的高度是非常有限的,因为你没有自学能力,遇到问题你只能问别人,等别人的答案,可能还不一定是正确答案…想想求人的痛苦,为何自己不成为实力的拥有者呢?


03

课程详细介绍

前面讲的可能看起来有点牛叉,不免会让有些人怀疑我是不是在吹牛,所以我准备给出有力的事实

19f348a482eefb6b8a9054ca56a9a787.png

手写操作系统课程安排

06ac01ea41138989b37be1b1be751cca.png

先给大家看下完整的手写操作系统课程安排,一共五期,当前是一期招生

cfd8f1c3b433ade1eed02dcfab29a5f0.jpeg

00cca08c90b9d02b70d1f4421eaaa6d3.png

手写操作系统一期大纲

23203e08509fac2b6e7474561a0d2815.png

f0d62794821da7e2ceffe4337c8fedbd.jpeg

d3e1d1b345b36c3aae90049279e76b4b.png

手写操作系统一期代码

06c1215a5d2b219beb41e2ff86537b3c.png

一期课程相关的代码我已经全部写完

  1. 实模式切入保护模式

  2. 实现内存检测、物理内存管理模块、虚拟内存管理模块

  3. 实现了输出模块。要知道你用Linux终端,它会自动翻页,这个功能你如果写内核都是要自己实现的

  4. 实现了键盘中断。就是你键盘敲什么,屏幕就显示什么,为后面加入命令行做准备

  5. 实现了时钟中断,通过时钟中断调度任务。与Windows、Linux一模一样

  6. 实现了进程线程、任务切换、阻塞唤醒。当然,任务模块的东西很多,后面会逐步加入

  7. 实现态的切换,由内核态切入用户态发起系统调用

  8. 实现了系统调用模块,通过0x80中断实现应用态对内核态的范围及返回

课程配套代码,分支我是按照课时打的,方便大家到时阅读代码

65001d7093cfff18aa9a0b5d9ad9a24d.png

课程笔记已经做好了,与上面贴的课程大纲一模一样,会严格按照笔记授课,可以放心

c3d25b7fb73fa4e4378e1e33e1723675.png

多任务切换是怎么切的?看下酷帅的代码片段

de037ebc86ba381147c0ba664a0d2036.png

你如果看过其他相关的视频,你会发现大家没办法调试C语言。如果这样,无疑让学习门槛变得很高,在我这里是不允许的,于是我花了大量时间攻克了此。即,我提供的环境,是可以调试你写的C语言的

f697e7ae4bffbcffba06f4c58796cfa8.png

最后介绍下自己:前阿里P8。2021年加入图灵学院成为一名讲师,专注讲JVM与操作系统。2022年离职创业尝试做手写JVM,运气较好,一举成功。

一年多开设了五期班,积累了500多VIP。课程干活满满,全网唯一,零差评。

09fdeba8a4dadbb3bf3d73e6f46fd602.png

144f2200771625d98ae6bf8acd5bfbf5.png

手写操作系统,依旧将是零差评。

真心做教育,践行“子牙出品,必属精品”

如果你想更多了解我,欢迎去我公众号【硬核子牙】看我之前的文章及我的奋斗历程。白手起家程序员的职场心得,应该会对你有很大启发

8.22-9.30为早鸟价,10月开课恢复原价4000

性价比超高,可全网比价!感兴趣的小伙伴别错过超大优惠上车哦~

ca657704fbe98de1f326228a9c8b55f7.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓打包apk

打apk包的环境依赖 1.jdk 2.sdk 3.ndk 打apk包的工具 gradle mkdir /usr/local/Android cd /usr/local/Android mkdir sdk gradle ndk 1.jdk安装 略 2.sdk安装 https://www.androiddevtools.cn/下载地址 cd /usr/local/Android/sdk wget https://dl.google.com/android/andro…

你知道怎么衡量硬件设备的算力吗?

前几天在知乎上看到有知友提问,什么是 GPU 算力。当时简单回答了一下,今天有空,在这里详细谈谈算力。算力也是做高性能计算的核心概念和指标。设备算力分为两部分,其一是设备,其二是算力。设备主要是指 CPU、GPU、DSP、…

Python爬虫入门教程 22-100 CSDN学院课程数据抓取

1. CSDN学院课程数据-写在前面 今天又要抓取一个网站了,选择恐惧症使得我不知道该拿谁下手,找来找去,算了,还是抓取CSDN学院吧,CSDN学院的网站为 https://edu.csdn.net/courses 我看了一下这个网址,课程数量…

UML类图解义 (来自《大话设计模式》)

为什么80%的码农都做不了架构师?>>> 小菜:“对了,我时常在一些技术书中看到这些类图表示,简单的还看得懂,有些标记我很容易混淆。要不你给我讲讲吧。” 大鸟:“这个其实多看多用就熟悉了。我给…

易写易库(EXEK)玩“花”儿之三:命令有图标支持库,附图

释题:如果您认为这个“花”儿,属于之前第一个“花”儿的变种,易语言写支持库也能玩出“花”儿来(易写易库(EXEK)进展5),我也不反对。 在开始正文之前,我要首先回答我之前提出的两个问题&#xf…

您好,有什么嵌入式书籍推荐的?

回答下这个后台的留言-----比较推荐下面这个仓库里面的内容!https://github.com/ZhongYi-LinuxDriverDev/CS-EmbeddedLinux-Book#%E5%85%A8%E9%83%A8%E6%B1%87%E6%80%BB

VS2017打开低版本的VS MVC架构的项目的时候需要修改的地方

1、需要修改的是.sln文件,即将里面的 Version改为12,其中的VS的版本改为2017 2、项目中后缀名为 .csproj中的代码改一下: 转载于:https://www.cnblogs.com/zhijianhao/p/10253572.html

从外部的js文件中获取ASPX页面的控件ClientID(get control reference from external javascript)...

前言 当使用MasterPage、UserControl等容器时,为了避免控件的重复命名,asp.net会自动将容器中的控件生成一个ClientID(Control Tree中的可生成,否则不会生成)。 例如:ContentPlaceHolder1中的Button1默认情…

可怕!CPU暗藏了这些未公开的指令!

我们平时编程写的高级语言,都是经过编译器编译以后,变成了CPU可以执行的机器指令:而CPU能支持的指令,都在它的指令集里面了。很久以来,我都在思考一个问题:CPU有没有未公开的指令?或者说&#x…

A star算法优化二

本文目的是对A*寻路算法所生成的路径进行一些人性化的调整,使其看起来不至于太机械化。关于A*算法的原理与实现,读者可以阅读其他资料,这里不再详细阐述。 如何写估价函数A*寻路算法本质上是一个有方向性的广度优先搜索算法,它使用…

CentOS下python-mysqldb安装

CentOS下python-mysqldb安装日期:2011-04-17 | 来源:未知 | 作者:redice | 869 人围观 | 1 人鼓掌了!鲲鹏Web数据抓取 - 专业Web数据采集服务提供者(1)py…

I2C总线接上拉电阻的原因

I2C为什么要接上拉电阻?因为它是开漏输出。为什么是开漏输出?I2C协议支持多个主设备与多个从设备在一条总线上,如果不用开漏输出,而用推挽输出,会出现主设备之间短路的情况。所以总线一般会使用开漏输出。为什么要接上…

解决循环引用--弱引用weak_ptr

循环引用&#xff1a; 引用计数是一种便利的内存管理机制&#xff0c;但它有一个很大的缺点&#xff0c;那就是不能管理循环引用的对象。一个简单的例子如下&#xff1a; class parent; class children;typedef shared_ptr<parent> parent_ptr; typedef shared_ptr<ch…

第九章 虚拟内存

物理地址和虚拟地址&#xff1a; 计算机的主存被组织成一个由M个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址&#xff08;PA&#xff09;。第一个字节地址为0&#xff0c;接下来为1&#xff0c;再接下来为2&#xff0c;依次类推。CPU访问内存的最自然方式…

Android HandlerThread 总结使用

Android HandlerThread 总结使用转载请标明出处&#xff1a;http://www.cnblogs.com/zhaoyanjun/p/6062880.html本文出自【赵彦军的博客】前言以前我在 【Android Handler、Loop 的简单使用】 介绍了子线程和子线程之间的通信。很明显的一点就是&#xff0c;我们要在子线程中调…

python 文件操作练习

1. 文件a.txt内容&#xff1a;每一行内容分别为商品名字&#xff0c;价钱&#xff0c;个数。 apple 10 3 tesla 100000 1 mac 3000 2 lenovo 30000 3 chicken 10 3 通过代码&#xff0c;将其构建成这种数据类型&#xff1a;[{name:apple,price:10,amount:3},{name:tesla,price:…

微软发布Enterprise Library 4.1和Unity 1.2

说明 微软模式与实践团队今天发布了Enterprise Library 4.1和Unity 1.2版本&#xff0c;这次发布的主要新特性如下&#xff1a; 1. 支持Visual Studio 2008 SP1 2. Unity应用程序块中加入了拦截机制 3. 性能提升 4. 配置工具的可用性提升 5. Bugs修复。 在Unity 1.2中有如下几点…

简易的波形折叠电路

01 波形折叠一、背景介绍今天在 Youtube 上看到 UP 主 Neukolln 展示了一款非常简单波形折叠电路。那么什么是波形折叠电路&#xff1f;它有什么用处&#xff1f;1、什么是波形折叠&#xff1f;通常情况下&#xff0c;信号在放大中会产生“饱和失真”&#xff0c;这是由于放大器…

STL 容器和迭代器连载6_顺序容器的操作3

2019独角兽企业重金招聘Python工程师标准>>> /*- * 文件名 &#xff1a;STL_con_ite_6.cpp * 开发人员&#xff1a;袁培荣 * 当前版本&#xff1a;1.0.0.2595 * 创建时间&#xff1a;2012-05-24 * 修改时间&#xff1a;2012-05-24 * 功能…

vector的内存释放

1. vector容器的内存自增长 与其他容器不同&#xff0c;其内存空间只会增长&#xff0c;不会减小。先来看看"C Primer"中怎么说&#xff1a;为了支持快速的随机访问&#xff0c;vector容器的元素以连续方式存放&#xff0c;每一个元素都紧挨着前一个元素存储。设想一…