自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 资源 (7)
  • 收藏
  • 关注

原创 基于Kubebuilder实现简单的容器注入

基于Kubebuilder的Webhook搭建教程说明本文项目基于https://github.com/dashanji/webhookdemo主要实现了一个向pod注入nginx容器的webhook。主要步骤1、本文环境为GO : go version go1.15.12 darwin/amd64KubeBuilder : v2.3.2kindest/node : v1.16.92、为了避免一些错误的发生,在第三步创建kind集群和第四步应用cert-manager的时候,尽量不使用代

2021-05-23 22:53:42 258 1

原创 GO踩坑日记(一)二维slice

GO踩坑日记(一)二维slice背景,leetcode 78 子集问题func subsets(nums []int) [][]int { //var ans [][]int = [][]int{} ans := [][]int{} path := []int{} var dfs func(nums []int , path []int,start int) dfs=func(nums []int,path []int,start int){ //track := make ([]int

2021-03-30 16:25:03 409 3

原创 一道关于fork和printf的题

一道关于fork和printf的题以下有4段代码,问分别输出什么#include<stdio.h>#include<unistd.h>void main(){ int i=0; for(;i<2;i++){ printf("a"); fork(); }}我的答案:8个a。实际答案:8个a#include<stdio.h>#include<unistd.h>void main(){ int i=0; for(;i

2021-01-16 11:17:48 549

原创 地址空间——intel架构

intel架构地址空间Intel架构中的程序访问计算机资源时使用了四种物理地址空间,如图1所示。​ 图1 Intel CPU使用的四个物理地址空间。Registers和MSRs在CPU内部,​ 而存储器与I/O地址空间则通过系统总线与内存或者其他设备进行交流​ 寄存器空间由用于访问CPU的寄存器文件名称组成,这是唯一以C

2021-01-12 15:54:02 466 5

原创 用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 562

原创 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 382

原创 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 429

原创 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 199

原创 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 130

原创 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 195

原创 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 117

原创 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 280

原创 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 214

原创 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 228

原创 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 340

原创 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 389

原创 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 225

原创 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 314

原创 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 236

原创 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 151

原创 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 617

原创 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 257

原创 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 403

原创 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 651 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 335

原创 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 312

原创 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 426

原创 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 417

原创 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 125

原创 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 1130

原创 FreeFlyOS写后感

FreeFlyOS写后感截止到2020年底,FreeFlyOS项目基本结束了,因为之前对OS比较感兴趣并且有一定的了解,再加上暑期参加了一个开源OS的内存优化,感觉自己实现起来也并不算太难,所以从9月起开始写这个项目,直到12月底才基本完成,期间遇到了很多问题,但最后都解决了,说明我行,你也行!如果你有写OS的想法的,并且有时间完成它,那么为何不自己实现一个呢,不去造轮子怎么理解轮子的本质呢?这也算实现了自己的小目标了,以后看有没有时间继续更新了!项目地址:https://github.com/das

2020-12-28 21:17:54 123

原创 32位x86版的自制操作系统FreeFlyOS已上线

github地址:https://github.com/dashanji/FreeFlyOS好用请点个star!

2020-10-16 10:37:49 213

原创 三、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 842

原创 二、显卡驱动--CGA设置

在之前的博客上说过地址空间并不是全部映射到内存上,还有一些外部设备,IA手册上的1MB以下地址空间分布如下图所示。我们都知道CPU访问外设有两种方式:IO与内存统一编址和IO与内存独立编址,一般来说,外设中控制读写的端口都是独立编址,即用in/out指令控制,而外设中的存储器一般和内存进行统一编址,即CPU访问这些地址时和访问内存是一样的,也可以理解成这部分存储器映射到了内存中,比如上图中的各种地址段均被映射到了一些外设上。回归正题,要在PC上要显示文字,通常需要显示器和显卡这两个硬件设备。一.

2020-09-06 21:16:54 1318

原创 一、配置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 605

原创 自己动手写操作系统(二)—打印内存

自己动手写操作系统(二)—打印内存前文讲到了bootloader,那么本文就是实现了一个简单的内存探测并通过送入显存来打印信息。主要难点:1、前文只有一个bootloader,也就是不超过512B的小引导程序,那么我们如何加入内核文件?2、如何实现内存探测,并显示?问题一:简单来讲,我们写操作系统一般都是在LINUX环境下,那么内核文件可以理解为一个可执行文件,在LINUX环境下就是ELF格式的可执行文件了,那么ELF格式可执行文件是什么样的呢?主要包含程序头部表和节区头部表,可以通过reade

2020-06-12 13:28:22 291

原创 自己动手写操作系统(一)--bootloader

一、bootloader代码 #计算机启动运行在实模式,主要经过以下几个步骤进入保护模式 .text #.code16表示16位代码段 .code16 .global start start: #1、将ds、es和ss段寄存器均设置成cs段寄存器的值,并将栈顶指针esp指向0x7c00,栈向低地址增长。这步操作其实也可省略,因为在16...

2019-12-11 22:25:03 568

原创 PC机启动后如何执行第一条指令?

在过去的三个月内,本人根据《linux内核设计的艺术》和《linux0.11内核完全注释》细读了linux-0.11源码中的大部分内容,最近开始研究清华大学的操作系统实验课中的ucore源代码,因此希望将自己的所思所想分享给大家,也欢迎大家一起来交流探讨。 当我们按下开机按钮时,电脑是怎么开始执行第一条指令的? ①梦回40年前,当时的intel公司生产...

2019-11-23 15:12:57 5213 4

原创 一个系统引导程序的简单示例1

在做这个引导程序之前需准备:ubuntu操作系统(16.04)、VMware虚拟机、nasm编译器如何安装ubuntu操作系统和VMware虚拟机:安装教程见http://blog.csdn.net/u013142781/article/details/50529030如何将nasm编译器导入ubuntu系统:1.下载安装文件地址是:http://www.nasm.us/p

2017-03-04 09:46:09 3943 11

2017年上半年软件设计师下午案例分析真题及答案解析

这份文档是2017年上半年软件设计师下午案例分析真题及详细的答案解析

2018-05-02

2017年上半年软件设计师上午真题及答案解析

该文档是2017年上半年软件设计师上午真题及详细的答案解析。

2018-05-02

Linux内核完全注释(修正版v3.0)

该文档是关于Linux的内核代码的注释说明,可以方便读者深入了解Linux内核技术,提高编程能力。

2018-05-02

上海双石-ARM嵌入式系统设计及接口编程实验教程

基于S3C2440的上海双石公司的ARM嵌入式系统设计,基于博创UP2440板子

2018-01-31

嵌入式硬件设计

嵌入式硬件设计(第二版),ISBN:9787508353722,作者:(美)卡特索利斯

2017-12-30

飞凌2440用户手册(完整版)

该文档为飞凌2440的中文数据手册,为嵌入式行业工作者提供了参考的手册。

2009-05-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除