从boot引导到loader引导完整运行

news2024/11/23 9:07:00

 此文针对该文章对loader引导进行了完善后的完整运行过程。(具体细节请参见下文)

boot引导升级,成功引导运行loader_What’smean的博客-CSDN博客boot引导升级,成功引导运行loaderhttps://blog.csdn.net/weixin_42492218/article/details/127751460?spm=1001.2014.3001.5501

loader.asm完整代码

(无注释):

注释详解请看:  完整的loader引导代码详解_What’smean的博客-CSDN博客

org	10000h
	jmp	Label_Start
 
%include	"fat12.inc"
 
BaseOfKernelFile	equ	0x00
OffsetOfKernelFile	equ	0x100000
 
BaseTmpOfKernelAddr	equ	0x00
OffsetTmpOfKernelFile	equ	0x7E00
 
MemoryStructBufferAddr	equ	0x7E00
 
[SECTION gdt]
 
LABEL_GDT:		dd	0,0
LABEL_DESC_CODE32:	dd	0x0000FFFF,0x00CF9A00
LABEL_DESC_DATA32:	dd	0x0000FFFF,0x00CF9200
 
GdtLen	equ	$ - LABEL_GDT
GdtPtr	dw	GdtLen - 1
	dd	LABEL_GDT
 
SelectorCode32	equ	LABEL_DESC_CODE32 - LABEL_GDT
SelectorData32	equ	LABEL_DESC_DATA32 - LABEL_GDT
 
[SECTION gdt64]
 
LABEL_GDT64:		dq	0x0000000000000000
LABEL_DESC_CODE64:	dq	0x0020980000000000
LABEL_DESC_DATA64:	dq	0x0000920000000000
 
GdtLen64	equ	$ - LABEL_GDT64
GdtPtr64	dw	GdtLen64 - 1
		dd	LABEL_GDT64
 
SelectorCode64	equ	LABEL_DESC_CODE64 - LABEL_GDT64
SelectorData64	equ	LABEL_DESC_DATA64 - LABEL_GDT64
 
[SECTION .s16]
[BITS 16]
 
Label_Start:
 
	mov	ax,	cs
	mov	ds,	ax
	mov	es,	ax
	mov	ax,	0x00
	mov	ss,	ax
	mov	sp,	0x7c00
 
;=======	display on screen : Start Loader......
 
	mov	ax,	1301h
	mov	bx,	000fh
	mov	dx,	0200h		;row 2
	mov	cx,	12
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	StartLoaderMessage
	int	10h
 
;=======	open address A20
	push	ax
	in	al,	92h
	or	al,	00000010b
	out	92h,	al
	pop	ax
 
	cli
 
	db	0x66
	lgdt	[GdtPtr]	
 
	mov	eax,	cr0
	or	eax,	1
	mov	cr0,	eax
 
	mov	ax,	SelectorData32
	mov	fs,	ax
	mov	eax,	cr0
	and	al,	11111110b
	mov	cr0,	eax
 
	sti
 
;=======	reset floppy
 
	xor	ah,	ah
	xor	dl,	dl
	int	13h
 
;=======	search kernel.bin
	mov	word	[SectorNo],	SectorNumOfRootDirStart
 
Lable_Search_In_Root_Dir_Begin:
 
	cmp	word	[RootDirSizeForLoop],	0
	jz	Label_No_LoaderBin
	dec	word	[RootDirSizeForLoop]	
	mov	ax,	00h
	mov	es,	ax
	mov	bx,	8000h
	mov	ax,	[SectorNo]
	mov	cl,	1
	call	Func_ReadOneSector
	mov	si,	KernelFileName
	mov	di,	8000h
	cld
	mov	dx,	10h
	
Label_Search_For_LoaderBin:
 
	cmp	dx,	0
	jz	Label_Goto_Next_Sector_In_Root_Dir
	dec	dx
	mov	cx,	11
 
Label_Cmp_FileName:
 
	cmp	cx,	0
	jz	Label_FileName_Found
	dec	cx
	lodsb	
	cmp	al,	byte	[es:di]
	jz	Label_Go_On
	jmp	Label_Different
 
Label_Go_On:
	
	inc	di
	jmp	Label_Cmp_FileName
 
Label_Different:
 
	and	di,	0FFE0h
	add	di,	20h
	mov	si,	KernelFileName
	jmp	Label_Search_For_LoaderBin
 
Label_Goto_Next_Sector_In_Root_Dir:
	
	add	word	[SectorNo],	1
	jmp	Lable_Search_In_Root_Dir_Begin
	
;=======	display on screen : ERROR:No KERNEL Found
 
Label_No_LoaderBin:
 
	mov	ax,	1301h
	mov	bx,	008Ch
	mov	dx,	0300h		;row 3
	mov	cx,	21
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	NoLoaderMessage
	int	10h
	jmp	$
 
;=======	found loader.bin name in root director struct
 
Label_FileName_Found:
	mov	ax,	RootDirSectors
	and	di,	0FFE0h
	add	di,	01Ah
	mov	cx,	word	[es:di]
	push	cx
	add	cx,	ax
	add	cx,	SectorBalance
	mov	eax,	BaseTmpOfKernelAddr	;BaseOfKernelFile
	mov	es,	eax
	mov	bx,	OffsetTmpOfKernelFile	;OffsetOfKernelFile
	mov	ax,	cx
 
Label_Go_On_Loading_File:
	push	ax
	push	bx
	mov	ah,	0Eh
	mov	al,	'.'
	mov	bl,	0Fh
	int	10h
	pop	bx
	pop	ax
 
	mov	cl,	1
	call	Func_ReadOneSector
	pop	ax
 
;;;;;;;;;;;;;;;;;;;;;;;	
	push	cx
	push	eax
	push	fs
	push	edi
	push	ds
	push	esi
 
	mov	cx,	200h
	mov	ax,	BaseOfKernelFile
	mov	fs,	ax
	mov	edi,	dword	[OffsetOfKernelFileCount]
 
	mov	ax,	BaseTmpOfKernelAddr
	mov	ds,	ax
	mov	esi,	OffsetTmpOfKernelFile
 
Label_Mov_Kernel:	;------------------
	
	mov	al,	byte	[ds:esi]
	mov	byte	[fs:edi],	al
 
	inc	esi
	inc	edi
 
	loop	Label_Mov_Kernel
 
	mov	eax,	0x1000
	mov	ds,	eax
 
	mov	dword	[OffsetOfKernelFileCount],	edi
 
	pop	esi
	pop	ds
	pop	edi
	pop	fs
	pop	eax
	pop	cx
;;;;;;;;;;;;;;;;;;;;;;;	
 
	call	Func_GetFATEntry
	cmp	ax,	0FFFh
	jz	Label_File_Loaded
	push	ax
	mov	dx,	RootDirSectors
	add	ax,	dx
	add	ax,	SectorBalance
 
	jmp	Label_Go_On_Loading_File
 
Label_File_Loaded:
		
	mov	ax, 0B800h
	mov	gs, ax
	mov	ah, 0Fh				; 0000: 黑底    1111: 白字
	mov	al, 'G'
	mov	[gs:((80 * 0 + 39) * 2)], ax	; 屏幕第 0 行, 第 39 列。
 
KillMotor:
	
	push	dx
	mov	dx,	03F2h
	mov	al,	0	
	out	dx,	al
	pop	dx
 
;=======	get memory address size type
 
	mov	ax,	1301h
	mov	bx,	000Fh
	mov	dx,	0400h		;row 4
	mov	cx,	24
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	StartGetMemStructMessage
	int	10h
 
	mov	ebx,	0
	mov	ax,	0x00
	mov	es,	ax
	mov	di,	MemoryStructBufferAddr	
 
Label_Get_Mem_Struct:
 
	mov	eax,	0x0E820
	mov	ecx,	20
	mov	edx,	0x534D4150
	int	15h
	jc	Label_Get_Mem_Fail
	add	di,	20
 
	cmp	ebx,	0
	jne	Label_Get_Mem_Struct
	jmp	Label_Get_Mem_OK
 
Label_Get_Mem_Fail:
 
	mov	ax,	1301h
	mov	bx,	008Ch
	mov	dx,	0500h		;row 5
	mov	cx,	23
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	GetMemStructErrMessage
	int	10h
	jmp	$
 
Label_Get_Mem_OK:
	
	mov	ax,	1301h
	mov	bx,	000Fh
	mov	dx,	0600h		;row 6
	mov	cx,	29
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	GetMemStructOKMessage
	int	10h	
 
;=======	get SVGA information
 
	mov	ax,	1301h
	mov	bx,	000Fh
	mov	dx,	0800h		;row 8
	mov	cx,	23
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	StartGetSVGAVBEInfoMessage
	int	10h
 
	mov	ax,	0x00
	mov	es,	ax
	mov	di,	0x8000
	mov	ax,	4F00h
 
	int	10h
 
	cmp	ax,	004Fh
 
	jz	.KO
	
;=======	Fail
 
	mov	ax,	1301h
	mov	bx,	008Ch
	mov	dx,	0900h		;row 9
	mov	cx,	23
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	GetSVGAVBEInfoErrMessage
	int	10h
 
	jmp	$
 
.KO:
 
	mov	ax,	1301h
	mov	bx,	000Fh
	mov	dx,	0A00h		;row 10
	mov	cx,	29
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	GetSVGAVBEInfoOKMessage
	int	10h
 
;=======	Get SVGA Mode Info
 
	mov	ax,	1301h
	mov	bx,	000Fh
	mov	dx,	0C00h		;row 12
	mov	cx,	24
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	StartGetSVGAModeInfoMessage
	int	10h
 
 
	mov	ax,	0x00
	mov	es,	ax
	mov	si,	0x800e
 
	mov	esi,	dword	[es:si]
	mov	edi,	0x8200
 
Label_SVGA_Mode_Info_Get:
 
	mov	cx,	word	[es:esi]
 
;=======	display SVGA mode information
 
	push	ax
	
	mov	ax,	00h
	mov	al,	ch
	call	Label_DispAL
 
	mov	ax,	00h
	mov	al,	cl	
	call	Label_DispAL
	
	pop	ax
 
;=======
	
	cmp	cx,	0FFFFh
	jz	Label_SVGA_Mode_Info_Finish
 
	mov	ax,	4F01h
	int	10h
 
	cmp	ax,	004Fh
 
	jnz	Label_SVGA_Mode_Info_FAIL	
 
	add	esi,	2
	add	edi,	0x100
 
	jmp	Label_SVGA_Mode_Info_Get
		
Label_SVGA_Mode_Info_FAIL:
 
	mov	ax,	1301h
	mov	bx,	008Ch
	mov	dx,	0D00h		;row 13
	mov	cx,	24
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	GetSVGAModeInfoErrMessage
	int	10h
 
Label_SET_SVGA_Mode_VESA_VBE_FAIL:
 
	jmp	$
 
Label_SVGA_Mode_Info_Finish:
 
	mov	ax,	1301h
	mov	bx,	000Fh
	mov	dx,	0E00h		;row 14
	mov	cx,	30
	push	ax
	mov	ax,	ds
	mov	es,	ax
	pop	ax
	mov	bp,	GetSVGAModeInfoOKMessage
	int	10h
 
;=======	set the SVGA mode(VESA VBE)
 
	mov	ax,	4F02h
	mov	bx,	4180h	;========================mode : 0x180 or 0x143
	int 	10h
 
	cmp	ax,	004Fh
	jnz	Label_SET_SVGA_Mode_VESA_VBE_FAIL
 
;=======	init IDT GDT goto protect mode 
 
	cli			;======close interrupt
 
	db	0x66
	lgdt	[GdtPtr]
 
;	db	0x66
;	lidt	[IDT_POINTER]
 
	mov	eax,	cr0
	or	eax,	1
	mov	cr0,	eax	
 
	jmp	dword SelectorCode32:GO_TO_TMP_Protect
 
[SECTION .s32]
[BITS 32]
 
GO_TO_TMP_Protect:
 
;=======	go to tmp long mode
 
	mov	ax,	0x10
	mov	ds,	ax
	mov	es,	ax
	mov	fs,	ax
	mov	ss,	ax
	mov	esp,	7E00h
 
	call	support_long_mode
	test	eax,	eax
 
	jz	no_support
 
;=======	init temporary page table 0x90000
 
	mov	dword	[0x90000],	0x91007
	mov	dword	[0x90800],	0x91007		
 
	mov	dword	[0x91000],	0x92007
 
	mov	dword	[0x92000],	0x000083
 
	mov	dword	[0x92008],	0x200083
 
	mov	dword	[0x92010],	0x400083
 
	mov	dword	[0x92018],	0x600083
 
	mov	dword	[0x92020],	0x800083
 
	mov	dword	[0x92028],	0xa00083
 
;=======	load GDTR
 
	db	0x66
	lgdt	[GdtPtr64]
	mov	ax,	0x10
	mov	ds,	ax
	mov	es,	ax
	mov	fs,	ax
	mov	gs,	ax
	mov	ss,	ax
 
	mov	esp,	7E00h
 
;=======	open PAE
 
	mov	eax,	cr4
	bts	eax,	5
	mov	cr4,	eax
 
;=======	load	cr3
 
	mov	eax,	0x90000
	mov	cr3,	eax
 
;=======	enable long-mode
 
	mov	ecx,	0C0000080h		;IA32_EFER
	rdmsr
 
	bts	eax,	8
	wrmsr
 
;=======	open PE and paging
 
	mov	eax,	cr0
	bts	eax,	0
	bts	eax,	31
	mov	cr0,	eax
 
	jmp	SelectorCode64:OffsetOfKernelFile
 
;=======	test support long mode or not
 
support_long_mode:
 
	mov	eax,	0x80000000
	cpuid
	cmp	eax,	0x80000001
	setnb	al	
	jb	support_long_mode_done
	mov	eax,	0x80000001
	cpuid
	bt	edx,	29
	setc	al
support_long_mode_done:
	
	movzx	eax,	al
	ret
 
;=======	no support
 
no_support:
	jmp	$
 
;=======	read one sector from floppy
 
[SECTION .s16lib]
[BITS 16]
 
Func_ReadOneSector:
	
	push	bp
	mov	bp,	sp
	sub	esp,	2
	mov	byte	[bp - 2],	cl
	push	bx
	mov	bl,	[BPB_SecPerTrk]
	div	bl
	inc	ah
	mov	cl,	ah
	mov	dh,	al
	shr	al,	1
	mov	ch,	al
	and	dh,	1
	pop	bx
	mov	dl,	[BS_DrvNum]
Label_Go_On_Reading:
	mov	ah,	2
	mov	al,	byte	[bp - 2]
	int	13h
	jc	Label_Go_On_Reading
	add	esp,	2
	pop	bp
	ret
 
;=======	get FAT Entry
 
Func_GetFATEntry:
 
	push	es
	push	bx
	push	ax
	mov	ax,	00
	mov	es,	ax
	pop	ax
	mov	byte	[Odd],	0
	mov	bx,	3
	mul	bx
	mov	bx,	2
	div	bx
	cmp	dx,	0
	jz	Label_Even
	mov	byte	[Odd],	1
 
Label_Even:
 
	xor	dx,	dx
	mov	bx,	[BPB_BytesPerSec]
	div	bx
	push	dx
	mov	bx,	8000h
	add	ax,	SectorNumOfFAT1Start
	mov	cl,	2
	call	Func_ReadOneSector
	
	pop	dx
	add	bx,	dx
	mov	ax,	[es:bx]
	cmp	byte	[Odd],	1
	jnz	Label_Even_2
	shr	ax,	4
 
Label_Even_2:
	and	ax,	0FFFh
	pop	bx
	pop	es
	ret
 
;=======	display num in al
 
Label_DispAL:
 
	push	ecx
	push	edx
	push	edi
	
	mov	edi,	[DisplayPosition]
	mov	ah,	0Fh
	mov	dl,	al
	shr	al,	4
	mov	ecx,	2
.begin:
 
	and	al,	0Fh
	cmp	al,	9
	ja	.1
	add	al,	'0'
	jmp	.2
.1:
 
	sub	al,	0Ah
	add	al,	'A'
.2:
 
	mov	[gs:edi],	ax
	add	edi,	2
	
	mov	al,	dl
	loop	.begin
 
	mov	[DisplayPosition],	edi
 
	pop	edi
	pop	edx
	pop	ecx
	
	ret
 
 
;=======	tmp IDT
 
IDT:
	times	0x50	dq	0
IDT_END:
 
IDT_POINTER:
		dw	IDT_END - IDT - 1
		dd	IDT
 
;=======	tmp variable
 
RootDirSizeForLoop	dw	RootDirSectors
SectorNo		dw	0
Odd			db	0
OffsetOfKernelFileCount	dd	OffsetOfKernelFile
 
DisplayPosition		dd	0
 
;=======	display messages
 
StartLoaderMessage:	db	"Start Loader"
NoLoaderMessage:	db	"ERROR:No KERNEL Found"
KernelFileName:		db	"KERNEL  BIN",0
StartGetMemStructMessage:	db	"Start Get Memory Struct."
GetMemStructErrMessage:	db	"Get Memory Struct ERROR"
GetMemStructOKMessage:	db	"Get Memory Struct SUCCESSFUL!"
 
StartGetSVGAVBEInfoMessage:	db	"Start Get SVGA VBE Info"
GetSVGAVBEInfoErrMessage:	db	"Get SVGA VBE Info ERROR"
GetSVGAVBEInfoOKMessage:	db	"Get SVGA VBE Info SUCCESSFUL!"
 
StartGetSVGAModeInfoMessage:	db	"Start Get SVGA Mode Info"
GetSVGAModeInfoErrMessage:	db	"Get SVGA Mode Info ERROR"
GetSVGAModeInfoOKMessage:	db	"Get SVGA Mode Info SUCCESSFUL!"

当boot.asm和loader.asm准备完成后,在将两文件进行编译生成.bin文件之前需要准备一个名为fat12.inc的文件,fatl2 inc文件是从Boot引导程序中提取出的FAT12文件系统结构。

编写fat12.inc

vim fat12.inc

fat12.inc文件内容:

RootDirSectors	equ	14
SectorNumOfRootDirStart	equ	19
SectorNumOfFAT1Start	equ	1
SectorBalance	equ	17	
 
	BS_OEMName	db	'MINEboot'
	BPB_BytesPerSec	dw	512
	BPB_SecPerClus	db	1
	BPB_RsvdSecCnt	dw	1
	BPB_NumFATs	db	2
	BPB_RootEntCnt	dw	224
	BPB_TotSec16	dw	2880
	BPB_Media	db	0xf0
	BPB_FATSz16	dw	9
	BPB_SecPerTrk	dw	18
	BPB_NumHeads	dw	2
	BPB_hiddSec	dd	0
	BPB_TotSec32	dd	0
	BS_DrvNum	db	0
	BS_Reserved1	db	0
	BS_BootSig	db	29h
	BS_VolID	dd	0
	BS_VolLab	db	'boot loader'
	BS_FileSysType	db	'FAT12   '

 将两文件进行编译生成.bin文件

nasm boot.asm -o boot.bin
nasm loader.asm -o loader.bin

创建镜像文件/软盘等相关内容

内容同:在Linux下安装配置bochs,并成功跑一个简单的boot引导(超详细)_What’smean的博客-CSDN博客
如图所示,建议与bochsrc在同一目录下

 

创建为软盘即fd,大小默认1.44M即可,命名为boot.img

之后为查看创建是否成功

 将生成的boot.bin写入img文件中


执行命令

dd if=boot.bin of=boot.img bs=512 count=1 conv=notrunc

这行命令中的if = boot.bin指定输入源文件名,而of=boot .img则指定输出文件名,参数bs=512指定传输的块大小为512B,参数count=1指定写入到目标文件的块数量,参数conv=notrunc规定在写入数据后不截断(改变)输出文件的尺寸大小。

dd if=boot.bin of=boot.img bs=512 count=1 conv=notrunc
 执行日志:

 将loader.asm写入boot.img镜像中

当loader.asm程序编译结束后,必须将生成的二进制程序loader.bin复制到虚拟软盘镜像文件boot.img中。此处的复制过程与boot.bin程序的写入过程采用了完全不同方法,当boot.bin程序写入到boot.img虚拟软盘镜像文件后,boot.img虚拟软盘已经拥有了FAT12文件系统,那么应该借助挂载命令mount和复制命令cp,把引导加载程序loader.bin复制到文件系统中。

整个复制过程需要执行以下命令:

mount boot.img /media/ -t vfat -o loop 挂载 目录 -t vfat 指定磁盘文件系统
cp loader.bin /media/ 复制到文件系统
sync //强制同步命令
umount /media/ //卸载目录

执行bochs

bochs -f ./bochsrc

一路回车然后输入  c  即可,下图为最终效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】11道LeetCode链表OJ练习

文章目录1. 移除链表元素2. 反转链表3. 链表的中间节点4. 链表中倒数第k个节点5. 合并两个有序链表6. 链表分割7. 链表的回文结构8. 相交链表9. 环形链表10. 环形链表II11. 复制带随机指针的链表补充内容:浅谈顺序表和链表的区别1. 移除链表元素 移除链表元素OJ链接…

扫雷游戏优化详解——c语言实现

文章目录 一、扫雷游戏的简单认识与解释 二、扫雷游戏的代码及思路实现 一、扫雷游戏的思路 1、菜单打印 2、创建扫雷区 3、初始化雷区 4、打印雷区 5、布置雷区 6、排雷 三、扫雷游戏代码的整合 game.h game.c test.c 标题:猜数字小游戏 作者:Ggggg…

你适合考PMP还是软考?两者的区别是否清楚,分别能给你带来什么价值

PMP与软考之间有什么区别,应该考哪个更适合自己? 下面从9个方面给大家简单的介绍做一个对比,希望能帮上忙~ 软考和PMP哪个更适合自己? 01 考试介绍 PMP:PMP是项目管理专业人士资格认证,由美国项目管理协…

腾讯云相同配置8核16G的云服务器和轻量服务器该如何选择?

很多个人或者中小企业用户在选择云服务器的时候,已经确认配置的情况下,去选购的时候发现有出现了轻量应用服务器,那么轻量应用服务器和云服务器又有哪些区别,价格为啥又有那么大的差别,该如何选择呢? 从上边…

SSM框架整合详细教程

目录 1. 什么是SSM? 2. SSM整合的时候容器之间如何访问 3. SSM下面的开发步骤 4. SSM整合时候时容易混乱的知识点 1. 什么是SSM? SSM是对三个框架名字的简写,其中第一个S指的是SpringMVC,第二个S指的是Spring,第三个M指的是M…

项目搭建(七)爱心代码❤网站部署(静态网站)

爱心代码❤网站部署(静态网站)一、环境基础二、修改Tomcat启动配置三、放置静态网站四、启动Tomcat一、环境基础 如果你已经部署了Apache-Tomcat,恭喜你,你已经完成90%的部署工作 如果没有tomcat,那你先部署tomcat吧 …

4_单机优化(确定性算法,优化框架)

优化框架机器学习的优化框架正则化经验风险最小化优化算法的收敛速率假设条件凸函数定义强凸函数定义光滑函数定义优化算法的分类机器学习的优化框架 正则化经验风险最小化 有监督的机器学习问题: 假设输入输出数据 Sn{(xi,yi);i1,...,n}S_n \left\{(x_i, y_i);…

C++与C语言中的字符串

目录 1、关于c语言中的字符串 (1)c语言中字符串与字符指针 (2)字符串结尾 2、关于c中的字符串string (1)从本质上了解string (2)c中的字符串转换与关联 (3&#x…

【MySQL入门指北】MySQL备份及恢复

MySQL备份及恢复 文章目录MySQL备份及恢复1.Percona 介绍2.安装Percona 需要的 MySQL 包3.安装percona-xtrabackup4.完全备份流程5.完全恢复流程6.增量备份流程7.差异备份8.差异恢复流程9.记录的导入和导出10.mysqldumpbinlog11.MySQL恢复数据12.二进制日志恢复13.误删除库的问…

基于51单片机的室内温度可燃气体检测报警系统Proteus仿真

资料编号:133 下面是相关功能视频演示: 133-基于51单片机的室内温度可燃气体检测报警系统Proteus仿真(源码仿真全套资料)功能介绍: 采用51单片机作为主控,LCD1602显示当前温度和可燃气体浓度,…

Netty源码阅读(1)之——客户端源码梗概

目录 准备 开始 NioSocketChannel 的初始化过程 指定 初始化 关于unsafe属性: 关于pipeline的初始化 小结 EventLoopGroup初始化 小结 channel的注册过程 handler的注册过程 客户端连接 总结 准备 源码阅读基于4.1.84.Final版本。从github下载netty项目…

WordPress设置浏览器切换标签网站动态标题

我们在逛别人网站的时候,经常看到,有些网站当我们离开该页面浏览其他页面的时候,离开的页面标题上会显示比如:“你别走吖 Σ(っ Д ;)っ”这样的字样,当我们点回来的时候页面上面的标题又变成了“你又回来啦&#xff0…

[附源码]计算机毕业设计JAVAjsp学生档案管理系统

[附源码]计算机毕业设计JAVAjsp学生档案管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM myb…

前端基础向--从项目入手封装公共组件

本文就从 “详情卡片” 业务组件的封装的几个阶段来说明我在编写公共组件的设计思路。 1. 阶段一:基础需求 假设我们现在有这样一个需求:需要满足显示产品的详细信息;需要可以根据不同分辨率适配不同的显示方式(2列,…

【Linux】进程通信 | 管道

今天让我们来认识如何使用管道来进行进程间通信 文章目录1.何为管道?1.1 管道是进程间通信的一种方式1.2 进程通信1.3 管道分类2.匿名管道2.0 康康源码2.1 创建2.2 父子通信完整代码2.3 等待写入等待读取等待源码中的体现2.4 控制多个子进程2.5 命令行 |3.命名管道3…

linux无界面手敲命令笔记

0 Ubuntu相关命令简介 1. 文件及目录操作命令 pwd:显示用户当前所处的目录 ls:列出目录下的文件清单 cd:改变当前目录cd … 返回上一级目cd / 进入根目录不加参数或参数为“~”,默认切换到用户主目录 mkdir:建立目录 …

Ant Design表单之labelCol 和wrapperCol的实际开发笔记

目录 前言 一、labelCol和wrapperCol是什么 二、布局的栅格化 1.布局的栅格化系统的工作原理 三、栅格常用的属性 1.左右偏移 2.区块间隔 3.栅格排序 四、labelCol和wrapperCol的实际使用 总结 前言 主要是记录一下栅格布局的一些属性和labelCol、wrapperCol等。 一…

[附源码]java毕业设计毕业设计管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

国产AI绘画软件“数画”刷爆朋友圈,网友到底在画什么

人们常说,眼见为实,只有自己亲眼见到的才会相信。但是我们都知道眼睛会产生错觉,而且人们在生活中被错觉误导的情况屡见不鲜。例如图中,你以为她们肯定是真人的照片。世界上有些事情,即使是自己亲眼所见到的也未必一定…

c/c++内存管理

前言: 开篇前就聊聊篮球,在众多球星中,我觉得杜兰特(KD)非常专注于篮球,他一直坚持他所热爱的事业。尽管有很多缺点,但是他对于篮球的态度是坚定不移,这是我非常钦佩的。当然库里&am…