
背景知识
你好 我绝对欢迎大家,今天我想向您介绍我为x86架构编写可行的OS的经验。
在一个春夜里,我有一个绝妙的主意-尝试编写自己的操作系统,该操作系统可以让您运行程序,与设备一起使用,并且通常根据需要从Intel的架构中挤出所有功能:例如,为您的工厂或其他。 我的目标是并且正在编写一种这样的操作系统,它可以为某些特定任务提供最佳性能,而不会在各种过多的事情上浪费CPU时间。 我主要追求运动兴趣,在系统编程方面为自己积累了经验,并为无所不在的设备编写了驱动程序。 由您决定结果是什么,我将立即说您不必编写有关创建自己的Linux发行版的评论,而我有兴趣编写“从头开始”的所有内容-从头开始,以便深入研究OSdev主题。 我要对本杰明·伦特(Benjamin Lunt)和OSDev论坛以及他们的Wiki表示深深的谢意。 Ben帮助我处理了EHCI,这无疑为我的操作系统做出了巨大贡献-USB设备无处不在! 我还承担了创建自己的体系结构(对我来说很方便)的任务,这并不排除使用ELF文件标准。
好吧,让我们说清楚。
UPD:所有信息都可以在
tyk组中找到,还有一则贴有停靠
栏和图片的帖子(旧的,现在我要为稳定版添加停靠
栏 )
怎么办
现在,我的操作系统可以使用USB闪存驱动器,鼠标,键盘,AHCI磁盘,PCI IDE控制器,APIC和ACPI,实现了多任务处理,程序启动,文件流传输,SVGA驱动程序在0x118 VBE模式下工作, DNS,DHCP,TCP,UPD,IPv4,HTTP,完整的FAT32驱动程序,RTL8139(69)驱动程序和Intel千兆以太网工作。
窗口系统与我的SVGA实施一起,可以产生多达120 FPS的图像,并且可以完全重绘屏幕。 让我们继续介绍如何实现所有这些以及通常如何工作。
如何运作?
首先,我编写了一个引导加载程序,该加载程序读取带有FAT32内核的辅助引导加载程序。 第二个引导程序进入保护模式并跳转到内核,在该内核中我加载并配置IDT,然后初始化PCI设备,启动内核并启动CMD。
有人会问,您如何通过SVGA达到这样的性能? 答案很简单:汇编程序,汇编程序和再次汇编程序。 并非没有SSE指令,这将大大加速内存复制。 例如,以下是用于在LFB(线性帧缓冲区)中复制视频缓冲区的代码:
.byte 0x60#Save registers in stack
mov %2,%%ecx #Repeat count to ecx
mov %0,%%edi #Video memory start to edi
mov %1,%%esi #Video buffer start to esi
ww1sse2:
movaps (%%esi),%%xmm0 #Copy 16 bytes to xmm0 from buffer
movaps %%xmm0,(%%edi) #Copy from xmm0 to video memory
movaps 16(%%esi),%%xmm0 #16 again, but + 16 from current
movaps %%xmm0,16(%%edi) #16 again, but + 16 from current
movaps 32(%%esi),%%xmm0 #16 again, but + 32 from current
movaps %%xmm0,32(%%edi) #16 again, but + 32 from current
movaps 48(%%esi),%%xmm0 #16 again, but + 48 from current
movaps %%xmm0,48(%%edi) #16 again, but + 48 from current
add $64,%%edi #Add 64 bytes to edi
add $64,%%esi #Add 64 bytes to esi
dec%%ecx#Decrement count
#test %%ecx,%%ecx #Compare ecx with zero
jnz ww1sse2 #If not zero, repeat again
.byte 0x61 #Restore registers from stack
, , , .
— «Watermark Allocator». , , , ..
-, .
MS-DOS: — . MBR , GPT .
— - , — .
, , — , , : , VIM.
, : , , return , - . , , - , .
: , , , , . — , , — — return'.
, , -, .
— - , - - , , ( , ) — , , .
!