哈喽,大家好,我是子牙
作为一个Java Coder,我的梦想是手写JVM。这个梦想在疫情来临的那年春节实现了,因为手写了JVM被图灵学院的周瑜老师认识,经周瑜推荐,离开阿里加入图灵学院成为一名讲师,专注教底层。
2021年3月,一年合同即将到期,我就在想,我有这个梦想,会不会其他人也有这个梦想?于是离开图灵做了手写JVM小班,运气不错,一举功成。一年多来,500多VIP加入学习,志同道合,大家学得很嗨皮…
作为一个Java Coder的梦想实现了,我就想去实现作为Coder的梦想:手写操作系统。写文章的今天,这个梦想也已实现。接下来与大家分享我写操作系统的一些经历。
纵观技术圈,顶级的技术、系统、论文,都来自国外。国内教你写JVM、操作系统、编译器等顶级技术的人基本没有,我想补充这一块的市场空白,哪怕它很难、研究很苦、备课很累、不赚钱…
手写JVM,一年多的时间,我已经高强度的备课,更新了五期,把JVM中的绝大多数知识点,其中很多是市场上空白的,都已经讲完了。
手写操作系统正在写课件,预计九月份开始招生,到时会在公众号发文详细介绍,如果你感兴趣,记住关注我的公众号【硬核子牙】
先给大家看一个视频:再现Linux当年的辉煌之多任务切换
再现Linux当年的辉煌之多任务切换
巨涨功力
写操作系统真的巨涨功力,写完以后,我感觉我对之前的很多知识点理解得更深刻了。
写操作系统是很多基本功的综合应用,那需要哪些基本功呢?
1、语言层面:汇编、C语言。如果你是开创者,没人手把手教,这两门语言要达到精通级别,能融会贯通使用
2、操作系统层面,对操作系统的中断机制、进程线程机制、内存机制要非常了解,最好是了解Windows、Linux两个内核对于此的底层实现。这些机制是你写一个能跑的操作系统必备的,你脑海中没有那么多底料,在实现的时候遇到各种奇葩问题,你将束手无策
3、尤其要对操作系统的原生执行流非常熟悉,要熟练使用ROP技术构建执行流
4、硬件层面,需要对BIOS中断、屏幕操作、键盘操作、时钟中断、CPU段页门非常熟悉,熟练使用
5、还有要了解Linux的可执行文件格式ELF,要熟练使用gcc、nasm,深刻理解编译、链接,没有这一块的知识点,你写的内核将无法调试,也就意味着你写不出来
一个完整的操作系统大纲要实现这么多
一个能跑的操作系统,实现其中的40%就可以了,我写的操作系统,目前大概实现了其中的40%,剩下的我会陆续让我的操作系统支持,然后做成课程分享给想学习这块的小伙伴
我目前实现了:
1、实模式切入保护模式
2、实现内存检测、物理内存管理模块、虚拟内存管理模块
3、实现了输出模块。要知道你用Linux终端,它会自动翻页,这个功能你如果写内核都是要自己实现的
4、实现了键盘中断。就是你键盘敲什么,屏幕就显示什么,为后面加入命令行做准备
5、实现了时钟中断,通过时钟中断调度任务。与Windows、Linux一模一样
6、实现了进程线程、任务切换、阻塞唤醒。当然,任务模块的东西很多,后面会逐步加入
7、实现态的切换,由内核态切入用户态发起系统调用
8、实现了系统调用模块,通过0x80中断实现应用态对内核态的范围及返回
你如果看过其他相关的视频,你会发现大家没办法调试C语言。如果这样,无疑让学习门槛变得很高,在我这里是不允许的,于是我花了大量时间攻克了此。即,我提供的环境,是可以调试你写的C语言的
按照顺序:下一个是文件系统、然后是网络模块……
fork函数
fork函数是Linux创建多进程的一个函数,这个函数很特别,实现起来很复杂
特别在哪呢?一次调用,会返回两次
复杂在哪呢?需要父进程在创建的那一刻,因为要构建执行流,需要对子进程的内存空间做手术
看下我的实现成功
酷帅的代码片段
在写内核的过程中,萌生了很多问题,查了很多资料,让大家看下我的努力
作为一个Java Coder,你有什么梦想呢?
作为一个Coder,你又有什么梦想呢?
结语
我是子牙老师,喜欢钻研底层,深入研究Windows、Linux内核、JVM。如果你也喜欢研究底层,欢迎关注我的公众号【硬核子牙】