全书首先介绍了BIOS和UEFI两类固件的结构与启动流程;然后从UEFI的优点与BIOS的缺点作为切入,讲述UEFI取代BIOS的原因;最后通过若干个程序实例,逐步对现有系统进行改造,使其支持UEFI引导启动。" />

一个UEFI引导程序的实现

《一个64位操作系统的设计与实现》续
田宇 (作者)
本书是《一个64位操作系统的设计与实现》的补充内容,开发环境请参照《一个64位操作系统的设计与实现》相关章节:https://www.b453m.com/book/tupubarticle/26323(免费开放)搭建。
本书作为《一个64位操作系统的设计与实现》的补充内容,讲述了一个UEFI引导程序的实现过程。通俗的讲,读者们可以将UEFI理解为一种用于取代BIOS的新型固件程序。与BIOS固件程序相比,UEFI引导程序在性能、可扩展性、安全性和开发效率等诸多方面都得到了提升。

全书首先介绍了BIOS和UEFI两类固件的结构与启动流程;然后从UEFI的优点与BIOS的缺点作为切入,讲述UEFI取代BIOS的原因;最后通过若干个程序实例,逐步对现有系统进行改造,使其支持UEFI引导启动。
电子书
¥20.00
格式
mobi

出版信息

  • 书  名一个UEFI引导程序的实现
  • 执行编辑关于本书的内容有任何问题,请联系 杨帆
  • 出版日期2019-07-22
  • 书  号EA040
  • 印刷方式黑白
  • 开  本16开
  • 出版状态暂时缺货
  • 原书名一个UEFI引导程序的实现
  • 原书号EA040

所属分类

本书特色

自《一个64位操作系统的设计与实现》一书问世以来,我们已经收到广大操作系统爱好者的诸多反馈,有褒奖、有批判也有诚恳的意见。虽然《一个64位操作系统的设计与实现》一书已经向读者们展示了如何搭建一个操作系统的雏形框架,但是对于一个健壮的操作系统而言,他仅仅迈出了第一步。

本书作为《一个64位操作系统的设计与实现》的补充内容之一,将会继续对这个64位操作系统进行升级,并逐步引入更多新鲜功能和高级设备驱动程序。

目录

作者介绍

田宇:Linux内核爱好者,曾在多家大中型软件公司从事软件开发工作,参与过多款高端嵌入式产品的开发研制,主要负责Linux内核和驱动的研发,以及开源操作系统环境的深度定制。

大家也喜欢

  • 跟阿铭学Linux(第4版)

    李世明  

    本书是一本入门级的Linux学习教材,内容由浅入深,案例丰富,通俗易懂!书中分两部分:前面为基础知识,涉及安装...

  • Linux程序设计基础

    威廉·罗思韦尔   陈光欣   译

    本书是Linux入门书,旨在介绍在Linux操作系统上开发软件所需具备的知识。本书共分四部分,主要内容包括:开...

  • 一个64位操作系统的设计与实现

    田宇  

    本书讲述了一个64位多核操作系统的自制过程。此操作系统自制过程是先从虚拟平台构筑起一个基础框架,随后再将基础框...

  • 跟阿铭学Linux(第3版)

    李世明  

    本书是一本入门级的Linux学习教材,适合初学者阅读。本教程由浅入深,内容精湛,案例丰富,通俗易懂!书中分两部...

  • macOS软件安全与逆向分析

    丰生强   邢俊杰  

    本书深入介绍了macOS系统的软件安全、逆向分析与加密解密技术,主要包括macOS软件的开发基础、macOS系...

  • 下期预告,一个内核模块化功能的实现
    田宇  发表于 2019-07-22 15:06:24
    • 已购买此书,期待下期尽快出!

      VitalyR  发表于 2019-07-29 23:06:18
    • 请尽快实现,我好像看续集

      青藤木子  发表于 2019-09-15 15:02:18
    • 催更!

      青藤木子  发表于 2020-06-04 20:53:05
    • @青藤木子 感谢您的关注与期待,目前调整了出版计划,后续内容的发布还在策划中

      田宇  发表于 2020-06-13 22:17:23
    • 催更

      Cstyle  发表于 2021-02-19 14:59:48
    • @Cstyle 感谢您的关注与期待,由于出版计划调整,后续内容暂且不会以单篇发售。

      田宇  发表于 2021-02-24 15:20:12
    • @田宇 哦哦,难道是前作的大更新?

      __attribute__((cdecl))  发表于 2021-03-02 09:45:06
  • 要求提供PDF版本,mobi在电脑上真的不容易阅读(Mac电脑上也没有比较好的mobi阅读器)
    zysyyz  发表于 2019-08-09 01:41:53
    • 自己用软件转一下格式呢?

      田宇  发表于 2019-10-24 16:15:15
    • @田宇 自己转的排版会乱

      memcpy  发表于 2019-10-25 14:47:07
  • 第一章提到:“开机后,CPU首先跳转到物理地址0x0FFFF0处执行程序”。

    错!应该是0x0FFFFFFF0处执行程序。详情见Intel system developer manuals第三卷第九章Processor Management and Initialization。摘录如下:

    9.1.4 First Instruction Executed
    The first instruction that is fetched and executed following a hardware reset is located at physical address
    FFFFFFF0H. This address is 16 bytes below the processor’s uppermost physical address. The EPROM containing the
    software-initialization code must be located at this address.
    The address FFFFFFF0H is beyond the 1-MByte addressable range of the processor while in real-address mode. The
    processor is initialized to this starting address as follows. The CS register has two parts: the visible segment
    selector part and the hidden base address part. In real-address mode, the base address is normally formed by
    shifting the 16-bit segment selector value 4 bits to the left to produce a 20-bit base address. However, during a
    hardware reset, the segment selector in the CS register is loaded with F000H and the base address is loaded with
    FFFF0000H. The starting address is thus formed by adding the base address to the value in the EIP register (that
    is, FFFF0000 + FFF0H = FFFFFFF0H).
    The first time the CS register is loaded with a new value after a hardware reset, the processor will follow the normal
    rule for address translation in real-address mode (that is, [CS base address = CS segment selector * 16]). To
    insure that the base address in the CS register remains unchanged until the EPROM based software-initialization
    code is completed, the code must not contain a far jump or far call or allow an interrupt to occur (which would
    cause the CS selector value to be changed).
    hecto2  发表于 2019-07-30 15:43:04
    • 是的,根据9.1.4 First Instruction Executed的描述,CPU是从物理地址FFFFFFF0H处开始执行的,但是电脑在启动的时候A20地址线是关闭的,这就导致超过0x0FFFFF物理地址的访问都会回环到0~0x0FFFFF范围内,所以CPU才会从物理地址0x0FFFF0处执行程序。

      田宇  发表于 2019-07-30 21:21:45
    • @田宇 你理解错了,开机时不会回环,A20关闭不影响CPU在FFFFFFF0H处执行。不信你用VMWare调试一下第一条指令,地址就是FFFFFFF0H。固件必须将第一条指令挂载到FFFFFFF0H,不然也得不到执行。CPU reset时,CS和背后的基址是不一致的,基址并非CS左偏移4位,也就是说这时CPU执行地址不用CS << 4 + IP计算,更不用提A20了。当CPU执行到第一条long jmp之后,CS的值得到刷新,背后的基址部分置为CS左偏移4位,这是A20才起作用。

      hecto2  发表于 2019-07-31 11:02:29
    • @hecto2 我又调查了一下,在386以后的CPU是从物理地址FFFFFFF0H处开始执行的,但是芯片组好像会有比较复杂的映射,将物理地址0x0FFFFF处的BIOS跳转程序映射到FFFFFFF0H,这个错误我已经更正了,感觉您的关注。

      田宇  发表于 2019-07-31 22:01:45
    • @田宇 那如果只插入 2g memroy, 怎麼有辦法從 FFFFFFF0 執行?

      descent  发表于 2019-10-24 16:01:01
    • @descent 这个地址是固定的,与内存容量无关。

      田宇  发表于 2019-10-24 16:14:46
    • @田宇 真神奇。

      descent  发表于 2019-10-24 17:41:20
    • @田宇 现代处理器由A20M#控制a20而且第21根地址线默认是打开的。第一条指令就是在FFFFFFF0但它会映射到flash memory(BIOS)。

      关东鼠侠  发表于 2020-12-31 11:06:07
    • @关东鼠侠 是的

      田宇  发表于 2020-12-31 15:04:24
    • @田宇 这个地址不是内存地址,这个时候内存还未初始化,但也不是严格意义上的物理地址,这是一个特殊的地址
      计算:首先,这得是一个32位的cpu,所以为什么386以后从FFFFFFF0H执行,因为之前是8位和16位的cpu
      1 cpu 在执行第一条命令之前 会硬件初始化->自检->读取第一条指令
      2 这个时候cpu处于flat mode(这是一个非常特殊的实模式),拥有1m的寻址空间,16位程序指令地址空间为0x0000~0xFFFF
      3 第一条指令CS:IP F000H:FFF0H
      按照一般计算方式因该是FFFF0H,原因就是正常的翻译规则是 基地址*16+偏移地址
      但是这个时候cpu处于特殊的flat mode中,他的基地址是FFFF0000H,而并不是一般理解的F0000H.
      指令空间0x0000~0xFFFF通过段寄存器被映射到物理地址空间0xFFFF0000~0xFFFFFFFF了。

      Cstyle  发表于 2021-02-24 16:29:12
  • 感謝,終於出版了。
    descent  发表于 2019-07-22 16:30:22
    • 谢谢关注与支持

      田宇  发表于 2019-07-24 10:12:17
    • @田宇 雖然我已經寫出來 uefi os loader, 但我還是購買本書, 我的作法也和你不同, 不使用 edk2, 類似於 gnu efi 的作法。我實在不喜歡用 edk2 這個大怪物。

      descent  发表于 2019-10-24 15:59:16
    • @descent 学习EDK2可以更好的理解UEFI标准,总之适合自己的方法最好

      田宇  发表于 2019-10-24 16:17:50
  • 不是每周半价么。怎么是15/20?
    Wenyang  发表于 2019-07-24 01:49:46
    • 这是本新上市的电子书,15/20是上市的限时优惠活动

      田宇  发表于 2019-07-24 10:11:31
  • 买了,支持大佬!
    EXEC  发表于 2019-10-13 19:29:02
    • 感谢您的支持与关注,希望本书能帮助到您。

      田宇  发表于 2019-10-15 15:53:07
  • 希望出个pdf的,电脑很不方便
    小平同学  发表于 2019-11-10 13:18:45
    • 纯电子书没有PDF版的,抱歉

      田宇  发表于 2019-12-27 15:32:15
  • 希望有pdf
    CharleySlg  发表于 2019-11-11 01:14:12
    • 纯电子书没有PDF版的,抱歉

      田宇  发表于 2019-12-27 15:32:10
  • 迫切希望可以出PDF的电子版
    Qiao_Az  发表于 2019-12-27 15:30:49
    • 纯电子书没有PDF版的,抱歉

      田宇  发表于 2019-12-27 15:32:04
  • 啥时出PDF啊
    泊浮目  发表于 2020-02-17 21:08:41
    • 纯电子书没有PDF版的,抱歉

      田宇  发表于 2020-02-19 10:31:18
  • 3.2节,代码清单9,第一次调用获取GetMemoryMap得到MemoryMapSize之后,使用AllocatePool为MemoryMap分配空间时应该分配MemoryMapSize + 2 * DescriptorSize的空间保证安全. 因为最坏的情况是,AllocatePool之后,一块连续的未使用内存被分割为了两块,同时新增的已分配内存也会占用一个表项,这会导致MemoryMap增加两个表项,即两个Descriptor.
    Fishjump  发表于 2020-07-21 16:30:42
    • 感谢您的留言,这个问题是在代码清单17中作出解释的

      田宇  发表于 2020-07-22 17:46:25
  • 捉虫:表42中AllocatePages被误写为AllocatePasges
    Fishjump  发表于 2020-08-24 22:37:47
    • 感谢您的留言,已更正

      田宇  发表于 2020-08-25 13:45:29
  • 我晕,买了才发现居然没有 PDF 格式的???这是搞啥呢?
    puretears  发表于 2020-10-01 10:20:09
    • 感谢您的支持,纯电子书目前只提供mobi格式的,您可以选择自行转换为其他格式,或者网页在线阅读

      田宇  发表于 2020-10-01 15:52:16
  • 这是给真的愿意买正版书的人诚心找麻烦呢嘛?
    puretears  发表于 2020-10-01 10:20:48
    • 给您带来的麻烦,十分抱歉

      田宇  发表于 2020-10-01 15:52:44
  • 随书代码 /程序1-4/虚拟平台/BootLoader/BootLoader.c 中的156行缺了一个右括号,编译报错。我在加上右括号后运行正常了
    YoRHazzz  发表于 2021-04-17 15:48:39
    • 好的,收到,感谢您的关注

      田宇  发表于 2021-04-21 23:40:24
    • @田宇 老师,我想问一下为什么虚拟机上可以运行,物理机上运行报错。提示信息如下:do_general_protection(13),ERROR_CODE:0x00000000000001a4,RSP:0xffff800000207ef0,RIP:0xffff80000010b656
      Refers to a descriptor in the GDT or the current LDT;
      Refers to a segment or gate descriptor int the LDT;
      Segment Selector Index:0x000001a0
      objdump -D system看到这一行RIP是__switch_to:标签下的mov %rax, %fs

      YoRHazzz  发表于 2021-04-24 16:21:31
    • @田宇 我在do_fork函数中的thd=(struct thread_struct *)(tsk + 1);后加了一行memset(thd, 0, sizeof(*thd);似乎是将问题解决了

      YoRHazzz  发表于 2021-04-24 16:55:56
    • @YoRHazzz 有这种可能,因为这段代码是在《一个64位操作系统的设计与实现》的虚拟机环境下实现的代码,最新的虚拟机代码已经修改了这部分内容。
      https://gitee.com/MINEOS_admin/OS-Virtual-Platform
      另外,本书也有QQ讨论群,可以进来交流:144571173

      田宇  发表于 2021-04-25 09:38:41