自制操作系统Antz day06——内核初步,引入c语言

简介: 在前几天的任务中,我们已经简单实现了MBR,直接操作显示器和硬盘操作来加载其他扇区的程序,如今已经可以进入保护模式了,之前一直使用的是汇编语言,接下来要使用c语言实现内核了。

  Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html

  Linux内核源码分析地址:https://www.cnblogs.com/LexMoon/category/1267413.html

  Github地址:https://github.com/CasterWx 


  在前几天的任务中,我们已经简单实现了MBR,直接操作显示器和硬盘操作来加载其他扇区的程序,如今已经可以进入保护模式了,之前一直使用的是汇编语言,接下来要使用c语言实现内核了。

0. GCC前提

  gcc -c -o main.o  main.c

  -c的作用是编译,汇编到目标代码,不进行链接,也就是直接生成目标文件。

  -o的作用是将输出的文件以指定文件名来存储,有同名文件会直接覆盖。

  如果你不会使用GCC,请先去略作了解。

  这行命令会生成一个main.o文件。它只是一个目标文件,也是待重定位文件,重定位是指文件里面所用的符号还没有安排地址,这些符号的地址要与其他目标文件组成一个可执行文件时再重新定位(排地址),符号是指该目标文件中所调用的函数或使用的变量,这里的组成就是指链接。

  main.o是可重定位文件,ld命令可以链接,指定最终生成文件的起始虚拟地址。

  ld main.o -Ttext 0xc0001500 -e main -o main.bin

  -Ttext指定了起始虚拟地址是0xc0001500,这个地址是内核加载需要的,-o是指定输出文件,-e是指定了程序起始地址。

 

1. 引入C语言

  内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

  现代操作系统设计中,为减少系统本身的开销,往往将一些与硬件紧密相关的(如中断处理程序、设备驱动程序等)、基本的、公共的、运行频率较高的模块(如时钟管理、进程调度等)以及关键性数据结构独立开来,使之常驻内存,并对他们进行保护。通常把这一部分称之为操作系统的内核。
  程序可以直接地被调入计算机中执行,这样的设计说明了设计者不希望提供任何硬件抽象和操作系统的支持,它常见于早期计算机系统的设计中。最终,一些辅助性程序,例如程序加载器和调试器,被设计到机器核心当中,或者固化在只读存储器里。这些变化发生时,操作系统内核的概念就渐渐明晰起来了。

  antz_os.asm :  

  1 ; antz_os
  2 
  3 
  4 BOTPAK    EQU        0x00280000        
  5 DSKCAC    EQU        0x00100000        
  6 DSKCAC0    EQU        0x00008000        
  7 
  8 
  9 CYLS    EQU        0x0ff0            
 10 LEDS    EQU        0x0ff1
 11 VMODE    EQU        0x0ff2            
 12 SCRNX    EQU        0x0ff4           
 13 SCRNY    EQU        0x0ff6      
 14 VRAM    EQU        0x0ff8          
 15 
 16         ORG        0xc200     
 17 
 18 
 19 
 20         MOV        AL,0x13            
 21         MOV        AH,0x00
 22         INT        0x10
 23         MOV        BYTE [VMODE],8   
 24         MOV        WORD [SCRNX],320
 25         MOV        WORD [SCRNY],200
 26         MOV        DWORD [VRAM],0x000a0000
 27 
 28 
 29 
 30         MOV        AH,0x02
 31         INT        0x16             ; keyboard BIOS
 32         MOV        [LEDS],AL
 33 
 34 
 35 
 36 
 37 
 38 
 39         MOV        AL,0xff
 40         OUT        0x21,AL
 41         NOP                        
 42         OUT        0xa1,AL
 43 
 44         CLI                       
 45 
 46
 47 
 48         CALL    waitkbdout
 49         MOV        AL,0xd1
 50         OUT        0x64,AL
 51         CALL    waitkbdout
 52         MOV        AL,0xdf            ; enable A20
 53         OUT        0x60,AL
 54         CALL    waitkbdout
 55 
 56 ; 保护模式转换
 57 
 58 [INSTRSET "i486p"]            
 59 
 60         LGDT    [GDTR0]     
 61         MOV        EAX,CR0
 62         AND        EAX,0x7fffffff 
 63         OR        EAX,0x00000001  
 64         MOV        CR0,EAX
 65         JMP        pipelineflush
 66 
 67         MOV        AX,1*8            
 68         MOV        DS,AX
 69         MOV        ES,AX
 70         MOV        FS,AX
 71         MOV        GS,AX
 72         MOV        SS,AX
 73 
 74 
 75 
 76         MOV        ESI,bootpack    ;
 77         MOV        EDI,BOTPAK        ; 目标
 78         MOV        ECX,512*1024/4
 79         CALL    memcpy
 80 
 81
 82 
 83 
 84 
 85         MOV        ESI,0x7c00        ;
 86         MOV        EDI,DSKCAC        ; 目标
 87         MOV        ECX,512/4
 88         CALL    memcpy
 89 
 90 
 91 
 92         MOV        ESI,DSKCAC0+512    ;
 93         MOV        EDI,DSKCAC+512    ; 目标
 94         MOV        ECX,0
 95         MOV        CL,BYTE [CYLS]
 96         IMUL    ECX,512*18*2/4    
 97         SUB        ECX,512/4       
 98         CALL    memcpy
 99 
100 
101 
102 
103 
104 
105         MOV        EBX,BOTPAK
106         MOV        ECX,[EBX+16]
107         ADD        ECX,3          
108         SHR        ECX,2          
109         JZ        skip            
110         MOV        ESI,[EBX+20]    
111         ADD        ESI,EBX
112         MOV        EDI,[EBX+12]    
113         CALL    memcpy
114 skip:
115         MOV        ESP,[EBX+12]    
116         JMP        DWORD 2*8:0x0000001b
117 
118 waitkbdout:
119         IN         AL,0x64
120         AND         AL,0x02
121         JNZ        waitkbdout        
122         RET
123 
124 memcpy:
125         MOV        EAX,[ESI]
126         ADD        ESI,4
127         MOV        [EDI],EAX
128         ADD        EDI,4
129         SUB        ECX,1
130         JNZ        memcpy            
131         RET
132 
133 
134         ALIGNB    16
135 GDT0:
136         RESB    8                
137         DW        0xffff,0x0000,0x9200,0x00cf    
138         DW        0xffff,0x0000,0x9a28,0x0047    
139         DW        0
140 GDTR0:
141         DW        8*3-1
142         DD        GDT0
143 
144         ALIGNB    16
145 bootpack:

 

  bootpack.c:

 1 void io_hlt(void);
 2 void write_mem8(int addr,int data);
 3 
 4 void HariMain(void)
 5 {
 6     int i ;
 7     for(i=0xa0000;i<0xaffff;i++){
 8         write_mem8(i,15);
 9     }
10     for(;;){
11         io_hlt();
12     }
13 }

  func.asm: 

 1 [FORMAT "WCOFF"]            
 2 [BITS 32]                     
 3 [INSTRSET "i486p"]            
 4 
 5 [FILE "naskfunc.nas"]    
 6 
 7         GLOBAL    _io_hlt    
 8 
 9 [SECTION .text]        
10 
11 _io_hlt:    ; void io_hlt(void);
12         HLT
13         RET
14 
15 _write_mem8:
16         MOV ECX,[ESP+4]
17         MOV AL,[ESP+8]
18         MOV [ECX],AL
19         RET

  在func.asm中声明了bootpack.c中调用的函数,用于绘制屏幕,如果你还不了解怎么绘制屏幕,可以看看第三天的直接操作显卡部分。

  生成的img打开在虚拟机之后。

  

  看到这里你可能会发现,我们在c语言中定义的函数完成了屏幕绘制,在HariMain函数中的for循环将整个屏幕完成了绘制。write_mem8函数的两个参数分别控制了位置和颜色,这是图形化的一大步。

  随意修改一下参数之后,屏幕显示就是不一样的颜色了,至于怎么改,可以在for循环里面自行修改了。

 

  关于内核的知识便不再向之前一样详细概况了,推荐一本书,《Linux内核完全剖析》。

  

 

目录
相关文章
|
18天前
|
安全 Linux 开发者
探索操作系统的心脏:内核与用户空间的交互
在数字世界的每一次点击和命令背后,隐藏着一个复杂而精妙的操作系统世界。本文将带你走进这个世界的核心,揭示内核与用户空间的神秘交互。通过深入浅出的解释和直观的代码示例,我们将一起理解操作系统如何协调硬件资源,管理进程和内存,以及提供文件系统服务。无论你是编程新手还是资深开发者,这篇文章都将为你打开一扇通往操作系统深层原理的大门。让我们一起开始这段旅程,探索那些支撑我们日常数字生活的技术基石吧!
30 6
|
17天前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
18天前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
23天前
|
存储 Linux 开发者
探索操作系统的内核——从理论到实践
操作系统是计算机科学的核心,它像一位默默无闻的指挥官,协调着硬件和软件之间的复杂关系。本文将深入操作系统的心脏——内核,通过直观的解释和丰富的代码示例,揭示其神秘面纱。我们将一起学习进程管理、内存分配、文件系统等关键概念,并通过实际代码,体验内核编程的魅力。无论你是初学者还是有经验的开发者,这篇文章都将带给你新的视角和知识。
|
21天前
|
机器学习/深度学习 人工智能 物联网
操作系统的心脏——深入理解内核机制
在本文中,我们揭开操作系统内核的神秘面纱,探索其作为计算机系统核心的重要性。通过详细分析内核的基本功能、类型以及它如何管理硬件资源和软件进程,我们将了解内核是如何成为现代计算不可或缺的基础。此外,我们还会探讨内核设计的挑战和未来趋势,为读者提供一个全面的内核知识框架。
|
22天前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
26天前
|
存储 调度 开发者
探索操作系统的心脏:内核与用户空间的交互之旅
在数字世界的无限广阔中,操作系统扮演着枢纽的角色,连接硬件与软件,支撑起整个计算生态。本篇文章将带领读者深入操作系统的核心——内核,揭示其与用户空间的神秘交互。我们将透过生动的例子和易于理解的比喻,深入浅出地探讨这一复杂主题,旨在为非专业读者揭开操作系统的神秘面纱,同时为有一定基础的读者提供更深层次的认识。从进程管理到内存分配,从文件系统到设备驱动,每一个环节都是精确而优雅的舞蹈,它们共同编织出稳定而高效的计算体验。让我们开始这场奇妙之旅,一探操作系统背后的科学与艺术。
26 5
|
24天前
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
29 2
|
24天前
|
缓存 网络协议 Linux
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
45 1
|
19天前
|
C语言
探索操作系统的心脏:内核与用户空间的交互
本文将深入操作系统的核心,揭示其内部结构与运作原理。我们将通过浅显易懂的方式,探讨操作系统的两个主要组成部分:内核和用户空间。文章旨在帮助读者理解这两者之间的界限以及它们如何协同工作来管理计算机资源。我们还将介绍系统调用的概念,并展示一个简单的代码示例,以便读者更好地理解这一过程。