在BIOS中嵌入应用程序的方法及实现

BIOS和EC 08年做MID时候的一个PPT. Agenda 硬件平台 BIOS介绍 功能 类型,种类 内部模块(AWARD为例) EC介绍 功能(IT8511E LPC EC为例) EC与BIOS关系 硬件平台 BIOS介绍 BIOS (Basic Input Output System)即基本输入/输出系统。 存放在一个不需要电源的记忆体(芯片)中,这就 阅读详情

介绍
本文针对Award公司开发的计算机系统BIOS提出了一种嵌入应用程序的方法,其基本原理
对别的品牌的BIOS也一样适用,仅需稍加修改。文中作者给出并讨论一个完整的例子程
序,该程序已经通过实验验证。
正文
一. BIOS简述
这里所讲的BIOS是指计算机主板上的BIOS,是整个计算机的关键和灵魂,计算机一启动
就是执行BIOS程序,它负责加电自检,初始化计算系统,响应用户对系统配置的修改,
记录数据到CMOS中,将常驻程序库(Runtime Program)常驻于内存中,提供给系统和应
用程序调用,经过一系列复杂操作后,最后将控制权转移给操作系统。
一开始BIOS容量仅有8K,随着计算机复杂程度的提高,以及即插即用、高级电源管理等
方面的需要,再加上个别主板厂商添加的辅助功能,BIOS容量迅速增大,目前通常主板
上BIOS容量为256Kb,有些已经达到512Kb,这些BIOS中常常还会有几十Kb的剩余空间,
而且由于BIOS多采用FlashRom作为存储芯片,便于修改,这就为我们在BIOS中嵌入自己
的程序提供了便利。
在BIOS中嵌入程序具有多方面的应用,有些主板厂商在BIOS中嵌入杀毒程序,硬盘恢复
精灵,超频工具等,提高了产品的竞争力;台湾威胜公司和Elegent公司联合开发出了嵌
入在BIOS中的小型浏览器操作系统,整个BIOS大小仅有512Kb,计算机无需硬盘即可上网
冲浪;有些监控系统由于功能简单,完全可以把程序做到BIOS中,一开机就自动运行,
既提高了可靠性,又降低了成本。另一方面,将病毒嵌入到BIOS中,一开机就常驻内存
也完全可以做到。
BIOS代码虽短,但技术含量相当高,全世界仅有AWARD、PHOENIX、AMI、ACER等几家公司
有研发BIOS系统的能力(AWARD 已被PHOENIX收购),其他主板厂商有的是直接购买,有
的也会在以上几家公司提供的平台上进行少量功能扩展。作为个别应用的场合,就要完
全靠自己对BIOS进行改造。
二. 嵌入程序的基础知识
在进行工作前需要几个必备的工具,一个是AWARD公司的BIOS刷新工具AwdFlash;另一个
Award BIOS 察看修改工具Cbrom;还有一个是MicroSoft 的汇编工具Masm6.11;最后是
作者推荐的二进制文本编辑器HexWorkshop,这些工具都可以从网上下载,下面假定读者
已经熟练使用这些工具,具体操作步骤不再祥述。
前面提到BIOS程序是存放在FlashROM芯片中的,实际上它是经过压缩后再存放进去的,
仅留下少量启动代码和解压缩程序保持原样,BIOS的执行过程其实相当复杂,好在我们
无需去了解其中的详细流程,但有一点应当清楚,BIOS程序实际上也是采用的模块化设
计思想,用Cbrom可以察看到BIOS中各个子模块的名称,性质,压缩率等信息,BIOS在执
行过程中会将这些模块解压缩到内存中,验证模块的合法性和正确性,如果满足条件,
就会转到模块的入口处执行。这里面的详细机制和由来需要参考PNPBIOS协议、PNPISA协
议、PCI总线协议和EISA总线协议,内容繁多,本文不拟做深入探讨。
BIOS中有一种模块是ISA模块,来源于ISA协议,由于ISA协议属于早期的协议,内容相对
简单,BIOS对ISA模块的验证也较为简单,容易满足,我们可以将自己的程序做成ISA模
块挂到BIOS中,这样机器一启动,我们的程序就会启动,而且我们程序的运行是先于操
作系统的。
三. 程序设计详细步骤
1. 设计准备
由于系统固有的限制,BIOS中每个模块的大小不能超过64Kb,这里是指没有压缩前的大
小,这和DOS下COM程序的限制很相似,实际上我们在用MASM6.11进行编程时的确采用是
COM程序的模板,由编译器生成COM文件。然而它又和一般的COM文件具有以下几点不同:

1. 首先它有自己的堆栈段,堆栈大小默认为1K,而COM文件的堆栈是在64K之内的,默认
是从段内偏移量0FFFEh处开始。
2. COM文件一开始就是执行代码,而模块一开始是模块头,储存有与模块相关的信息。
模块执行代码的入口点在模块中的某一处。
3. COM文件执行完后返回到操作系统,通常通过子功能号4ch的中断INT21h返回到DOS,
而模块是远程调用返回,也就是说必须用RETF返回。
4. ISA模块最后一个字节是校验码,所有的字节相加必须为0,BIOS利用这点来验证一个
ISA模块的正确性。COM文件没有这点要求。
5. COM文件执行时是先被完整地复制到段内偏移量100h处,然后再执行,而模块的段内
偏移量不能确定,有的模块会是0。所以涉及到段内偏移量的汇编指令,如LEA、OFFSET
要谨慎适用。
下表是ISA模块头的格式,其中仅列出了几个最基本的相关字段,这是协议中的内容,我
们在编写模块头时,需要严格遵循下表的格式:
偏 移    长 度    值    说  明
0h    1    55h    模块标签字节1
1h    1    AAh    模块标签字节2
2h    1    *    模块长度(以512字节为单位)
3h    3    *    入口点,BIOS对此位置做远调用,这里往往放一条跳转指令
6h~19h    20    *    保留
表一  模块头格式
通常一个BIOS嵌入程序设计的基本流程如下,每一步都很关键,有必要给出详细说明:

1. 首先用汇编编写DOS下的COM程序,必须注意到程序是先于操作系统执行的,所以程序
中不能调用任何DOS的中断服务。为了程序转化方便,也不要用.code,.startup等汇编
伪指令,尽量采用早期的汇编编写方式,争取对整个程序结构的完全控制。
2. 调试通过后,在COM文件前加上文件头,改变返回指令为RETF,控制文件大小为512字
节的整数倍,重新编译生成COM文件。
3. 在HexWorkshop中调入刚生成的COM文件,利用其中的checksum工具生成文件的校验码
,用100h减去该8位校验码后填入文件最后一个字节。再次生成文件的校验码,确认为零
。
4. 用Cbrom将文件作为ISA模块嵌入到BIOS中,在本文中的操作为 “Cbrom save.bin/i
sa hello.com”,其中save.bin是事先用AwdFlash备份的BIOS文件。注意反复操作时,
要先将前一个给释放掉,操作为“Cbrom save.bin/isa release”。
5. 用AwdFlash将新的BIOS文件烧录到FlashROM中。重起计算机,检验程序。
进行以上实验前,最好自备编程器,万一计算机不能正常启动,也可以重新恢复BIOS,
如果可以用本身具有双BIOS保护功能的计算机进行实验则更加保险。
下面设计两个简单的Hello程序,分别采用了两种不同的方式,两个程序都是在屏幕上显
示一行字“Hello!Press F1 to continue…”,当按下F1功能键后,程序退出,计算机
继续启动。
2. Hello程序一
下面给出的源代码是在上面流程2中的文件,所以已经添加了文件头,编译后生成的COM
文件是不能在DOS下执行的,请读者务必注意。另外由于程序功能简单,所以在这里文件
大小限制为512字节,对不同规模的程序,会有一些小小的变动。程序中所有的中断调用
都是BIOS中断服务调用,具体调用规则不做详细说明,请读者查阅有关资料。
;Hello源程序一
code segment
        assume cs:code,ds:code
start:
signature            db  55h,0aah
comlength        db  01h        ;文件长512字节
jmp         near ptr  begin0
reserved            db  20 dup(?)
begin0:
mov         di,25
mov         ah,2
mov         bh,0
mov         dx,di
mov         dh,10                ;将光标移至屏幕
int         10h                    ;10行25列处
mov         si,offset string
    ;在DOS下调试时应在这里添加    add        si,100h
showstr:
mov         ah,9
mov         al,[si]
and         al,0ffh
jz         kbinput
mov         bh,0
mov         bl,0DAh
mov         cx,1
int         10h
,
mov         ah,2
mov         bh,0
inc         di
mov         dx,di
mov         dh,10
int         10h
jmp         showstr            ;输出字符串
kbinput:
mov         ah,0
int         16h
cmp         ah,3bh            ;接受键盘输入
jne         kbinput            ;按F1往下执行
    mov     ax,0            ;返回参数
retf                        ;远程调用返回
string      db 'Hello! Press F1 to continue...',00h    ;00h标志字符串结束
    org        511                ;文件末尾
checksum        db    ?
code     ends
end         start
将上述程序烧入BIOS中运行时,在第一屏信息显示过后,会在第二屏正中央显示一条红
底白字的信息,提示按F1键继续,按F1键后,BIOS继续下面的启动步骤。显示第三屏启
动信息,即原先的第二屏信息,最后加载操作系统。
以上程序假定了BIOS会将模块解压至段首运行,事实也确是如此,但由于没查到相关资
料,目前还不能肯定总会如此。这一点将在下一个Hello程序中有所改进。
3. Hello程序二
Hello程序一在BIOS没有初始化完全的时候即进入运行,所以对程序功能有更多限制,有
些BIOS中断服务还不具备,任何对这些服务的调用都会产生意想不到的结果。考虑到BI
OS在加载操作系统时实际上是用的INT 19h,Hello程序二就利用挂钩19h中断的方法抢在
操作系统之前,BIOS初始化之后运行,这样就可以完整地利用整个计算机系统的所有资
源了。
另外必须指出的是,模块本身有责任保持整个模块的校验和为零,也就是说,ISA模块进
驻内存中后就不能卸出,BIOS会在模块返回后检查整个模块的检验和,判断模块的正确
性,如果错误,则会死机。模块在初始运行时可以更改自己段内的数据,而在BIOS初始
化完毕后,模块就不能再有改变自身数据的操作。
;Hello源程序二
.model tiny
.386
code segment
        assume cs:code,ds:code
start:
signature        db  55h,0aah
comlength    db  01h        ;文件长512字节
jmp near ptr  begin0
reserved        db  20 dup(?)
begin0:
call         getip            ;得到模块的起始段内偏移量
                        ;保存在参数ipstart中
mov         ax,0            ;挂钩19h中断
mov         es,ax        ;保存原来的入口到
mov         ax,es:[64h]    ;saveip与savecs
mov         saveip,ax
mov         ax,es:[66h]
mov         savecs,ax
mov         ax,offset begin1
add         ax,ipstart
mov         es:[64h],ax
mov         es:[66h],cs
mov         ax,0            ;重新计算校验码
mov         si,510        ;注意不要记入最后一个字节
again:     add ax,cs:[si]
dec         si
jns         again
neg         al            ;改变最后一个字节
mov         checksum,al    ;使整个模块校验和为零
mov ax,0
retf                    ;远程调用返回
begin1:                ;19h中断入口
sti                    ;开中断
pusha
push     es
push     ds            ;保存调用参数
mov         ax,cs
mov         ds,ax
mov         ax,0            ;恢复原19h中断入口
mov         es,ax
mov         ax,saveip
mov         es:[64h],ax
mov        ax,savecs
mov         es:[66h],ax
;以下基本与程序一相同
;这里为节约篇幅用……代替
;……
mov         si,offset string
add         si,ipstart        ;注意
;……
pop         ds
pop         es
popa
int         19h            ;激发19h中断
iret
getip     proc            ;得到模块的起始
pop         ax            ;段内偏移量子程序
push     ax
sub         ax,29        ;29=模块头大小加3
mov         ipstart,ax
ret
getip     endp
string  db 'Hello! Press F1 to continue...',00h
saveip dw ?
savecs dw ?
ipstart dw ?
org 511
checksum db ?
code ends
end start
Hello2程序在执行时,会在第二屏启动画面的最后一行显示一段黑底白字“Hello! Pre
ss F1 to continue...”,当按下F1后,计算机就开始加载操作系统。
需要注意的是,在DOS或Windows下调试Hello程序二时,是不能用19h中断的,任何对19
h中断的调用要么结束当前程序,要么会造成死机,所以调试时需要暂时用别的中断代替
,如保留中断2bh,当调试成功以后,再将中断改回为19h。
另一个在Hello1与Hello2程序中都要注意的问题是,在程序中不要轻易改动模块头的模
块长度字节的值,PCI模块支持并赞成这样的改动,而ISA模块没找到相关资料,笔者曾
尝试过改动这一值,结果导致Windows98不能进入通常模式。
四. 结束语
在编程实践中作者感到编写BIOS的嵌入程序具有相当难度,它需要有扎实的汇编语言功
底和对计算机硬件系统的深入了解,更需要在实践中不断地摸索BIOS程序的特点,只有
这样才能够编写出精悍的代码,满足实践应用的需要。 

实施入门-硬件基础.BIOS入门 计算机组件简介 CPU,Memory(存储器),I/O 输入/输出端口,BUS 系统总线,主板,机箱内部结构,操作系统 软件产品不同于一般的商品,用户购买软件产品之后,不能立即进行使用,需要软件公司的技术人员在技术、功能.操作等方面进行系统调试、人员培训、软件上线使用、后期维护等一系列的工作,我们将这一系列的工作称为软件项目实施。 阅读详情

相关推荐

BIOS入门篇---详解BIOS

BIOS全称basic input output system,即基本输入输出系统,它是PC主板上的固件,负责初始化硬件资源并引导启动OS,可以说BIOS就是为了启动OS而生。大白话“一个电脑的开机程序,就是从按下电源键到看到屏幕LOGO这段时间跑的程序”。

m0_73344394的博客 3024

适用于 VMware vSphere 的 NetApp Virtual Storage Console 实现对 VMware 基础架构的端到端存储管理

此外,VMware 管理员可以在卷级别、LUN 级别和聚合级别即时查看基于 NetApp SAN 和 NAS 的数据存储库的利用率统计信息,让他们能够在 VM 对象放置方面做出明智的决策。如果无法实时了解和管理存储运行状况、利用率和性能,服务器管理员必须定期与存储管理员进行协作,对 VMware 数据存储库进行设置、配置和优化。作为 VMware 软件定义的数据中心的一个关键要素,基于存储策略的管理 (SPBM) 可帮助 VM 管理员减少一些初始的存储配置难题。是否反映了 NetApp 最佳实践。

qq_43653083的博客 779

一种在BIOS中嵌入应用程序的方法及实现

本文针对Award公司开发的计算机系统BIOS提出了一种嵌入应用程序的方法,其基本原理对别的品牌的BIOS也一样适用,仅需稍加修改。文中作者给出并讨论一个完整的例子程序,该程序已经通过实验验证。  正文 一. BIOS简述 这里所讲的BIOS是指计算机主板上的BIOS,是整个计算机的关键和灵魂,计算机一启动就是执行BIOS程序,它负责加电自检,初始化计算系统,响应用户对系统配置的修改,记

技术联盟 2646

微型计算机原理mov,微机原理习题解答

期?第三章 指令系统3-1 指出下列指令的寻址方式。(1)MOV BX,2000H (2)MOV BX,[2000H](3)MOV [BP],CX (4)MOV AL,[BX+SI+100H](5)MOV DX,[BX+DI] (6)MOV AX,CX(7)POP AX (8)MUL BL(9)IN AL,80H (10)...

weixin_31281003的博客 4891

一文详细讲解CRM系统(附架构图、流程、功能介绍)

专为中小企业量身打造高性价比的数字化转型路径!企业如何用CRM才能真正做到降本增效?今天,就用一文讲清这些问题!读完本文,你将清楚得了解CRM的概念、框架、流程、功能、企业成功案例,文末还有常见问题解答。

Dabeishandong的博客 9925

一起学习Avalonia(十三)

Avalonia 前面已经简单介绍了一下相关开发,有一个系统的了解。 到今天Avalonia已经基本成熟,但是扩展支持的还是不可能达到大企业的,我估计这也不可能。考虑了下,微软的MAUI框架可能会普及性更高,Avalonia也是我无意间知道的。 微软毕竟是会宣讲的全球。并且微软全球研发投入很大,全部专职开发,这种速度当然大。但是MAUI根据计划,可能还要很长时间,而且是社区支持Linux,估计时间更久。这不能适应现在的国产化开发。 预计一段时间还是需要Avalonia作为优先。当前Avalonia使

jinyuttt的专栏 4086

SYS/BIOS 开发教程: 创建自定义平台

本示例基于 EVMC6678L 开发板, 介绍如何创建自定义平台, 并在工程中使用自定义平台.

falwat的专栏 1838

MacX DVD Ripper Pro for Mac(DVD解码器) 6.2.120190416免激活版

只需要5分钟即可转档一张DVD光碟!并允许我们在编码之前预览、编辑、裁剪、修剪或扩展视频。第一款也是唯一一款能够支持DVD到MP4,H.264,MOV,FLV,MPEG4等所有格式DVD(新DVD,99-标题DVD,损坏和无法播放的DVD)和翻录DVD / ISO映像的工具,AVI,QT,MP3等。借助350多种预设配置文件MacX DVD Ripper Pro for Mac(DVD解码器) 6...

llhf688的博客 890

CBROM使用完全指南(中,英说明)

 CBROM使用完全指南 这篇文章是转自网上的,原作者我也不知道,我就贴一处地址吧。“http://www.onegreen.net/Article_Show.asp?ArticleID=1656”倘若原作者您看到这篇文章的话,麻烦也给我说声,这样好把您的名字写上去。另外在网上也有英文版的使用说明这里也就应用一个http://geggus.net/sven/cbrom-doku.p

肢解BIOS 1万+

机器视觉:9点标定的原理与实现

标定就是将机器视觉处理得到的像素坐标转换成实际项目中使用到的毫米坐标。简单说即使看看实际单位距离内有几个像素,如下图所示,10mm的距离内有222个像素,那像素坐标和实际的毫米坐标就有个比例关系了。

m0_49968063的博客 1万+

电机控制的智慧之眼:全面解析FOC状态观测器

摘要:本文深入探讨磁场定向控制(FOC)中的状态观测器技术,重点分析其在无传感器电机控制中的关键作用。文章详细介绍了滑模观测器(SMO)、扩展卡尔曼滤波(EKF)、龙贝格观测器和高频注入法等主流观测器的工作原理、技术特点及适用场景,其中SMO因结构简单、鲁棒性强成为当前主流方案。同时阐述了观测器与锁相环(PLL)结合的工程实践方案,并针对不同应用场景提供了观测器选型建议。文章还探讨了启动问题处理、参数敏感性等工程挑战的解决方案,以及混合观测器、AI应用等未来发展趋势。这些观测器技术使电机系统在无机械传感器情

汽车软件开发 274

【转贴】一种在BIOS中嵌入应用程序的方法及实现

一种在BIOS中嵌入应用程序的方法及实现介绍本文针对Award公司开发的计算机系统BIOS提出了一种嵌入应用程序的方法,其基本原理对别的品牌的BIOS也一样适用,仅需稍加修改。文中作者给出并讨论一个完整的例子程序,该程序已经通过实验验证。 一. BIOS简述这里所讲的BIOS是指计算机主板上的BIOS,是整个计算机的关键和灵魂,计算机一启动就是执行BIOS程序,它负责加电自检,初始化计算系统,响应

FreeXploiT 2427

ADES1831和ADBMS6830

1、上电默认进入STANDBY模式,SPI发送0xFF也可以进入STANDBY模式2、看门狗定时器超时后,进入SLEEP状态3、配置寄存器中的REFON位使用WRCFGA命令将组A设置为1进入REFUP状态,此状态比待机状态更快地启动ADC转换。i<TOTAL_IC;i++)注意:读AFE数据时会随着AFE片数增加而增加,原因是唤醒时间和AFE片数密切相关,如果需要缩短时间,那么减少唤醒频次。

m0_61973119的博客 264

DSP实时嵌入系统DSP/BIOS学习入门

一、为何接触了DSP/BIOS? 为了得到某些DSP运行中的数据,在尝试了断点实时刷新、printf函数、保存在数组中等三种方式,由于我的系统属于高速时钟以及实时性要求较为严格,前两者直接pass,这两个操作非常费时间,实时性很差,后来了解到了DSP/BIOS这个神奇的方式,尽管最终由于时间的原因没有采取这种方式,但是还是觉得很好奇,就是进行了研究。 二、那点事 本人是机械工程专业,但是感兴趣的确...

weixin_43606771的博客 2123

华为OD机试双机位C卷-统计差异值大于相似值二元组个数(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【统计差异值大于相似值二元组个数】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 统计差异值大于相似值二元组个数

qq_45776114的博客 783

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SYS/BIOS知识整理汇总

本文主要整理BIOS相关组件的执行原理及使用,这里主要包括了硬件中断Hwi模块、软件中断Swi模块、时钟Clock模块、任务Tsk模块、信号量Sem模块。 1.SYS/BIOS概述 SYS/BIOS是一个可扩展的实时内核(或者说是操作系统),其提供了许多模块化的APIs(应用程序接口),支持抢占式多线程,硬件抽象,实时分析和配置工具,其设计目的是为了最大限度地减少对内...

boyemachao的专栏 6936

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

CMD文件中,nonBIOS和BIOS文件的区别

在 linker 脚本中的 `BIOS` 和 `nonBIOS` 文件主要用于区分启动时需要执行的 BIOS 引导代码和后续执行的非 BIOS 代码(如操作系统或应用程序代码)。在 DSP 或嵌入式系统的 linker 脚本文件(`.cmd` 文件)中,`nonBIOS` 和 `BIOS` 文件通常是用来区分不同类型的启动代码或系统映像文件。在 `.cmd` 文件中,`BIOS` 和 `nonBIOS` 区域通常是通过定义特定的内存区域来映射到不同的地址范围。

qq_18421935的博客 1365

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

什么是uboot与bios?

title: what is uboot and bios? date: 2022-03-17 17:24:27 tags: 前言preface ​ 最近在漏洞挖掘过程中,涉及到了一些基础的知识比如BIOS,uboot,qemu模拟的方面。 ​ 首先开始我们需要了解机器是怎么运行的 ​ 一般我们使用的机器都是windows或者Linux,(本人是高端MAC本🤣), 什么是BIOS?他有什么用,他做了什么?按下开机键的时候机器干了啥? ​ 问: ​ 计算机是最讲逻辑,他会按照他的规则去运行,但是我们不知道.

doudoudedi 4727

嵌入式系统UBOOT——BIOS、BootLoader、uboot对比(转)

bios BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。 BootLoader BootLoader是一段小程序,可以...

li7720681的博客 2843

BIOS + EC

BIOS + EC1参考 1 参考 1、BIOS与EC之间关系 2、BIOS和EC 3、蓝天DOS下刷BIOS、EC小教程(以775TM为例)

天道酬勤 5453

HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级

……

u013669912的博客 3077

PC中的BIOS和嵌入式设备中BootLoader的区别和联系

PC中的BIOS和嵌入式设备中BootLoader的区别和联系

phmatthaus的专栏 1932

详解BIOS

BIOS是计算机启动过程中的关键组件,负责初始化硬件并引导操作系统。虽然现代的计算机大多采用了更为先进的UEFI,但BIOS仍然在许多系统中广泛应用。它的设置界面允许用户配置各种硬件选项,而其核心任务是确保计算机能够正常启动和运行。

Weiki的博客 2507
下一篇: 部分未公开的Windows 2000核心功能调用
xbin8
博客等级 码龄20年 7粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值