当前位置: 首页 > news >正文

营销型网站源码安阳汤阴县网站建设

营销型网站源码,安阳汤阴县网站建设,网店推广新趋势包括以下什么趋势,怎么制作网站内容OS架构整理引导启动部分bios bootloader区别启动流程(x86 BIOS 启动):biosboot_loader3.切换进保护模式实模式的限制如何切换进保护模式加载kernel到内存地址1M加载内核映像文件elf一些基础知识链接脚本与代码数据段显示字符串bios中断向量表…

OS架构整理

  • 引导启动部分
    • bios bootloader区别
    • 启动流程(x86 BIOS 启动):
    • bios
    • boot_loader
      • 3.切换进保护模式
        • 实模式的限制
        • 如何切换进保护模式
      • 加载kernel到内存地址1M
      • 加载内核映像文件
      • elf
  • 一些基础知识
    • 链接脚本与代码数据段
    • 显示字符串
    • bios中断向量表中来显示
    • 内联汇编来显示

引导启动部分

bios bootloader区别

[BIOS] (硬件开机,里面有写好的固件,上电自检)↓ 读取硬盘第0扇区 → 加载到内存地址 0x7C00
[boot] (512字节以内的 MBR/bootloader阶段1)(因为只有512字节,太小了所以用了二级引导)↓ 加载并跳转到更复杂的 loader(通常是 2阶)
[loader] (多段程序,支持文件系统、内核加载等)↓ 加载操作系统内核(kernel)
[OS内核] (操作系统正式启动)

在这里插入图片描述
前三步是我们自己控制不了的
我的代码是从磁盘加载
在这里插入图片描述

启动流程(x86 BIOS 启动):

在这里插入图片描述
这个第0扇区的代码需要自己去写
首先Bios上电自检,然后将磁盘的第一个扇区512字节放入到内存地址0x7c00,检查是否以0x55 0xaa结束,从而判断这是否是有效的MBR
,如果是的话就进行引导

bios

  1. 加电启动(Power On)
  2. BIOS 执行 POST(Power-On Self-Test)
  3. 搜索可启动设备(硬盘、U盘、光盘…)
  4. 找到启动设备后:
    • 读取该设备的 第 1 个扇区(LBA 0,大小 = 512 字节)
    • 把它加载到内存地址 0x0000:0x7C00(实地址 = 0x7C00
  5. 检查最后两个字节是否为 0x55AA(有效的引导扇区签名)
  6. 如果正确 → 跳转到 0x7C00 执行

在 BIOS 启动模式中,BIOS 会将硬盘的 第 0 扇区(MBR)加载到 0x7C00,并从那里开始执行。

读取磁盘又两种方式
一种是int13(bios)
一种是LAB(复杂一点,在loader中实现)

x86在上电后自动进入实模式,1m内存 无分页机制 寄存器也只能用16位
但是1m内存的话要访问完需要20位地址,我们就是将段基址<<4+偏移构成20位
段基址的值是存在CS/DS/SS/ES/FS/GS(段寄存器)中
这个实模式下1M大小的内存映射情况:
在这里插入图片描述
我的boot是在start.s中写的
boot的初始化: 主要就是将段寄存器先赋初值0,简化代码,栈顶指针赋值0x7c00,表示我的boot在0x7c00地址以下的栈区,大概30kb左右是满足这个大小的
boot跳转到loader二级引导
在这里插入图片描述
在这里插入图片描述

读取多个磁盘加载到内存地址上:用了bios中断向量表 0x13 从第一个扇区开始 分配64个扇区(大概32kb) 如果读取磁盘正确后进入C环境并跳转到loader(jmp或者call)
在这里插入图片描述
.extern C函数名字(boot的一个跳转函数)

boot_loader

在这里插入图片描述

cmake的链接器表示我loader 加载到0x8000的地址,start.s放在cmake加入的工程文件的最开头,这样就可以保证加载到0x8000时在start.s
在这里插入图片描述

因为512字节显然比较小,没办法完成这么多功能,所以我做了一个二级引导
1.内联汇编显示字符串
2.检测内存容量 0x15(boot_info)
在这里插入图片描述
检测10块可用内存区域

3.切换进保护模式

实模式的限制

1.只能访问1MB内存,内核寄存器最大为16位宽
2.所有的操作数最大为16位宽
3.没有任何保护机制
4.没有特权级支持
5.没有分页机制和虚拟内存的支持

如何切换进保护模式

在这里插入图片描述

首先保证过程原子性,禁用中断,然后打开A20地址线让其访问1m以上的内存地址,然后初始化加载GDT表保证开启保护模式寄存器值正常,再设置CR0 PE位,开启保护模式。

这个禁用中断的函数我也写了一个函数,保存关中断前的各个寄存器的状态(eflags等),完成实模式到保护模式切换后恢复到原来的状态,这个函数再后面的也可以用到。函数中我也用到了内联汇编函数 sti cli进行开关中断.

加载kernel到内存地址1M

在loader中实现LAB读取磁盘,(一次两字节读取)(通常512字节一次性读取)

#define SYS_KERNEL_LOAD_ADDR		(1024*1024)		// 内核加载的起始地址(此时打开了A20地址线和保护模式,可以访问1M以上空间
static void read_disk(int sector, int sector_count, uint8_t * buf)
名称含义单位
sector起始扇区号(LBA)扇区(512 字节)
sector_count连续读取的扇区数量扇区(512 字节)

创建kernel文件夹,同样cmake设置起始位置1M
在这里插入图片描述
在这里插入图片描述
栈的作用:C的局部变量,函数调用中的参数
在保护模式下 push pop的一个栈都是4个字节
esp是栈顶指针 ebp相对比较固定。ESP 指向当前栈顶,EBP 保存的是上一个调用帧的基地址(上一个函数的栈底基准)

我在loader32.c中写了 ((void (*)(boot_info_t *))kernel_entry)(&boot_info); 然后进入kernel1M地址,

		push %ebpmov %esp, %ebpmov 0x8(%ebp), %eaxpush %eaxcall kernel_init

取出boot_info参数传给kernel_init函数void kernel_init (boot_info_t * boot_info)(函数指针) 我没用全局变量不依赖任何外部状态,bootloader 和 kernel解耦,可移植性强。

我再讲解下这个loader的这个函数指针:(为了跳到kernel_entry(裸地址0x100000)并传入参数boot_info

部分解释
void (*)(boot_info_t *)一个函数指针类型,指向接受一个 boot_info_t * 参数、返回 void 的函数
(void (*)(boot_info_t *))kernel_entrykernel_entry 强制转换为这种函数指针类型
((...))(&boot_info)把这个函数指针当成函数调用,传入参数 &boot_info

加载内核映像文件

在这里插入图片描述
改一下kernel.lds和loader32.c中跳转到kernel的函数指针的裸地址改一下0x100000 改为0x1000

elf

elf更小,并且可以进行权限设置
在这里插入图片描述
查看手册把elf_header和program_header的结构放在elf.h中

一些基础知识

链接脚本与代码数据段

先看一个具体的
在这里插入图片描述
有下面的一个顺序
在这里插入图片描述
为什么会这么放呢?
下面是一个测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当我们建立了kernel.lds就不用在每个文件夹下的cmake -text进行设置 告诉编译器这些分别放在哪
在这里插入图片描述

显示字符串

bios中断向量表中来显示

0x10

内联汇编来显示

也是用的bios中断进行显示的

http://www.dtcms.com/a/493709.html

相关文章:

  • 自己做的网站算广告吗太原seo按天计费
  • 网站建设语徐州招标网
  • 简述如何让网站排名快速提升开发公司资料员工作内容
  • 网络上做假网站做物流学校seo推广培训班
  • 本机快速做网站国外网页设计分享网站
  • 南京高端网站开发襄阳做网站比较有实力的公司
  • 制作网站设计的总结wordpress 开通json
  • 建立企业网站的目的和意义通过网站做跳板
  • 青田县住房和城乡规划建设局网站关键词快速优化排名软件
  • 微信网站模版wordpress去category
  • 网站流量指向北京环球影城客流量统计从哪里看
  • 网站开发用例图物联网网站设计
  • 2018做分享网站深圳龙岗住房和建设局网站官网
  • 360网站拦截做活字格能开发企业网站吗
  • 天津商业网站建设网页设计师工作职责
  • wordpress全站采集有哪些网站平台
  • 宁夏企业网站建设杭州安卓软件开发
  • 网上有专业的做网站吗wordpress 内容不显示图片
  • 做网站的前端技术如何写网站开发需求文档
  • 钱宝网站怎么做任务平面设计初中毕业能学吗
  • 网站整站下载器 下载后台设计类专业要艺考吗
  • 培训机构网站设计WordPress 错误记录
  • 深圳网站建设认准乐云践新微信小程序官网是正品吗
  • 旅游网站规划设计方案安丘网站建设制作
  • 在线设计logo免费网站怒江州建设局网站企业备案网站
  • 网站开发签呈如何写房屋租赁网站开发背景
  • 怎么在百度建网站网页版word编辑器
  • 象客企业网站做优化排名wordpress comments
  • 贵州建设工程招投标协会网站网站开发使用的工具
  • 微信做购物网站怎么抽佣湖北省发布最新通告