自制操作系统Antz(6)——内核初步,引入c语言
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html
Linux内核源码分析地址:https://www.cnblogs.com/LexMoon/category/1267413.html
在前几天的任务中,我们已经简单实现了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 :
; antz_os BOTPAK EQU 0x00280000
DSKCAC EQU 0x00100000
DSKCAC0 EQU 0x00008000 CYLS EQU 0x0ff0
LEDS EQU 0x0ff1
VMODE EQU 0x0ff2
SCRNX EQU 0x0ff4
SCRNY EQU 0x0ff6
VRAM EQU 0x0ff8 ORG 0xc200 MOV AL,0x13
MOV AH,0x00
INT 0x10
MOV BYTE [VMODE],
MOV WORD [SCRNX],
MOV WORD [SCRNY],
MOV DWORD [VRAM],0x000a0000 MOV AH,0x02
INT 0x16 ; keyboard BIOS
MOV [LEDS],AL MOV AL,0xff
OUT 0x21,AL
NOP
OUT 0xa1,AL CLI CALL waitkbdout
MOV AL,0xd1
OUT 0x64,AL
CALL waitkbdout
MOV AL,0xdf ; enable A20
OUT 0x60,AL
CALL waitkbdout ; 保护模式转换 [INSTRSET "i486p"] LGDT [GDTR0]
MOV EAX,CR0
AND EAX,0x7fffffff
OR EAX,0x00000001
MOV CR0,EAX
JMP pipelineflush MOV AX,*
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX MOV ESI,bootpack ; 源
MOV EDI,BOTPAK ; 目标
MOV ECX,*/
CALL memcpy MOV ESI,0x7c00 ; 源
MOV EDI,DSKCAC ; 目标
MOV ECX,/
CALL memcpy MOV ESI,DSKCAC0+ ; 源
MOV EDI,DSKCAC+ ; 目标
MOV ECX,
MOV CL,BYTE [CYLS]
IMUL ECX,**/
SUB ECX,/
CALL memcpy MOV EBX,BOTPAK
MOV ECX,[EBX+]
ADD ECX,
SHR ECX,
JZ skip
MOV ESI,[EBX+]
ADD ESI,EBX
MOV EDI,[EBX+]
CALL memcpy
skip:
MOV ESP,[EBX+]
JMP DWORD *:0x0000001b waitkbdout:
IN AL,0x64
AND AL,0x02
JNZ waitkbdout
RET memcpy:
MOV EAX,[ESI]
ADD ESI,
MOV [EDI],EAX
ADD EDI,
SUB ECX,
JNZ memcpy
RET ALIGNB
GDT0:
RESB
DW 0xffff,0x0000,0x9200,0x00cf
DW 0xffff,0x0000,0x9a28,0x0047
DW
GDTR0:
DW *-
DD GDT0 ALIGNB
bootpack:
bootpack.c:
void io_hlt(void);
void write_mem8(int addr,int data); void HariMain(void)
{
int i ;
for(i=0xa0000;i<0xaffff;i++){
write_mem8(i,);
}
for(;;){
io_hlt();
}
}
func.asm:
[FORMAT "WCOFF"]
[BITS ]
[INSTRSET "i486p"] [FILE "naskfunc.nas"] GLOBAL _io_hlt [SECTION .text] _io_hlt: ; void io_hlt(void);
HLT
RET _write_mem8:
MOV ECX,[ESP+]
MOV AL,[ESP+]
MOV [ECX],AL
RET
在func.asm中声明了bootpack.c中调用的函数,用于绘制屏幕,如果你还不了解怎么绘制屏幕,可以看看第三天的直接操作显卡部分。
生成的img打开在虚拟机之后。
看到这里你可能会发现,我们在c语言中定义的函数完成了屏幕绘制,在HariMain函数中的for循环将整个屏幕完成了绘制。write_mem8函数的两个参数分别控制了位置和颜色,这是图形化的一大步。
随意修改一下参数之后,屏幕显示就是不一样的颜色了,至于怎么改,可以在for循环里面自行修改了。
关于内核的知识便不再向之前一样详细概况了,推荐一本书,《Linux内核完全剖析》。
自制操作系统Antz(6)——内核初步,引入c语言的更多相关文章
- 《30天自制操作系统》读书笔记(3) 引入C语言
这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是 ...
- 自制操作系统Antz -- 系列文章
自制操作系统Antz day10——实现shell(上) AntzUhl 2018-10-10 16:25 阅读:192 评论:0 Linux内核源码分析 day01——内存寻址 AntzUhl ...
- 自制操作系统Antz(13) 显示图片
显示图片只是在多媒体课上看着bmp格式图片的突发奇想,然后就实现在了我自己的操作系统 Antz系统更新地址 Linux内核源码分析地址 Github项目地址 效果图: 显示图片的原理 在之前显卡操作时 ...
- 【自制操作系统06】终于开始用 C 语言了,第一行内核代码!
一.整理下到目前为止的流程图 写到这,终于才把一些苦力活都干完了,也终于到了我们的内核代码部分,也终于开始第一次用 c 语言写代码了!为了这个阶段性的胜利,以及更好地进入内核部分,下图贴一张到目前为止 ...
- 自制操作系统Antz(7)——实现内核 (上)
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...
- 自制操作系统Antz(9)——实现内核 (下) 实现图形化界面
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...
- 自制操作系统Antz(8)——实现内核 (中) 扩展内核
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html 在前几天的任务中,我们已经简单实现了MBR,直接操作显示器和硬盘操作 ...
- 自制操作系统Antz(4)——进入保护模式 (下) 实现内核并从硬盘载入
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...
- 自制操作系统Antz(1)——Boot Sector
0.引子 最近在看操作系统底层方面的东西,最开始的为什么是07c00h这个问题就让我对操作系统有了很大的兴趣.所以准备在看书之余顺便写一个操作系统(Anz).至于为什么这个系统会被叫做Antz,可以参 ...
随机推荐
- python nose测试框架全面介绍十二 ----用例执行顺序打乱
在实际执行自动化测试时,发现我们的用例在使用同一个资源的操作时,用例的执行顺序对测试结果有影响,在手工测试时是完全没法覆盖的. 但每一次都是按用例名字来执行,怎么打乱来执行的. 在网上看到一个有意思的 ...
- VS2017 安装打包插件
安装 打开VS2017:工具 --> 扩展和更新 --> 联机,搜索Microsoft Visual Studio 2017 Installer Projects,如下图: 在搜索中输入: ...
- proxy_set_header Host 所引发的凶案
背景介绍:新搭建了一套测试环境.slb为2.2.2.2,由于应用的特殊性,需要走 test.aaa.com.cn 域名,而该域名在老的测试服务器1.1.1.1有两个不能迁移的服务也在使用,故想出对策, ...
- 常用C++面试总结
指定对齐值:#pragma pack(n),n=1,2,4,8,16改变系统的对齐系数struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成 ...
- Eclipse+pydev+手动安装
1.Eclipse中手动安装pydev插件 解决:Eclipse版本中的windows-performance下面无法显示pydev的情况 1.Eclipse版本是:Version: Luna Ser ...
- linux vue uwsgi nginx 部署路飞学城 安装 vue
vue+uwsgi+nginx部署路飞学城 有一天,老男孩的苑日天给我发来了两个神秘代码,听说是和mjj的结晶 超哥将这两个代码,放到了一个网站上,大家可以自行下载 路飞学城django代码#这个代码 ...
- php 延迟静态绑定: static关键字
abstract class DomainObject { public static function create() { return new self(); } } class User ex ...
- VAE (variational autoencoder)
https://www.zhihu.com/question/41490383/answer/103006793 自编码是一种表示学习的技术,是deep learning的核心问题 让输入等于输出,取 ...
- winfrom弹出窗口用timer控件控制倒计时20秒后关闭
功能描述: 因为在程序退出时需要确认是否是误操作,所以加了密码输入的子窗体,子窗体在20秒内会自动关闭 代码如下: private int count; private void Form2_Load ...
- java框架之SpringBoot(1)-入门
简介 Spring Boot 用来简化 Spring 应用开发,约定大于配置,去繁从简,just run 就能创建一个独立的.产品级别的应用. 背景: J2EE 笨重的开发.繁多的配置.低下的开发效率 ...