![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
自己动手写OS
cy295957410
这个作者很懒,什么都没留下…
展开
-
用C还是C++写OS呢?
今天想到一个很有意思的话题,mark下。有同学想到用C++写一个OS,由于本人之前用C写了一个FreeFlyOS,所以问题产生了,C++和C语言在不使用标准库(裸机)的情况下有啥区别呢,g++能比gcc多解析一些什么呢?先来查下gcc的手册,发现关于C语言的实现都定义在ISO/IEC 9899:2011标准中,继续google,有本中文书《标准C语言指南》对这个标准进行了说明。具体就不细看,大概看下目录把。大概就这么多把,关于C语言特性可能就这么多了,接下来看看C++的。主要原创 2021-01-09 17:23:09 · 601 阅读 · 0 评论 -
FreeFlyOS【二十五】:elf部分详解
ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI:原创 2021-01-05 09:25:04 · 593 阅读 · 0 评论 -
FreeFlyOS【二十四】:disassembly部分详解
该目录主要是可执行文件的反汇编只能看到.text段的数据,简单示意下。boot_disass.md =====》》》》bootblock(引导程序)的反汇编kernel_disass.md =====》》》》kernel(内核)的反汇编代码test_cat.md =====》》》》test_cat(cat测试程序)的反汇编代码test_exec_disass.md =====》》》》test_exec(exec测试程序)的反汇编代码test_pipe_disass.md =====》》》》原创 2021-01-05 09:24:49 · 457 阅读 · 0 评论 -
FreeFlyOS【二十三】:cmake部分详解
mac_x86_toolchain.cmakeset(CMAKE_SYSTEM_NAME Darwin)set(CMAKE_SYSTEM_VERSION 1)set(CMAKE_SYSTEM_PROCESSOR x86_64)# GCCfind_program(X86_64 x86_64-elf-gcc REQUIRED)if (NOT X86_64) message(FATAL_ERROR "x86_64-elf-gcc not found.\n" "Run原创 2021-01-05 09:24:34 · 230 阅读 · 0 评论 -
FreeFlyOS【二十二】:test_pipe部分详解
start.S.text.code32.extern main.extern exit.global _start_start: push %ebx push %ecx call main push %eax call exittest.c测试管道用的程序#include "../kernel/user/stdio.h"#include "../kernel/user/user_syscall.h"int main(int argc, cha原创 2021-01-05 09:24:19 · 147 阅读 · 0 评论 -
FreeFlyOS【二十一】:test_cat部分详解
start.S.text.code32.extern main.extern exit.global _start_start: push %ebx push %ecx call main push %eax call exittest.ccat命令实现,属于外部命令#include "../kernel/user/stdio.h"#include "../kernel/user/user_syscall.h"#include "../ker原创 2021-01-05 09:24:07 · 205 阅读 · 0 评论 -
FreeFlyOS【二十】:test_exec部分详解
start.S.text.code32.extern main.extern exit.global _start_start: push %ebx push %ecx call maintest.c测试exec是否能执行prog程序#include "../kernel/user/stdio.h"#include "../kernel/user/user_syscall.h"#define NULL ((void *)0)void main(int a原创 2021-01-04 09:28:12 · 137 阅读 · 0 评论 -
FreeFlyOS【十九】:user部分详解
stdio.c#include "stdio.h"#include "va_list.h"#include "user_syscall.h"void printf(char *fmt,...){ user_va_list ap; char c; char *str; int dec_num; int hex_num; unsigned int unsigned_dec_num; unsigned int unsigned_hex原创 2021-01-04 09:27:54 · 314 阅读 · 0 评论 -
FreeFlyOS【十八】:main部分详解
main.cELF格式的内核入口,包含各种外设初始化,以及GDT和IDT表的设置等。#include "main.h"#include "../asm/asm.h"#include "../dt/dt.h"#include "../interrupt/trap.h"#include "../timer/timer.h"#include "../pic/pic.h"#include "../vga/vga.h"#include "../mem/pmm.h"#include "../mem/原创 2021-01-04 09:27:37 · 231 阅读 · 0 评论 -
FreeFlyOS【十七】:pipe部分详解
ioqueue.c#include "ioqueue.h"#include "../task/task.h"#include "../debug/debug.h"extern struct task_struct *current;/* 初始化io队列ioq */void ioqueue_init(struct ioqueue* ioq) { lock_init(&ioq->lock); // 初始化io队列的锁 ioq->producer = ioq-&原创 2021-01-04 09:27:16 · 249 阅读 · 0 评论 -
FreeFlyOS【十六】:file部分详解
bitmap.h#ifndef _BITMAP_H_#define _BITMAP_H_/* ** 在遍历位图时,整体上以字节为单位,细节上是以位为单位,** 所以此处位图的指针必须是单字节 */struct bitmap { unsigned int btmp_bytes_len; unsigned char* bits;};#endifdir.c#include "dir.h"#include "inode.h"#include "file.h"#inc原创 2021-01-04 09:26:57 · 368 阅读 · 0 评论 -
FreeFlyOS【十五】:task部分详解
task.c#include "task.h"#include "../interrupt/syscall.h"#include "../stl/elf.h"#include "../mem/pmm.h"#include "../mem/vmm.h"#include "../mem/memlayout.h"#include "../debug/debug.h"#include "../sync/sync.h"#include "../file/file.h"#include "../fi原创 2021-01-04 09:26:39 · 416 阅读 · 0 评论 -
FreeFlyOS【十四】:sync部分详解
sync.c#include "sync.h"#include "../debug/debug.h"#include "../interrupt/trap.h"#include "../task/task.h"#include "../vga/vga.h"extern struct task_struct *current;/* 初始化信号量 */void sema_init(struct semaphore* psema, unsigned char value) { psema-&原创 2021-01-04 09:26:25 · 246 阅读 · 0 评论 -
FreeFlyOS【十三】:mem部分详解
memlayout.h内存布局信息#ifndef _MEMLAYOUT_H_#define _MEMLAYOUT_H_#define USER_START 0x40000000#define KERNEL_START 0xC1000000#define KERNEL_STACK_START 0xF8000000 //0xC1800000#define KERNEL_STACK_SIZE 0x2000 //8KB#define EXEC_START 0x60000000//物理地原创 2021-01-04 09:26:11 · 335 阅读 · 0 评论 -
FreeFlyOS【十二】:debug部分详解
debug.c包含两个函数,一个是打印寄存器信息,另一个是设置断言失败的结果#include "debug.h"#include "monitor.h"#include "../vga/vga.h"#include "../interrupt/trap.h"/** 打印段寄存器信息*/void print_seg(){ unsigned short cs,ds,gs,es,fs,ss; asm volatile("movw %%cs, %0;"原创 2021-01-04 09:25:14 · 267 阅读 · 0 评论 -
FreeFlyOS【十一】:stl部分详解
list.h链表数据结构#ifndef _LIST_H_#define _LIST_H_/* * * Simple doubly linked list implementation. * * Some of the internal functions ("__xxx") are useful when manipulating * whole lists rather than single entries, as sometimes we already know * the nex原创 2021-01-04 09:24:53 · 162 阅读 · 0 评论 -
FreeFlyOS【十】:pic部分详解
pic.c8259A芯片级联控制器PIC的初始化#include "pic.h"static unsigned short irq_mask = 0xFFFF & ~(1 << 2);static char did_init = 0;static void pic_setmask(unsigned short mask) { irq_mask = mask; unsigned char mask_low=mask&0xff; unsigned原创 2021-01-03 21:29:34 · 644 阅读 · 0 评论 -
FreeFlyOS【九】:timer部分详解
timer.c定时器初始化#include "timer.h"#include "../asm/asm.h"#include "../pic/pic.h"#include "../interrupt/trap.h"unsigned int volatile jiffies; //记录自系统启动以来产生的节拍总数unsigned int volatile second; //根据节拍总数换算成秒数void timer_init(unsigned int frequency){原创 2021-01-03 21:26:40 · 291 阅读 · 0 评论 -
FreeFlyOS【八】:serial部分详解
serial.c串口设备驱动#include "serial.h"#include "../pic/pic.h"#include "../asm/asm.h"#include "../interrupt/trap.h"#include "../vga/vga.h"#include "../keyboard/keyboard.h"struct consle cons;static char serial_exists = 0;extern char shell_input; //she原创 2021-01-03 21:21:02 · 426 阅读 · 0 评论 -
FreeFlyOS【七】:keyboard部分详解
keyboard.c键盘驱动程序#include "keyboard.h"#include "../interrupt/trap.h"#include "../vga/vga.h"#include "../serial/serial.h"/***** Keyboard input code *****/#define NO 0#define SHIFT (1<<0)#define CTL (1<&l原创 2021-01-03 21:18:49 · 675 阅读 · 2 评论 -
FreeFlyOS【六】:interrupt部分详解
trap.c中断服务程序IRQ的实现.#include "trap.h"#include "../asm/asm.h"#include "../vga/vga.h"#include "../timer/timer.h"#include "../debug/debug.h"#include "../dt/dt.h"#include "../task/task.h"#include "../sync/sync.h"#include "../serial/serial.h"extern st原创 2021-01-03 21:03:31 · 358 阅读 · 0 评论 -
FreeFlyOS【五】:VGA部分详解
vga.c#include "vga.h"#include "../asm/asm.h"#include "../serial/serial.h"#include "../keyboard/keyboard.h"#define NULL ((void *)0)//the standard window is 80*25, max of cursor_x is 25, max of cursor_y is 80static unsigned char cursor_x=0;static uns原创 2021-01-03 20:56:34 · 343 阅读 · 0 评论 -
FreeFlyOS【四】:dt部分详解
dt.c主要功能:GDT和IDT表的建立和加载1、GDT表在bootsector.S中就建立了,但那处于16位实模式下,而此时程序已进入32位保护模式,GDT每个段描述符限长变成4GB,所以需要建立一个新的GDT表,并加载到GDTR寄存器中。2、IDT表和GDT表不同的是需要设置中断号和中断向量,并将硬件PIC上的中断号和中断向量绑定,当发生一个硬件中断时,比如按下键盘,PIC就会向系统送一个中断号(硬件完成),然后就会去IDT表中找该中断号对应的中断向量,然后执行相应的中断服务处理程序。#incl原创 2021-01-03 20:51:29 · 451 阅读 · 0 评论 -
FreeFlyOS【三】:asm部分详解
asm.c通过C语言函数实现嵌入汇编指令#include "asm.h"#define NULL (void *)0/*** inb(port):从端口port读出一个字节数据并返回*/inline unsigned char inb(unsigned short port) { unsigned char data; asm volatile ("inb %1, %0" : "=a" (data) : "d" (port)); return data;}/*原创 2021-01-03 19:24:55 · 439 阅读 · 0 评论 -
FreeFlyOS【二】:init部分详解
init.c/** init.c : 建立临时页表,开启分页*/#include "init.h"#include "../mem/memlayout.h"#include "../debug/debug.h"/** 具体映射关系已经在kernel.ld中定义即,LMA=VMA-0xC0000000,故* 只需将内核所在的地址写入页表,并开启分页即可。*/extern unsigned int kernel_end;void init原创 2021-01-03 19:21:20 · 135 阅读 · 0 评论 -
FreeFlyOS【一】:boot部分(引导扇区)详解
boot.ld/* ** 链接脚本*/OUTPUT_FORMAT(elf32-i386)OUTPUT_ARCH(i386)ENTRY(start)/** ld有多种方法设置进程入口地址, 按以下顺序: (编号越前, 优先级越高)* 1, ld命令行的-e选项* 2, 连接脚本的ENTRY(SYMBOL)命令* 3, 如果定义了start 符号, 使用start符号值* 4, 如果存在 .text原创 2021-01-03 19:10:12 · 1197 阅读 · 0 评论 -
FreeFlyOS写后感
FreeFlyOS写后感截止到2020年底,FreeFlyOS项目基本结束了,因为之前对OS比较感兴趣并且有一定的了解,再加上暑期参加了一个开源OS的内存优化,感觉自己实现起来也并不算太难,所以从9月起开始写这个项目,直到12月底才基本完成,期间遇到了很多问题,但最后都解决了,说明我行,你也行!如果你有写OS的想法的,并且有时间完成它,那么为何不自己实现一个呢,不去造轮子怎么理解轮子的本质呢?这也算实现了自己的小目标了,以后看有没有时间继续更新了!项目地址:https://github.com/das原创 2020-12-28 21:17:54 · 129 阅读 · 0 评论 -
32位x86版的自制操作系统FreeFlyOS已上线
github地址:https://github.com/dashanji/FreeFlyOS好用请点个star!原创 2020-10-16 10:37:49 · 253 阅读 · 0 评论 -
三、GDT和IDT的配置
在bootsector.S中我们就打开了CR0寄存器的第0位(设置为1),即打开了保护模式。接下来进入今天的主题GDT(全局描述符表)的设置。首先来看下intel手册中是如何规定gdt的。intel内置48位的GDTR寄存器,低16位代表描述符的数量,最大可有8192个描述符,基地址则规定了GDT表的地址。那么GDT表中的段描述符长啥样呢?可以从下图中窥见一斑。那么根据这个段描述符的描述,总共8个字节,我们可以设定一个结构体来描述一个段描述符。本文主要借鉴ucore的GDT设置方法,如下..原创 2020-09-08 21:59:33 · 921 阅读 · 0 评论 -
二、显卡驱动--CGA设置
在之前的博客上说过地址空间并不是全部映射到内存上,还有一些外部设备,IA手册上的1MB以下地址空间分布如下图所示。我们都知道CPU访问外设有两种方式:IO与内存统一编址和IO与内存独立编址,一般来说,外设中控制读写的端口都是独立编址,即用in/out指令控制,而外设中的存储器一般和内存进行统一编址,即CPU访问这些地址时和访问内存是一样的,也可以理解成这部分存储器映射到了内存中,比如上图中的各种地址段均被映射到了一些外设上。回归正题,要在PC上要显示文字,通常需要显示器和显卡这两个硬件设备。一.原创 2020-09-06 21:16:54 · 1412 阅读 · 0 评论 -
一、配置MAC下的OS开发环境以及打印内存
1.配置MAC下的OS开发环境及打印内存首先需要在MAC中安装brew,类似linux环境下的apt-get以及python中的pip,具体教程见(官网)https://brew.sh 安装好brew后,安装交叉编译环境,具体原因是mac电脑里的gcc是适配MAC环境的,其资料相对较少,不易于开发,所以我们需要安装x86_64-elf工具链,适配于LINUX环境,资料很多,输入以下命令即可安装2个...原创 2020-09-04 17:48:15 · 667 阅读 · 0 评论 -
自己动手写操作系统(二)—打印内存
自己动手写操作系统(二)—打印内存前文讲到了bootloader,那么本文就是实现了一个简单的内存探测并通过送入显存来打印信息。主要难点:1、前文只有一个bootloader,也就是不超过512B的小引导程序,那么我们如何加入内核文件?2、如何实现内存探测,并显示?问题一:简单来讲,我们写操作系统一般都是在LINUX环境下,那么内核文件可以理解为一个可执行文件,在LINUX环境下就是ELF格式的可执行文件了,那么ELF格式可执行文件是什么样的呢?主要包含程序头部表和节区头部表,可以通过reade原创 2020-06-12 13:28:22 · 312 阅读 · 0 评论 -
自己动手写操作系统(一)--bootloader
一、bootloader代码 #计算机启动运行在实模式,主要经过以下几个步骤进入保护模式 .text #.code16表示16位代码段 .code16 .global start start: #1、将ds、es和ss段寄存器均设置成cs段寄存器的值,并将栈顶指针esp指向0x7c00,栈向低地址增长。这步操作其实也可省略,因为在16...原创 2019-12-11 22:25:03 · 587 阅读 · 0 评论