- 博客(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 251 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 405 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 537
原创 地址空间——intel架构
intel架构地址空间Intel架构中的程序访问计算机资源时使用了四种物理地址空间,如图1所示。 图1 Intel CPU使用的四个物理地址空间。Registers和MSRs在CPU内部, 而存储器与I/O地址空间则通过系统总线与内存或者其他设备进行交流 寄存器空间由用于访问CPU的寄存器文件名称组成,这是唯一以C
2021-01-12 15:54:02 455 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 560
原创 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 377
原创 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 422
原创 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 192
原创 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 128
原创 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 193
原创 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 113
原创 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 277
原创 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 208
原创 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 227
原创 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 337
原创 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 385
原创 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 221
原创 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 312
原创 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 233
原创 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 149
原创 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 615
原创 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 254
原创 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 402
原创 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 648 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 332
原创 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 307
原创 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 416
原创 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 412
原创 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 124
原创 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 1112
原创 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 211
原创 三、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 832
原创 二、显卡驱动--CGA设置
在之前的博客上说过地址空间并不是全部映射到内存上,还有一些外部设备,IA手册上的1MB以下地址空间分布如下图所示。我们都知道CPU访问外设有两种方式:IO与内存统一编址和IO与内存独立编址,一般来说,外设中控制读写的端口都是独立编址,即用in/out指令控制,而外设中的存储器一般和内存进行统一编址,即CPU访问这些地址时和访问内存是一样的,也可以理解成这部分存储器映射到了内存中,比如上图中的各种地址段均被映射到了一些外设上。回归正题,要在PC上要显示文字,通常需要显示器和显卡这两个硬件设备。一.
2020-09-06 21:16:54 1303
原创 一、配置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 592
原创 自己动手写操作系统(二)—打印内存
自己动手写操作系统(二)—打印内存前文讲到了bootloader,那么本文就是实现了一个简单的内存探测并通过送入显存来打印信息。主要难点:1、前文只有一个bootloader,也就是不超过512B的小引导程序,那么我们如何加入内核文件?2、如何实现内存探测,并显示?问题一:简单来讲,我们写操作系统一般都是在LINUX环境下,那么内核文件可以理解为一个可执行文件,在LINUX环境下就是ELF格式的可执行文件了,那么ELF格式可执行文件是什么样的呢?主要包含程序头部表和节区头部表,可以通过reade
2020-06-12 13:28:22 286
原创 自己动手写操作系统(一)--bootloader
一、bootloader代码 #计算机启动运行在实模式,主要经过以下几个步骤进入保护模式 .text #.code16表示16位代码段 .code16 .global start start: #1、将ds、es和ss段寄存器均设置成cs段寄存器的值,并将栈顶指针esp指向0x7c00,栈向低地址增长。这步操作其实也可省略,因为在16...
2019-12-11 22:25:03 559
原创 PC机启动后如何执行第一条指令?
在过去的三个月内,本人根据《linux内核设计的艺术》和《linux0.11内核完全注释》细读了linux-0.11源码中的大部分内容,最近开始研究清华大学的操作系统实验课中的ucore源代码,因此希望将自己的所思所想分享给大家,也欢迎大家一起来交流探讨。 当我们按下开机按钮时,电脑是怎么开始执行第一条指令的? ①梦回40年前,当时的intel公司生产...
2019-11-23 15:12:57 5204 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 3940 11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人