nask.exe应该就是nas kit(nas开发工具的意思),由于这个编译器是作者自己写的,所以这种汇编语言应该是作者改造出来的,所以我叫它nas汇编语言. 作者说nask是模仿nasm语法的,关于nasm:Linux 汇编器:对比 GAS 和 NASM 前言 本文标题虽为二进制,但其实一般大家都看十六进制 ,因为每4位二进制(4bits)就对应一位十六进制数(hex),如 作者也这样说:为了方便清晰地表示二进制,我们用十六进制来看 如果计算进制有困难,可以使用在线工具或Excel,字符转16…
<30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件本身的设计就具有事件驱动的性质,所以软件层面上才有基于事件的消息机制. 但上一篇没有说明中断的来龙去脉,本篇就从头到尾描述一下CPU与此相关的设置问题. Segment 32位的CPU使用32条地址线,能区分232=4G个内存地址.每个内存地址都有1Byte的内容. 分段,就是将4GB的内存分成很多块(blo…
<30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测试和U盘启动的一些问题.本篇就来解决之. 遇到的问题 物理机测试 简单来说,把软盘(U盘)做成启动盘后,自然想要用来启动物理机器.毕竟这才是真正的测试.(用QEMU总没多大的成就感)但物理机测试的麻烦在于太慢了,每次都要关掉Windows,重启,测试,然后再重启Windows.而且还没办法截图. 而用Vmwa…
<30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL代码(helloos.nas).编译生成helloos.img文件.用虚拟机QEMU加载helloos.img.制作U盘启动盘和用物理机加载helloos.img. 计算机启动时会自动加载和执行IPL程序,但IPL程序只能占用512字节.若直接用IPL写OS,空间不够用.所以IPL程序一般用于将真正的OS程序…
<30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以下这段是标准FAT12格式软盘专用的代码 JMP entry DB 0x90 DB "HELLOIPL" ; freeparam 启动区的名称可以是任意的字符串(8字节) DW ; 每个扇区(sector)的大小(必须为512字节) DB ; 簇(cluster)的大小(必须为1个扇区)…
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写这个笔记了,因为开学了,还要学习课业上的压力,转博了压力山大啊. 这一天的课程最难的我感觉是后面的memory free的部分,这一部分有很多已经没有接触到的东西,所以感觉比较难. 内存的管理在任何os中都是一个重要的问题. 还是按照作者的书本上第九天的顺序的来做笔记吧: 1:整理源文件部分,这一部…
转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 虚拟机加载helloos.img 真机加载helloos.img 制作启动盘 真机启动 总结 <30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 回到顶部(go to top) 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c0…
从今天起,写一些读书笔记.最近几个月都在看<30天自制操作系统这本书>,书虽说看的是电子书,但可以花钱买的正版书,既然花费了金钱,就总得有些收获. 任何人都不能总是固步自封,想要进步就得学习别人的知识,对于程序员而言,最简单的方法即是学习别人的代码. 今天的标题是“单字节的FIFO缓存”,其实就是做一个FIFO,看名字就知道了.也就4个函数和1个相关结构体,这样的小代码在嵌入式系统中很常用,也会很好用. 1.相关数据结构体 struct FIFO8 { unsigned char *buf;…
Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看<30天自制操作系统>笔记 导航 发现学习中的变化 源码差异分析 FAT12/FAT16/FAT32相关资料 开始全面分析 发现学习中的变化 day1代码(只简单地使用DB DW DD RESB指令) ; hello-os ; TAB=4 ; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code DB 0xeb, 0x4e,…
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操作系统的原因: 我想大部分分的学习者和写Os的人都有这样的想法,为什么现在大部分的教程都是拿软盘来说做仿真,我们的电脑上面也没有软盘,搞来搞去的系统,到头来只能仿真,没有什么意思.能在真机上跑跑自己写的系统才是有意思的事情.当然,这也是我自己的想法. 想在真机上跑,就需要一台slave机(另一台做实…
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第八天的学习思考: 关于鼠标是怎么移动怎来的 思考过程. 现在忘掉作者的代码思路,如果是我们自己写代码,鼠标指针应该怎么样才能动起来呢? 我的思路: 其实让鼠标指针动起来真的非常简单,只需要改变下面函数中的mx,my变量,也就是鼠标的position变量,鼠标指针就会移动了.但是在移动前一定要把原来鼠标指针出现的位置填充为背景 色,…
原本的启动是从img启动的,并且这个img是用FAT12文件系统进行格式化的(详细去搜索FAT12文件格式,这里给大家推荐一篇http://www.doc88.com/p-646605198560.html),那么也就是说我们的img文件符合FAT12文件系统的格式了.接下来我们用winhex这个软件来查看我们的img文件,同一时候比对FAT12文件系统的格式,看是否我们的img文件同FAT12文件系统描写叙述的同样: 从上图中能够看到里面有一个haribotesys的文件夹项.那么我们看看我们…
1 制作真正的IPL IPL(Initial Program Loader),启动程序装载器,但是之前并没有实质性的装载任何程序,这次作者要开始装载程序了. 虽然现在开发的操作系统啥功能也没有,作者说轻轻松松做. 起始我觉得吧,有了启动程序加载器之后,相当于给了我们一个给CPU传送指令的入口,我们想让CPU干啥,就给它传指令和数据就可以啦.操作系统嘛,就是一个启动程序装载器调用的一个很大的.很复杂的函数而已,突然感觉自己有些升华了( ^_^ ). CPU就是一个干活很快的家伙,但是智商基本为0,…
书名叫做30天自制操作系统,按照学校课设答辩的时间来看,估计得把书名改成<一周自制操作系统>,太卷了哈哈哈 我们可以使用qemu来模拟物理机 make run第二天制作的操作系统 可以看到输出了hello world,但是qemu模拟感觉没有太大的成就感,想要在真机上面进行自制操作系统的演示. 书中作者一直在用软盘来作为启动盘,但是我连软盘是什么都没有听说过,感觉现在这种东西也已经随着时代的发展而被淘汰了,在网上查了一下img文件在U盘里面做成启动盘的教程,感觉很复杂,而且有的博主说在JMP到…
30天自制操作系统-day3 前2天我们分别使用了直接使用二进制编辑器和简单的汇编指令生成了img文件,今天我们尝试一下使用稍微复杂一点的汇编指令 os.asm文件内容如下: ; hello-os ; TAB=4 ; 以下是FAT12标准软盘专用代码 DB 0xeb, 0x4e, 0x90 DB "HELLOIPL" ; 启动区名称 DW 512 ; 每个扇区的大小,必须是512字节 DB 1 ; 簇的大小,为一个扇区 DW 1 ; FAT的起始位置 DB 2 ; FAT的个数,必须为…
30天自制操作系统(linux)-day2 使用简单的汇编语言 首先Centos环境安装nasm,使用vim工具编辑一个os.asm文件,文件内容如下: DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00 DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00 DB 0x12, 0x00, 0x02, 0x…
30天自制操作系统(linux环境)--第一天 我是在CentOS的环境上面实现的,使用ubuntu的环境也是类似的 第一步:因为要对二进制文件进行编辑,所以安装二进制编辑器hexedit(当然其他的也可以),安装命令 yum install hexedit 第二步:对生成的软盘镜像进行仿真运行,使用虚拟机,因为我本地是使用VM进行的虚拟机,所以直接使用VM也可以 具体过程如下: 第一步:创建一个img文件 touch hello.img 第二步:编辑该文件,输入512字节的内容(这512字节的…
<30天自制操作系统>一书中第1天和第二天中有关汇编语言的程序的理解 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以下的记述用于标准FAT12格式的软盘 JMP entry DB 0x90 DB "HELLOIPL" ; 启动区的名称可以是任意的字符串(8字节) DW 512 ; 每个扇区(sector)的大小(必须为512字节) DB 1 ; 簇(cluster)的大小(必须为1个扇区) DW 1 ; FAT的起始位置(一般从第…
梳理项目结构 项目做到现在, 前头的好多东西都忘了, 还是通过Makefile重新理解一下整个项目是如何编译的: 现在我们拥有这么9个文件: ipl10.nas    InitialProgramLoader, 占用了软盘的第一个扇区并符合启动盘的规范, 默认被载入地址是0x7c00 到 0x7e00, 负责将10个柱面读入到0x8200到0x34fff (10个柱面共10*2*18 = 360 个扇区但是第一个没有被读入); asmhead.nas     包含一些暂时未知的设定; naskf…
harib16a: 这一部分,我们在系统中实现读取文件内容的命令type.在windows中,输入“type 文件名”,在Linux中,输入“cat 文件名”都可以显示文件的内容.我们先来看看如何读取文件本身的内容.这一节的前面部分,笔者花了大量篇幅去寻找文件内容在内存中的位置得到了以下规律: 1.clustno 表示文件从哪个扇区开始放: HARIBOTE.SYS 02 00 -> clustno = 0x0002 :0x004200        IPL10.NAS 39 00 -> cl…
harib09a: 定时器:(Timer)每隔一段时间,会向CPU发送一个中断.这样CPU不用记住每一条指令的执行时间.没有定时器很多指令CPU都很难执行.例如HLT指令,这个指令的执行时间不是个固定值,没有定时器,CPU就不能执行这个指令 -PIT-: 可编程的间隔型定时器(Programmable Interval Timer )通过设定PIT,可以让定时器每隔一定时间就产生一次中断.PIT和PIC都被集成在别的芯片里了,连接着IRQ的0号中断,IRQ0的中断变更周期是通过寄存器AL的值来设…
harib06a: 在昨天的最后一部分,我们已经变成了32位的模式,目的就是希望能够使用电脑的全部内存. 虽然鼠标的显示处理有一些叠加问题,不过笔者为了不让我们感到腻烦,先带我们折腾一下内存 这里笔者有把bootpack.c文件做了整理: 我们可以看到,把不同的函数有封装到了不同的源文件中.harib06b: 折腾了这么长时间的鼠标,大家都累了!我们来折腾一下内存吧! 笔者首先给我们科普了一点先验知识: 1.CPU每次访问内存都要将访问的地址和内容写入到CATCH中(写数据也是一样的) 2.观察…
//bootpack.c 完整代码 #include <stdio.h> void io_hlt(void); void io_cli(void); void io_out8(int port, int data); int io_load_eflags(void); void io_store_eflags(int eflags); void init_palette(void); void set_palette(int start, int end, unsigned char *rgb…
harib00a: 添加的部分从P46开始,制作IPL准备开始从磁盘装载程序了 笔者讲解了软盘的驱动的构造,以及汇编语言读取软盘的方法 MOV AX,0x0820 MOV ES,AX ; 柱面0 ; 磁头0 ; 扇区2 MOV AH,0x02 ; AH=0x02 : 读盘 ; 1个扇区 MOV DL,0x00 ; A驱动器 INT 0x13 ; 调用磁盘BIOS harib00b: 这一部的目的主要是试错 P51 软盘是很不可靠的存储设备,有时候会发生不能读取数据的情况 改良后的程序就是这一部分…
让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实上你用的是U盘还是软盘对我们的操作系统没有影响,缺点是你的U盘刷入系统后容量只能是1440 MB,即当年流行的3.5英寸软盘的大小,当然不用担心,再格式化一次(用DiskGeniu),就可以恢复. 我做事情的话,总是怕自己的努力的结果白费了,害怕辛辛苦苦看完这本书但是发现做出来的东西现在根本没法用,…
关于上一节,我测试了发现3e.4c.4e都OK ,4b 4d 4f都进不去系统还把qemu卡死了. 50不会输出HelloWorld,可能需要hex偶数且在0x3e~4f区间吧.上节复制并运行命令如下: copy /y helloos-Copy.img ..\z_tools\qemu\fdimage0.bin && ..\z_tools\make.exe -C ../z_tools/qemu 先不管上一节了,这节我们写HelloWorld 看不清请右击“从新窗口打开图片”,下为P29 P3…
这个专题荒废了许久,今天补点东西 不够准确的小结 用汇编来开发操作系统,就是使用汇编本身的功能再加上BIOS中断提供的功能来完成功能的过程. 汇编本身的功能不够,毕竟没有外部IO,所以通过给多个寄存器赋值,然后调用BIOS中断,让主板/BIOS去读取这些状态/值,然后BIOS根据值执行不同的功能(猜的) 至于如何用汇编控制电路,大概也是用寄存器和电路设计吧 详解:为什么计算机能读懂 1 和 0 ? - 知乎 主要内容 一个月后再写 待续...…
harib14a: 接着上一天的内容,我们来思考一个问题:当所有的LEVEL中都没有任务的时候怎么办?采用前面定时器链表中加入“哨兵”的思路,我们加入一个idle任务,去执行HLT.接下来我们只需要将这个闲置任务idle放在最下层的LEVEL就行了.之后修改一下HariMain测试一下结果. void task_idle(void)//限制任务idle { for (;;) { io_hlt();//让CPU不断的HLT等待中断的到来 } } struct TASK *task_init(str…
harib15a: 到这里为止,我们已经能实现窗口的切换了.我们发现所有的窗口都有光标闪烁,而我们只希望可以接受输入的窗口有光标闪烁.这里我们先来修改任务A中的光标闪烁,当按下TAB时,如果让A不现实光标,我们让cursor_c为负值. void HariMain(void) { //...... for (;;) { //..... <= i && i <= ) { /* 键盘数据 */ //..... + 0x0f) { /* Tab键 */ ) { //向CMD任务窗口输…
harib13a: 今天我们要继续折腾多任务,任务的高效管理是操作系统的一个重要的任务.在今天,我们将为系统创建更加完善的任务管理系统,其中包括优先级,任务等级等. 1.任务管理结构体 #define MAX_TASKS 1000 /* 最大任务数量 */ #define TASK_GDT0 3 /* 任务块在GDT中的初始位置:从GDT的3号段开始 */ struct TSS32 {//任务状态段,这个在前面已经提到过,这里再介绍一下 // 26个int成员,104字节 int backlin…