x86架构
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 · 618 阅读 · 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 · 617 阅读 · 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 · 465 阅读 · 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 · 240 阅读 · 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 · 149 阅读 · 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 · 209 阅读 · 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 · 141 阅读 · 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 · 323 阅读 · 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 · 240 阅读 · 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 · 257 阅读 · 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 · 384 阅读 · 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 · 418 阅读 · 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 · 255 阅读 · 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 · 343 阅读 · 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 · 272 阅读 · 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 · 168 阅读 · 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 · 649 阅读 · 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 · 300 阅读 · 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 · 431 阅读 · 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 · 682 阅读 · 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 · 364 阅读 · 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 · 348 阅读 · 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 · 457 阅读 · 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 · 444 阅读 · 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 · 140 阅读 · 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 · 1211 阅读 · 0 评论 -
FreeFlyOS写后感
FreeFlyOS写后感截止到2020年底,FreeFlyOS项目基本结束了,因为之前对OS比较感兴趣并且有一定的了解,再加上暑期参加了一个开源OS的内存优化,感觉自己实现起来也并不算太难,所以从9月起开始写这个项目,直到12月底才基本完成,期间遇到了很多问题,但最后都解决了,说明我行,你也行!如果你有写OS的想法的,并且有时间完成它,那么为何不自己实现一个呢,不去造轮子怎么理解轮子的本质呢?这也算实现了自己的小目标了,以后看有没有时间继续更新了!项目地址:https://github.com/das原创 2020-12-28 21:17:54 · 134 阅读 · 0 评论 -
32位x86版的自制操作系统FreeFlyOS已上线
github地址:https://github.com/dashanji/FreeFlyOS好用请点个star!原创 2020-10-16 10:37:49 · 259 阅读 · 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 · 677 阅读 · 0 评论 -
PC机启动后如何执行第一条指令?
在过去的三个月内,本人根据《linux内核设计的艺术》和《linux0.11内核完全注释》细读了linux-0.11源码中的大部分内容,最近开始研究清华大学的操作系统实验课中的ucore源代码,因此希望将自己的所思所想分享给大家,也欢迎大家一起来交流探讨。 当我们按下开机按钮时,电脑是怎么开始执行第一条指令的? ①梦回40年前,当时的intel公司生产...原创 2019-11-23 15:12:57 · 5322 阅读 · 4 评论