自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

太初有道

滴水穿石

  • 博客(49)
  • 资源 (1)
  • 收藏
  • 关注

原创 UEFI 中的Gmac网卡驱动实现

UEFI 中的Gmac网卡驱动实现最近在龙芯平台完成了Gmac网卡驱动的迁移,目前已经在UEFI上跑起来了,经过大量的测试,gmac搭配Rtl或者intel的网卡进行pxe启动都是没有问题的。也算是完成了一个里程碑的事件,从此之后,龙芯平台7A桥片内集成的gmac 千兆网卡就能在BIOS使用了。下面将调试过程中遇到的坑,需要注意的地方做个总结。网卡驱动框架UEFI中的网络框架大致如下:根据上面的框架,其实主要实现的就是UNDI层的代码,主要就是一些关于网卡硬件操作的代码,以及提供给SNP层调用的接

2020-09-29 20:27:17 207 2

原创 UEFI中的Option ROM 驱动详解

最近在调试UEFI中 option rom 的支持,我们是和南京神易的合作伙伴一起,在他们的板卡上适配的。收货还是挺多的,下面就将收货做个总结吧,话不多少,直接上干货。PCI扫描过程中是如何确定PCI设备是否支持option rom的?在pci扫描设备的过程中,在函数PciSearchDevice中会调用函数GetOpRomInfo这个函数,函数调用关系如下:PciBusDriverBindingStart->PciEnumerator->PciRootBridgeEnumerator-&

2020-05-23 11:38:53 1029

原创 调试 intel 82580网卡在intel 8632 switch下扫不到的问题的收获

最近在调试intel 82580这款网卡在8632 switch下扫不到的问题。耗时了三个星期的时间,在这个过程中真的是学到了很多,所以还是决定将这些都记录下来吧。因为漫漫长河中,我们终将会将一些事遗忘。问题现象硬件环境: G1控制器(00:11:00) | 8632桥(03:00:00) ...

2019-12-06 20:23:23 205 2

原创 UEFI下如何在C语言嵌入汇编

UEFI下如何在C语言内嵌入汇编有两种方法:分别是以内嵌汇编的形式和直接就是汇编的形式存在,内嵌汇编不够灵活,而且代码的可读性和维护性都比较差,强烈推荐第二种方式。内嵌汇编的形式 __asm__ __volatile__( ".set_noa...

2019-12-06 20:21:25 308

原创 龙芯平台如何BIOS下如何读取pcie扩展配置空间

读取peie扩展配置空间中的信息硬件环境: G1控制器(00:11:00) | 8632桥(03:00:00) | ------------------------------------------------------------------------------------...

2019-12-06 20:15:31 452

原创 如何查看内核的调用栈

如何查看函数的调用栈也就是根据当前cpu内寄存器的值,如何反推函数的调用栈,这种调试方法在内核调试过程中是很常见的,也算是常用的技巧。这个在追查死机等问题,可以用的上。(1)通过ejtag来读取当前pc的地址以及sp,ra寄存器的信息首先,我们的机器起来以后,我们用ejtag调试工具查看一下当前的寄存器的内容如下:cpu0 -set#setzero:0x0 at:0x5400cce1 ...

2019-12-06 20:12:43 601

原创 反汇编及连接工具

######################################################################## this is a disassembly tool,convenient to debug## input Params:# $1: filename :*.dll that you want disassembly...

2019-08-16 14:25:54 350 3

原创 读书笔记之PCI Express体系结构导读

第一章 PCI总线的基本知识PCI总线概念PCI(Peripheral Componnent Interconnect)在处理器体系结构中属于局部总线,局部总线作为系统总线的延伸,其主要的功能就是连接外部设备。随着处理器主频的不断提升,就要求速度更快带宽更高的局部总线。起初PC采用8位的XT总线作为局部总线,后来很快升级到16位的ISA(Industry Stadnard Architectu...

2019-07-20 11:12:55 693

原创 32位和64位的那些事

32位和64位的那些事在我们日常使用和在编程中,常常涉及到32位机器64位机器以及32位操作系统和64位操作系统还有32位编译器和64位编译器等等相关的问题。这些问题经常让人迷糊,现在就这些问题,做一个简单的总结,希望对读者们有用。程序运行的平台个人理解(不知道对不对啊)程序运行的平台是由:处理器+OS(操作系统)+compiler(编译器来决定)三者组成的,下面将处理器简称位CPU,操作...

2019-07-20 11:10:46 220 1

原创 UEFI中的PCI设备扫描及分配Mem/Io空间过程

最近在调试解决PCI设备相关的问题,然后对UEFI下面的这部分实现有了初步的了解,为了防止后面慢慢的又忘记了,所以还是决定将最近的收获都记录起来,各位读者如果发现哪里记录或者总结的不对,欢迎留言指正。PciHostBridgeDxe这个驱动是为pci bus驱动执行做前期准备的驱动,在这个驱动里面主要是建立相应的软件结构来描述Host主桥,以及注册一些protocol是为pci bus 驱动使...

2019-07-03 19:04:28 2183

原创 uefi的几种文件格式(.fdf .dec .dsc .inf)

在uefi 中fdf文件和dsc文件以及dec文件还有inf文件是每一个做uefi的人最开始接触的文件,那么这些文件到底有什么作用?以及文件中每个字段的意义又是什么呢?现在就让我们一个文件一个文件的看吧!(本文的所有内容都来自于uefi de spec,如果想详细了解spec中的内容,请自己参阅spec,本文只是自己在阅读过程中将重点记录下来)首先看一下uefi中的几种名词解释:HIIH...

2019-05-09 11:27:08 2981

原创 UEFI中的S3实现

这段时间在龙芯平台上,调试S3的功能。目前已经基本完成,现将遇到的问题来做个总结,和简单的介绍一下S3的实现原理!下面我们就从ACPI规范说起。。计算机的状态在ACPI 里面定义了很多个power state , 如果从用户的角度看,计算机一定是处理下图中的一个状态:S0:实际上这就是我们平常的工作状态,所有设备全开,功耗一般会超过80WS1:也称作为POS(p...

2019-05-09 11:25:38 1669

原创 UEFI Relocation 原理

本文主要介绍的是UEFI Relocation的原理,以及主要的代码流程。首先:为什么要重定位?UEFI和传统的BIOS不一样,运行的特点也不一样,在编译阶段,每个模块都被编译成.efi的文件,然后将多个efi文件又生成Fv,最后又生成.fd文件,以这种方式存储在BIOS芯片中。在二进制的代码段中,每条指令的地址都是基于本模块的基址的一个偏移,然而每个模块真正运行的基地址,可能随着环境的不...

2019-05-09 11:25:21 1028

原创 uefi中Sec阶段和Pei阶段的启动分析

本文的启动分析是基于龙心3A2000+780E桥片的处理器的。首先:SEC(安全性)阶段:系统开始执行第一条指令,这时的Memory没有被初始化。主要工作是建立临时的Memory,它可以是处理器的Cache,或是systemStaticRAM(SRAM)。另外,SECPhase需要知道一些早期的内存被映射到的位置以及BFV(BootFirmwareVolume)的位置。P...

2019-05-09 11:24:22 3603

原创 Grub调试总结

最近在龙芯平台调研Grub的实现,在这过程中仔细研究了Grub的代码,就做个总结吧!首先Grub在uefi上也是以一个Grub.efi的方式运行的,但是这个efi是放在操作系统下面的boot/EFI/下面的,uefi在运行过程总后期加载Grub的时候会去这个目录load这个Grub模块。load到内存之后,就开始执行。这里面不做详细的介绍是如何load以及如何运行的,这部分内容都在uefi中有源...

2019-05-09 11:20:29 1651

原创 计算机系统启动过程分析

本文基于MIPS架构龙芯3号处理器为例,介绍启动过程。启动过程分析无论采用何种指令系统的处理器,复位后的第一条指令都会从一个预先定义好的特定地址去取指。处理器的执行就从这条指令开始。处理器的启动过程实际上就是一个特定程序的执行过程,这个程序被成为固件,也就是BIOS,现在主流的BIOS都是采用UEFI软件架构。龙芯也自己研制了在MIPS架构上的UEFI版本。龙芯3号处理器的上电执行的第一条指令...

2019-03-02 15:53:34 874 1

原创 读书笔记之计算机体系结构

知识要点此文章内容摘抄自计算机体系结构基础(胡伟武著),有些地方可能介绍的不是很详细,如果读者想仔细的了解,请自己阅读原著。第二章 指令系统无论是在什么架构上,都有自己的指令系统,如x86采用的是复杂指令集,而ARM/PowerPc等架构均采用的是精简指令集,这里面提到的指令集就是所谓的指令系统。因此不同平台上的要实现同样功能的指令可能会大部相同。指令是介于软件和硬件之间的桥梁,对于一个程序...

2019-03-02 14:11:47 562

原创 start_kernel()之setup_arch()函数详解

该函数主要是根据处理器硬件平台具体的机器型号来设置系统。解析Linux系统的命令行,设置0号jin cheng 的内存描述结构init_mm,系统内存管理初始化,统计并注册系统各种资源,以及其他杂项的初始化功能。注意这个函数在具体的硬件平台上是有所差别的,我们这里以ARM平台为例开始讲解。下面是代码:void __init setup_arch(char **cmdline_p){_...

2019-02-25 06:41:22 538

原创 UEFI下的FlashOperationProtocol的实现

UEFI下的FlashOperationProtocol的实现这个驱动其实就是读写flash所需要的最底层的驱动,其操作的就是最底层的flash的芯片,flash芯片有好多中,我们这里采用的是spi协议的。每种芯片的读写函数可能不太一样,但是都是大体相同的。下面是几种flash的介绍,大家知道自己的芯片使用的是哪种就好。几种flash芯片的介绍1、IIC EEPROM------容量小,采用...

2019-02-02 22:10:43 648

原创 UEFI下FirmwareVolumeBlockService驱动的实现

这个驱动是和variable的驱动一起使用的,是variable驱动的下一层,variable是要使用这个驱动中的read和write函数的,然后这个驱动去调用FlashOperationProtocolsDxe中的read和write函数。下面看一下这个驱动的具体实现:下面是驱动入口的函数EFI_STATUSEFIAPIFvbInitialize ( IN EFI_HANDLE...

2019-02-02 21:04:58 1126

原创 UEFI下Variable的实现

最近在龙芯平台在调试Nvrom的存储功能,设置开机的启动项,设置开机密码等功能.这部分功能在标准的uefi中都是使用Variable这套机制实现的.熟悉uefi的人都知道Variable这套机制在uefi中使用非常的广泛.现在我们来说说Variable是如何实现的.首先:Variable在uefi的公共源码上是有相应的代码的,代码位于目录MdeModulePkg/Universal/Var...

2019-02-01 16:20:14 3190

原创 UEFI sec阶段的实现

本文的实现是在MIPS平台龙芯架构实现的,在其他平台上实现方式可能不一样,但是大体上都是相同的。首先Sec阶段是UEFI最早的一个阶段,CPU上电后从固定地址取指开始执行。每种架构的CPU上电后第一条指令的地址是不同的,龙芯的CPU上电执行的第一条指令的32位地址是0x1fc00000,用cache的64位地址来访问就是0xffffffff9fc00000的地址。这里为什么上电后就能够使用ca...

2018-12-21 17:06:43 1892 6

原创 start_kernel()之page_address_init()函数

该函数初始化高端内存(High Memory)线性地址空间中永久映射相关的全局变量。所以在不支持高端内存即在没有配置CONFIG_HIGHMEM这个宏的时候,该函数是个空函数什么也不做,在ARM系统中,是没有高端内存相关的代码的,所以这个函数就是个空函数。在支持高端内存的体系结构中,page_address_init()函数初始化高端内存页表池的链表 struct list_head page...

2018-11-07 07:17:10 904

原创 start_kernel()之lock_kernel()详解

最近在看内核的源码,看着看着就想将所看到的内容写下来,这样即加深了对代码的理解,同时也为后续学习这方面知识的人做了一些铺垫。在网上讲解内核的书或者博客很多,所以也希望自己通过自己的理解和学习来写属于自己的文章。所以决定从每一个主要的函数开始,我知道这条路将会很长,内核源码那么多,这是一个长期的过程。希望自己能够坚持下来,争取能够写到内核源码的最终一个函数。本文所讲的内容是针对linux2.6....

2018-10-31 08:05:04 912

原创 UEFI的编译原理

整个UEFI的开发和编译是在x86的服务器下安装centeros的系统下进行的。所需要的工具:(1)UEFI源代码,以及添加了自己平台架构下的代码,UEFI的代码可以到UEFI官网下载(2)编译工具,我们采用的是交叉编译,编译工具是使用的是龙芯平台MIPS架构的编译工具(gcc-4.4.0-pmon)安装在系统的opt目录下(3)运行二进制文件的宿主机,这里是龙芯自己的机器3a30...

2018-09-20 19:32:38 3029

原创 读书笔记之ARM相关篇

ARM处理器启动过程ARM处理器的上电和复位操作过程类似,都是从处理器的低端复位向量地址0的位置读取第一条指令,由于ARM处理器的异常向量地址是连续排列的,所以异常中端入口指令一般都是存放的一条跳转指令。跳转到哪里呢?至少要跳转过异常中端向量区,然后按照程序流来执行。ARM处理器系统初始化过程每次系统上电复位启动时,处理器都处于一种最低性能的基本功能状态,此时,只能从复位向量地址去取指...

2018-09-16 17:32:56 205

原创 国内CPU的发展现状

众所周知芯片是我国信息产业发展的核心领域,自从中兴事件之后,国家领导人也更加的认识到了这一点。开始大力的支持发展我国自主的芯片研发工作,不想在受制于人。在整个芯片行业CPU则代表的芯片中的最核心技术,在CPU设计方面我国与发达国家相比还有显著的差距。虽然经过多年的努力,技术差距已经有了显著的缩小,在是在民用商业领域内,仍然没有看过国产CPU的身影。目前Intel+window的商业联盟,完全垄断了...

2018-08-19 22:07:48 14569 1

原创 ARM结构和MIPS结构的地址空间

无论在哪种体系结构中,地址空间的访问都是CPU运行的基本,CPU的每一条指令的地址,都必须在CPU所能访问的地址空间内,当然这个空间指的是虚拟地址空间。每个CPU所能访问多大的虚拟地址这是和CPU的位数有关的,32位地址总线,最大的虚拟地址就是2的32次方,64位同理。当然在实际的使用中,是不会出现这么大的地址范围的,我们都会根据设备的地址和内存的范围来配置一些窗口来给CPU访问,这就限制了CPU...

2018-08-18 19:02:21 3273 3

原创 ARM汇编指令总结

太初有道,何为道???这就是我心中追寻的道!!!从今天开始学习linux内核在ARM架构的实现,参考那本厚厚的书,希望在离开这里的时候,自己真的能够成长到自己崇拜的样子。大道之行,始于足下,万里长征,从这里开始。就从ARM的汇编指令开始吧。。。ARM汇编指令集:指令和伪指令:指令:是机器的助记符,经过汇编编译后变成二进制码,由CPU执行的。伪指令:用来指导指令的执行,不...

2018-08-03 22:28:12 1384

原创 计算机中常涉及到的名词解释和应用程序的执行原理

1:RISC和CISC的区别RISC:(Reduced Instruction Set Computer)精简指令集RISC的设计理念是由软件来完成具体任务,CPU本身只提供基本指令集,每条指令设计都比较简单,cpu完成每条指令的代价并不高。要完成复杂度较高的任务,就需要多条指令。因此CPU的设计和工艺变得简单起来,但是编译器设计的复杂性随之增加。RISC CPU的指令集中只有很少的指令,...

2018-07-21 19:28:29 833

原创 uefi中的Smbios实现

需要了解的Smbios知识:(1)什么是Smbios:Smbios在百度百科中是这样解释的:Smbios(system management bios)是主板或者系统制造厂商以标准格式显示产品信息所遵循的统一规范。Smbios规范标准定义了收集的电脑信息都包含哪方面的信息,對應手冊中其實就是包含很多c语言中的结构体,每一个结构体代表一种信息。在Smbios中都有。具体请看Smbios标准。每个主板...

2018-07-13 08:57:54 7829

原创 linux下文件字符的替换脚本

#! /bin/sh                                                                                                                                                                               func_loop(){   ...

2018-06-01 15:22:10 364

原创 调试uefi中Xhci总结

(1)几种USB控制器类型在UEFI中,usb相关的驱动有MdeModulePkg/Bus/Pci/XhciDxe/OhciDxe.infMdeModulePkg/Bus/Pci/UhciDxe/UhciDxe.infMdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf                                                   ...

2018-05-26 15:17:16 1822 4

原创 函数指针的一种用法

 1#include <stdlib.h>  2 #include <stdio.h>  3   4   5 typedef int(*sum)(int *a, int *b);   6 sum  fun_sum = NULL ;  7   8 int add(int *a, int *b)  9 { 10   int c = 0; 11   c = (*a) + (*b)...

2018-03-07 10:26:21 149

原创 GPT分区格式简介

GPT分区格式如下:(详细请看:https://en.wikipedia.org/wiki/GUID_Partition_Table)GPT的全称是Globally Unique Identifier Partition Table,意即GUID分区表,它的推出是和UEFI BIOS相辅相成的,鉴于MBR的磁盘容量和分区数量已经不能满足硬件发展的需求,GPT首要的任务就是突破了2.2T分区的限制,...

2018-03-07 10:25:16 5433

原创 MBR分区简介

MBR的整体机构如图所示:主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(0柱面,0磁头,1扇区)。在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“...

2018-03-06 17:58:18 5588

原创 ESP分区简介

ESP分区:(https://blog.uncooperative.org/blog/2014/02/06/the-efi-system-partition/)EFI系统分区,即 EFI system partition,简写为 ESP。ESP虽然 是一个 FAT16 或 FAT32 格式的物理分区,但是其分区标识是 EF (十六进制) 而非常规的 0E 或 0C。因此,该分区在 Windows ...

2018-03-06 16:16:40 3246

原创 UEFI知识积累

UEFI原理及编程知识点总结:第三章:*pkg:包含模块和和.dsc文件和.dec文件每个工程模块:原数据文件(.inf文件)和原文件(.efi文件组成)标准应用程序模块包含的部分:头文件(Uefi.h)和入口函数(默认的入口函数为UefiMain,可以在UefiMain.inf文件中指定)每个模块是如何被编译城.efi文件的:(1)编译器将源文件编译成.obj文件(2)链接器将.obj文件和其他...

2018-03-06 15:47:42 2324

原创 搜索关键字脚本

#!/bin/bash                                                                                                                                                                                    ## Usage:

2018-01-18 20:09:21 781

原创 EJTAG调试总计

loongson EJTAG调试命令

2017-11-29 17:21:41 1211

UEFI原理和编程

UEFI开发人员可参考,UEFI开发人员可以参考阅读,国内现在比较流行的代替原来的bios的软件。

2017-11-25

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除