`
lobin
  • 浏览: 417583 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于os的一些整理:第二篇:1、系统内核

 
阅读更多
写道
使用C语言编写,gcc编译,ld链接。编写内核程序虽然看着和编写普通应用,会涉及到汇编,很多硬件外设和架构相关的东西,可能大家觉得很多需要汇编来实现。

尽可能选择C的方式去实现吧。

 

 

系统内核

系统上电后经引导程序引导后加载内核程序正式进入内核程序。进入内核程序首先进行一系列内核初始化工作。

 

低端内存

一般我们说的低端内存指的是0x00000~0xfffff这1M内存区间,x86在实模式下,或者早期的8086/8088,都只能访问到这1M内存区间。低端内存存放这很多重要的数据,当然在操作系统进入保护模式后,可能并不会使用到这些数据,也就不需要了。但在进入保护模式之前,比如还处于实模式下,系统还在引导阶段,没有这些数据是万万不行的。

 

可以确定的是,低端内存是主内存(RAM) 低于1M的那块内存区间。也不一定规定那1M完整的都是低端内存,有时候通常是低于640K的那块内存。我们可以通过两个BIOS中断可以知道低端内存的大小。

 

int 0x12

可以通过12H中断来获取低端内存的大小。

 

另一个还可以通过15H中断获取:

Int 15/AX=E820h

这个中断也可以获取低端内存的大小。

 

 

 

高端内存

 

高端内存就是除了地段内存这1M的内存区间外,高于1M的其余内存空间

 

系统内核可以加载到低端内存去执行吗?

 

内核加载到低端内存还是高端内存?

 

 

内核加载的位置

内核可以加载到低端内存或者高端内存

 

 

 

内核在什么时候加载?

最直接的方式就是在引导扇区的引导程序中去加载内核。这在内核程序比较小的时候是可以的,直接通过Int 13/AH=02h中断就可以把内核加载进来。

 

但是在这种情况下,如果内核程序是pe格式,如exe程序,或者elf格式,内核加载进来后还需要解析内核程序格式,设置各个段寄存器和偏移量,以便能够到正确的位置执行代码段指令和访问数据段数据和堆栈信息,这样的话,在引导扇区可能无法容纳这么多的代码了。

 

如果内核程序比较大了,现在在引导程序中是无法直接加载内核程序的。

 

在实模式下通过Int 13/AH=02h中断加载内核的时候,该中断有些限制,如“attempted DMA across 64K boundary or >80h sectors”,所以当内核程序比较大了,再加上内核加载的位置,很容易就碰到这种情况。如果使用其他中断或者其他方式加载内核的话,比如使用Int 13/AH=42h中断加载内核,这是个扩展中断,并不是所有的BIOS都支持该中断, 可能有些老的遗留BIOS并不支持扩展中断,目前看在Bochs下是支持该扩展中断,Bochs下的BIOS也支持该中断,但通过Int 13/AH=41h/BX=55AAh无法检查软盘是否支持扩展中断,Int 13/AH=41h/BX=55AAh在指定drive的时候只能指定硬盘的驱动器号:DL = drive (80h-FFh)。通过端口使用LBA或者CHS加载内核的话,只能通过硬盘加载,无法通过软盘进行加载。

 

内核加载方式

 

Int 13/AH=02h

 

Int 13/AH=42h

这是个扩展中断,可以通过Int 13/AH=41h/BX=55AAh检查BIOS是否支持扩展中断。

 

disk address packet

结构说明:

Format of disk address packet:

 

Offset  Size    Description     (Table 00272)

00h    BYTE    size of packet (10h or 18h)

01h    BYTE    reserved (0)

02h    WORD    number of blocks to transfer (max 007Fh for Phoenix EDD)

04h    DWORD   -> transfer buffer

08h    QWORD   starting absolute block number

(for non-LBA devices, compute as

(Cylinder*NumHeads + SelectedHead) * SectorPerTrack +

SelectedSector - 1

10h    QWORD   (EDD-3.0, optional) 64-bit flat address of transfer buffer;

 

used if DWORD at 04h is FFFFh:FFFFh

 

其中:

04h    DWORD   -> transfer buffer

以及

10h    QWORD   (EDD-3.0, optional) 64-bit flat address of transfer buffer;

 

used if DWORD at 04h is FFFFh:FFFFh

指定的是物理地址。

 

结构定义:

 

// disk address packet
// see Int 13/AH=42h for details.
// 
// EDD also called Enhanced Disk Drive
typedef struct 
{
  // size of packet. 
  // 
  // it must be 0x10 or 0x18. since struct disk_address_packet 
  // is designed to be compatible with EDD-3.0, so the 
  // size of struct is 24(0x18), the field p_edd_buffer
  // (64-bit flat address of transfer buffer for EDD-3.0) 
  // is optional when the size of packet set to be 0x10.
  u1 p_size;

  u1 p_reserved; // reserved.
  u2 p_block_num;

  // transfer buffer
  // segment:offset
  u2 p_buffer_offset;
  u2 p_buffer_base;

  u8 p_start_block_number;

  // it's optional when the size of packet is 0x10, and it's needed when the size 
  // of packet is 0x18. it's just for EDD-3.0
  u8 p_edd_buffer;
} disk_address_packet;

注意:p_buffer和p_edd_buffer指定的是物理地址。

 

#define DISK_ADDRESS_PACKET_SIZE 0x10
#define EDD_DISK_ADDRESS_PACKET_SIZE 0x18

 

相关函数声明:

// param 1: drive number
// param 2: start block number and is a logic add-
// ress. 
// param 3: the number of block to read
// param 4,5: the data that read would write to the buff-
// er. segment:offset
// 
// Note: 
// the difference between logic address and physical a-
// ddress is that logic address starting from 0 and ph-
// ysical address starting from 1.
int disk_read_0x42(u1 drive, u8 start_block_number, u2 num, u2 buffer_base, u2 buffer_offset);
// for EDD-3.0
// 
// param 1: drive number
// param 2: start block number and is a logic add-
// ress. 
// param 3: the number of block to read
// param 4: the data that read would write to the buff-
// er. it's a physical address
int edd_disk_read_0x42(u1 drive, u8 start_block_number, u2 num, u8 buffer);

 

disk_read_0x42

int disk_read_0x42(u1 drive, u8 start_block_number, u2 num, u2 buffer_base, u2 buffer_offset)
{
  disk_address_packet packet = {
    .p_size = DISK_ADDRESS_PACKET_SIZE, 
	.p_block_num = num, 
	.p_buffer_base = buffer_base, 
	.p_buffer_offset = buffer_offset, 
	.p_start_block_number = start_block_number
  };

  asm("push %ds");
  asm("mov %ss, %ax");
  asm("mov %ax, %ds");
  asm("movw %0, %%esi" : : "p" (&packet));

  asm("mov $0x42, %ah");
  asm("mov %0, %%dl" : : "m" (drive));

  __kint__(INT13);

  asm("pop %ds");

  asm goto ("jc %l0" : : : : error);
error:
  return 1;
ok:
  return 0;
}

 

00017955850i[BIOS  ] int13_harddisk: function 00, error 07 ! 

 

通过端口方式

 

内核装载程序

为了加载内核,可以通过一个内核装载程序负责将内核程序加载并执行。引导程序只负责加载内核装载程序并执行。

 

内核程序可能是BIN,ELF,EXE,PE等格式,这里涉及到这些格式的内核程序的加载,BIN格式还比较简单,ELF,EXE,PE这些格式的加载比较复杂,关于这些格式的加载在其他章节中会涉及到。

 

关于os的一些整理:第二篇:5、内核EXE格式镜像:

写道

 

 

关于os的一些整理:第二篇:4、内核PE格式镜像:

写道

 

关于os的一些整理:第二篇:6、内核ELF格式镜像:

写道

 

关于os的一些整理:第十篇:程序:

写道

 

 

内核装载程序不大,引导程序可以很容易的将内核装载程序加载进来。

 

typedef struct 
{
  kl_image_format_t k_fmt;

  char *k_opt_hdata;
  char *k_data;

  u2 cs;
  u4 ip;

  u2 ds;

  u2 ss;
  u4 sp;

} kl_image_t;

 

 

内核程序从什么时候开始执行?

引导程序通过一个远跳转到内核程序的入口地址开始执行。这里在编写的时候搞了个链接门的东西用于描述从一个地方跳转到另一个地方去执行。

 

在C程序中的描述大概也就是类似这样:

typedef struct 
{
  u2 offset;
  u2 segment;
} link_gate_descriptor_t;

 

 

内核程序入口

系统启动执行一段时间后,执行到内核程序,调用内核程序入口函数进入内核执行。

入口函数

和c程序入口函数main类似,内核程序也应该有一个入口函数。

如:

void kmain(int argc, char** argv)

{

  ... ...

}

 

内核初始化

 

 

中断初始化

 

 

外设初始化

这里的外设初始化主要是对一些外设及相关控制器做一些基本的初始化设置。如显卡,键盘,鼠标等。

 

初始化显卡

 

设置显示模式

 

文本模式

 

图形模式

 

vga

初始化VGA

 

设置光标属性

 

开启显示光标

通常默认情况下,光标是启用的,如果是禁用状态,比如之前因为其他原因禁用了光标,应该开启显示光标。

 

显示内存设置

 

 

 

 

初始化键盘

检查键盘类型

检查扫描码集

 

设置键盘按键读取方式 

 

初始化鼠标

设置鼠标读取方式

 

 

初始化控制台

初始化显卡

初始化键盘鼠标

初始化控制台输入缓冲 

 

 

初始化磁盘

这里根据系统的引导方式选择对引导的磁盘做一些初始化操作。如通过硬盘引导,则对硬盘做一些初始化操作,如果是通过软盘引导,则对软盘做一些初始化操作。

 

初始化硬盘

 

初始化软盘

 

初始化网卡

 

 

初始化WIFI无线网卡

 

 

 

驱动初始化

 

 

IO初始化

 

 

初始化程序

 

 

初始化分区

对磁盘分区进行初始化。在引导程序中有一块区域用来存放磁盘分区信息。

 

结构

 

显示磁盘分区信息。

 

 

加载文件系统

加载各分区上的文件系统。

 

 

进程初始化调度

 

 

选择任务切换方式

 

 

启动第一个用户程序

 

 

内核程序格式

 

系统内核程序可以以exe形式(PE格式)、ELF格式或者二进制格式提供。

 

PE格式

 

 

ELF格式

 

 

二进制格式

 

 

内核程序以什么样的形式提供

 

系统内核程序可以事先按照指定格式烧录好在安装盘或者镜像程序中提供,或者以文件的形式提供。

 

 

 

0
0
分享到:
评论

相关推荐

    基于java网上球鞋竞拍系统设计与实现.docx

    基于java网上球鞋竞拍系统设计与实现.docx

    基于bert实现关系三元组抽取python源码+数据集+项目说明.zip

    基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。

    基于java的足球赛会管理系统设计与实现.docx

    基于java的足球赛会管理系统设计与实现.docx

    基于java的婚纱摄影网的设计与实现.docx

    基于java的婚纱摄影网的设计与实现.docx

    基于安卓的美颜相机,可以通过opencv加滤镜,并调整亮度和对比度,可以磨皮,但并不能瘦脸,磨皮时非常卡顿,暂无解决方法.zip

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    基于java的农产品仓库管理系统系统设计与实现.docx

    基于java的农产品仓库管理系统系统设计与实现.docx

    基于Java swing +mysql(Oracle)实现的飞机订票系统项目(含毕业论文+答辩 ppt+双数据库版本源码+图)

    【作品名称】:基于Java swing +mysql(Oracle)实现的飞机订票系统项目(含毕业论文+答辩 ppt+双数据库版本源码) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 系统功能需求 本系统用于远程机票预订,包括远程航班信息查询、机票预订与确认等;主要分为四大功能:查询、订票、退票和管理。 管理员登录、注销 到系统并进行插入、删除、更新以及查看机票后台数据库操作 插入:机票的插入可以按照航班号、班期、公司、座位号、起飞地以及抵达地等等插入数据库。 删除:机票可以按照航班号、起止城市、星期进行删除 3.1.1客户端系统功能 1.普通用户: 查询:根据航班号、航空公司以及目的地查询出票类信息 订票: 根据出发日期和第一航班号预订机票,机票类型分为单 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。不一定能够满足所有人的需求,需要有一定的基础能够看懂代码,能够自行调试代码并解决报错,能够自行添加功能修改代码。

    2018信基广场“红动佛山”春节新媒体营销方案.pptx

    2018信基广场“红动佛山”春节新媒体营销方案.pptx

    #_ssm_100_mysql_基于智慧医疗预约挂号管理系统_.zip

    均包含代码,文章,部分项目包含ppt

    基于java的蜀都天香酒楼的网站设计与实现.docx

    基于java的蜀都天香酒楼的网站设计与实现.docx

    java基于ssm+vue 医院疫情防控管理系统源码 带毕业论文+ppt+sql

    1、开发环境:SSM框架;内含Mysql数据库;VUE技术;内含说明文档 2、项目代码都经过严格调试,代码没有任何bug! 3、该资源包括项目的全部源码,下载可以直接使用! 4、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 5、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。

    基于java的英语单词学习网站设计与实现.docx

    基于java的英语单词学习网站设计与实现.docx

    基于java企业销售人员培训系统设计与实现.docx

    基于java企业销售人员培训系统设计与实现.docx

    2019优益C x 易烊千玺微博营销案结案报告.pptx

    2019优益C x 易烊千玺微博营销案结案报告.pptx

    基于java的单位人事管理系统设计与实现.docx

    基于java的单位人事管理系统设计与实现.docx

    java-ssm+vue图书管理系统实现源码(项目源码-说明文档)

    该网站采用SSM框架和Eclipse编辑器、MySQL数据库设计并实现的。网站功能包含系统用户管理、图书管理、用户管理、借书管理、续借管理、违章缴款管理等模块。 首页是网站的入口,主要包含了:新闻信息、图书信息等导航功能。 用户有独立的注册界面,用户填写好注册信息后,会有个一审核的过程,经过管理员审核注册成功,并将注册的信息加入用户表中。 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    我的网页设计部署.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    信息系统项目管理师考试集锦.zip

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    【单变量输入多步预测】基于TCN-GRU-Attention的风电功率预测研究附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    docker安装部署gorse

    docker安装部署gorse

Global site tag (gtag.js) - Google Analytics