【读书笔记】从实模式到保护模式

news2024/11/24 17:08:57

计算机语言 x86汇编语言:从实模式到保护模式(操作系统引导课) 原书作者李忠

用电表示数据

寄存器的作用:具有记忆功能的器件。锁存可以通过下面的开关控制,平时开关为空,按下开关之后,将输入锁存起来。锁存之后右面灯泡就就不会变化了,除非再次按下锁存开关。下面的开关是关着的,有间隙,是上下按的。

image-20230714005945617

image-20230714011357933

带有寄存器的加法机如何工作:每次输入/数字后存入寄存器,而不是多组线进行输入。

image-20230714011527299

再入加减乘除就是多了其他控制开关,

image-20230714011711790

image-20230714011759337

上面的加减乘除是每个开关,其他控制的地方也可以用一组01值来表示各类操作。

image-20230714011900628

内存

下面每个方块是一个内存单元,用右面地址线01值组合后来代表要查找的哪个内存单元。主流计算机里每个内存单元为8bit。

image-20230714012518396

内存上还有另外一排数据线,即内存的数据,8bit。读写通过控制线来表示。

image-20230714012554469

经过改进之后的计算机器,变为了下图。

指令指针寄存器,用来表示指令的地址,刚开始的时候是下一条要执行的地址。

image-20230714012733838

那么内存中的指令可以看为

image-20230714012911180

然后就可以一条一条自动取出计算了。

image-20230714012947359

处理器

CPU发展史:4004–8008(8位)–8086(16位)–80286–80386(i386)

16位代表有16位的寄存器和16位的算术逻辑部件。

image-20230714015154503

  • 指令集:可以执行的指令,在出产的时候就已经决定了。

image-20230714015453095

8086内部的通用寄存器

有8个通用的寄存器,分别是下面,他们都是16bit的,每个可以分为H/L

image-20230714015538891

1字=2字节。

image-20230714015634239

数据线的宽度和寄存器的宽度一致,是读取内存单元的。

image-20230714015725640

程序在内存中如何分段存放。

image-20230714015925389

image-20230714020015525

程序重定位困境

上图中,比如将程序挪到位置了,那么原来程序中的表示地址的内容将不再使用,解决方法是让表示地址从绝对地址变为相对于程序段开始的offset。

image-20230714020310756

IPR是地址寄存器,DSR是数据段寄存器。

8086有20根地址线,但是寄存器都是16位的,IP寄存器不够用,所以需要另外一个寄存器CS,所以我们一遍表示地址是CS:IP,CS是高位,所以是需要乘上10倍(实际上是16倍,2的4次方,4个偏移)与IP相加的。

image-20230714020540822

image-20230714020751060

上面所说的是8086的策略,

8086的段地址和偏移地址的访问过程就变成了:

image-20230714021025929

执行完1个指令后,IP就会变为03。CS代表是当前代码段的地址表示,IP代表段内的offset。

image-20230714021139933

因为IP是16位的,就代表段的最大大小为64k,即2的16次方,

image-20230714021304002

汇编语言基础指令

  • 大小写不敏感
  • 3FH和3fh是一样的,H代表是16位。63代表是十进制的,0011B代表是二进制的
 mov a,b  ; 将b的内存放到a中
 add a,b ; a=a+b

安装notepad,nasm,

https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/


NASM的作用是将mov等指令编译成二进制文件。

test.asm

mov bx,0x3f; 16进制,将立即数放到bx中,立即数代表的是内存地址里存放的内容
add ax,bx; 注释
;nasm test.asm -f bin -o test.bin ; -f输出文件的格式,只有二进制内容  -o 输出的文件名

image-20230714023516282

下面显示案例:每一行是16B

image-20230714023527254

如何将NASM编译二进制功能继承到notepad++:

视频用户注意:在刚开始录制配套视频时,尚未编写nasmide2.exe,所以视频中推荐使用Notepad++,现在已经不推荐使用。不排除某些读者朋友坚持使用这个软件,在这种情况下,您可以按如下方法进行配置,配置后将可以提供自动编译过程:

        1,启动NotePad++,在菜单上选择“运行(R)”->“运行(R)”。

        2,在弹出的窗口内,输入:cmd /k pushd "$(CURRENT_DIRECTORY)" & D:\ACERFILES\OLDE\PROGFILES\NASM\nasm.exe -f bin  "$(FULL_CURRENT_PATH)" -o "$(NAME_PART).bin" & PAUSE & EXIT。其中,“D:\ACERFILES\OLDE\PROGFILES\NASM\”应该改成你自己机器上实际的NASM安装路径。
        
cmd /k pushd "$(CURRENT_DIRECTORY)" & E:\NASM\nasm.exe -f bin  "$(FULL_CURRENT_PATH)" -o "$(NAME_PART).bin" & PAUSE & EXIT

        3,点击“保存”,然后为这个运行命令起一个名字并分配一个快捷键,这样你下次就可以直接快速执行编译过程。

计算机启动,8086寄存器的状态

计算机启动后,寄存器被强制变为下面的图

image-20230714024336968

可以看到CS:IP=FFFF:0000=FFFF0,可以看到距离最上面只有16B,这个是bios,所以还要继续跳转。

8086的地址范围:

image-20230714024535785

从上到下

  • 内存
    • DRAM动态随机访问存储器
  • 外接设备
    • 显卡:用来转换成视频信号给显示器
  • ROM BIOS,read only memory,只读的,厂家烧制好的程序

image-20230714024904674

image-20230714024931665

但是FFFF0是怎么调到别的地方呢,是使用JMP命令

image-20230714025055912

也就是又调到了0xF000:E05B

image-20230714025142232

硬盘

  • USE
  • HDD:有机器转盘
  • SSD:集成电路硬盘

image-20230714025250593

image-20230714025301558

可能会有多个盘

image-20230714025320780

每一个圆圈是一个磁道

image-20230714025358843

磁道还可以分为扇区,每个扇区大小相等,扇区从1开始编号,其他内容是从0开始编号

image-20230714025523138

image-20230714025410246

编号从柱面外面开始,先将一个柱面填满后再一定到另一个柱面。

主引导扇区

主引导扇区代表是0柱面,0磁道,第一个扇区就是主引导扇区。

image-20230714025612606

如果是从硬盘启动,那么就会跳转到07c00处开始,读取硬盘主引导扇区的内容加载到07c00处,然后调到这里接着执行。JMP 07c00也是bios执行的最后一条指令。

image-20230714025815227

虚拟硬盘

每个厂商的虚拟硬盘格式不同,

image-20230714025947588

工具包有个LIZHONG.vhd,他也是一个文件,规范里写明了vhd的内容应该这么组织才算是一个正确的vhd:

  • 文件末尾必须是。。。
  • 512字节
  • 55aa

debug功能,可以使用bochs虚拟机

image-20230714031328738

bochs是一台虚拟机,对应的配置都是通过配置文件来配置的,

如何创建固定尺寸的VHD虚拟硬盘,放到bochs上,可以去virtualBox中利用一下,选择固定大小,20M就够

image-20230714031500695

image-20230714032110182

image-20230714032141394

双击

然后找到这个地方填充,还需要填充磁道之类的,这个信息需要使用工具生成,

image-20230714033047269

image-20230714033254672

image-20230714033327443

填充磁盘内容

mov ax,0x30;
moc dx,0xc0
add ax,bx
times 502 db 0; 502+2+
db 0x55
db 0xAA

image-20230714034420391

image-20230714034751207

LBA,

image-20230714034714492

image-20230714034805475

image-20230714034823770

image-20230714034838040

image-20230714211340870

00000000000i[PLUGIN] reset of 'serial' plugin device by virtual method
00000000000i[PLUGIN] reset of 'gameport' plugin device by virtual method
00000000000i[PLUGIN] reset of 'iodebug' plugin device by virtual method
00000000000i[PLUGIN] reset of 'usb_uhci' plugin device by virtual method
00000000000i[      ] set SIGINT handler to bx_debug_ctrlc_handler
Next at t=0
#  要跳转了
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0 
<bochs:1> sreg   ;;;;;;;;;
es:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
        Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
cs:0xf000, dh=0xff0093ff, dl=0x0000ffff, valid=7
        Data segment, base=0xffff0000, limit=0x0000ffff, Read/Write, Accessed
ss:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
        Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ds:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
        Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
fs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
        Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
gs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
        Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ldtr:0x0000, dh=0x00008200, dl=0x0000ffff, valid=1
tr:0x0000, dh=0x00008b00, dl=0x0000ffff, valid=1
gdtr:base=0x0000000000000000, limit=0xffff
idtr:base=0x0000000000000000, limit=0xffff
<bochs:2> r
rax: 00000000_00000000
rbx: 00000000_00000000
rcx: 00000000_00000000
rdx: 00000000_00000000
rsp: 00000000_00000000
rbp: 00000000_00000000
rsi: 00000000_00000000
rdi: 00000000_00000000
r8 : 00000000_00000000
r9 : 00000000_00000000
r10: 00000000_00000000
r11: 00000000_00000000
r12: 00000000_00000000
r13: 00000000_00000000
r14: 00000000_00000000
r15: 00000000_00000000
rip: 00000000_0000fff0
eflags 0x00000002: id vip vif ac vm rf nt IOPL=0 of df if tf sf zf af pf cf

; 单步执行为s   b为打断点   c为继续执行到下一断点

每个位数的处理器上表示通用寄存器的方式不同

image-20230714213049519

image-20230714213137555

image-20230714213153743

image-20230714213228013

00000000000i[PLUGIN] reset of 'gameport' plugin device by virtual method
00000000000i[PLUGIN] reset of 'iodebug' plugin device by virtual method
00000000000i[PLUGIN] reset of 'usb_uhci' plugin device by virtual method
00000000000i[      ] set SIGINT handler to bx_debug_ctrlc_handler
Next at t=0
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
<bochs:3> s
Next at t=1
(0) [0x0000000fe05b] f000:e05b (unk. ctxt): xor ax, ax                ; 31c0
<bochs:4> s
Next at t=2
(0) [0x0000000fe05d] f000:e05d (unk. ctxt): out 0x0d, al              ; e60d
<bochs:5> b 0x7c00
# 
<bochs:6> c
....
00001771813i[BIOS  ] ata0-0: PCHS=301/4/17 translation=none LCHS=301/4/17
00005205777i[BIOS  ] IDE time out
00017178813i[BIOS  ] Booting from 0000:7c00
(0) Breakpoint 1, 0x0000000000007c00 in ?? ()
Next at t=17178868
(0) [0x000000007c00] 0000:7c00 (unk. ctxt): mov ax, 0x0030            ; b83000

选择CD-ROM继续,

image-20230715123111369

Next at t=17178868
(0) [0x000000007c00] 0000:7c00 (unk. ctxt): mov ax, 0x0030            ; b83000
<bochs:7> r
rax: 00000000_0000aa55 ; 执行吓一跳指令后变为0030
rbx: 00000000_00000000
rcx: 00000000_00090000
rdx: 00000000_00000080
rsp: 00000000_0000ffd6
rbp: 00000000_00000000
rsi: 00000000_000e0000
rdi: 00000000_0000ffac
r8 : 00000000_00000000
r9 : 00000000_00000000
r10: 00000000_00000000
r11: 00000000_00000000
r12: 00000000_00000000
r13: 00000000_00000000
r14: 00000000_00000000
r15: 00000000_00000000
rip: 00000000_00007c00
eflags 0x00000082: id vip vif ac vm rf nt IOPL=0 of df if tf SF zf af pf cf

(0) [0x000000007c03] 0000:7c03 (unk. ctxt): mov dx, 0x00c0            ; bac000
<bochs:9> r
rax: 00000000_00000030
rbx: 00000000_00000000
。。。

<bochs:12> s
Next at t=17178870
(0) [0x000000007c06] 0000:7c06 (unk. ctxt): add ax, bx                ; 01d8
<bochs:13> s
Next at t=17178871
(0) [0x000000007c08] 0000:7c08 (unk. ctxt): add byte ptr ds:[bx+si], al ; 0000

显卡和显存

为了显示文件,需要显卡,

把显存映射到计算机可以访问的地址空间内,B8000-BFFF可以映射。

MOV ax, 0xb800

image-20230715152744302

mov语法

mov 目的操作数/寄存器/内存地址, 源操作数/寄存器/立即数

mov 段寄存器, 通用寄存器
mov 段寄存, [内存地址] ; 合法
mov ds,0xb800;不合法,不支持立即数直接传送到段寄存器

mov [0x00],al ; 按字节操作
mov ax, [0x02]; 按字操作,将0x02里存储的一个字放到ax寄存器中
moc ax, 0x02
mov byte [0x02], 0xe9
mov word [0x06], 0x3c
mov 0x07,al;错误的
mov [0x01],[0x02];错误的,不支持,其他操作也不支持这种类似的操作

mov ip,0x01;指令存储寄存器不能直接访问,不可以出现在任何指令中

mov ds,ax
mov es,[0x01]
  • 可以使用start标识离那条最近指令的地址
start:
  mov ax,0x41
  ....
  ; 在debug时,不应该执行下面的无效指令,所以后面教程会改成jmp到别的地方运行 ;
  ; jmp 
  current:
  times 510-(current-start) db 0
  db 0x55,0xaa
AS         ;代码清单6-1 
         ;文件名:c06_mbr.asm ; nasm test.asm -l test.lst
         ;文件说明:硬盘主引导扇区代码
         ;创建日期:2011-3-31 21:15,修订于2021-09-06 23:05 
         
         mov ax,0xb800                 ;指向文本模式的显示缓冲区
         mov es,ax

         ;以下显示字符串"Label offset:"
         mov byte [es:0x00],'L'
         mov byte [es:0x01],0x07
         mov byte [es:0x02],'a'
         mov byte [es:0x03],0x07
         mov byte [es:0x04],'b'
         mov byte [es:0x05],0x07
         mov byte [es:0x06],'e'
         mov byte [es:0x07],0x07
         mov byte [es:0x08],'l'
         mov byte [es:0x09],0x07
         mov byte [es:0x0a],' '
         mov byte [es:0x0b],0x07
         mov byte [es:0x0c],"o"
         mov byte [es:0x0d],0x07
         mov byte [es:0x0e],'f'
         mov byte [es:0x0f],0x07
         mov byte [es:0x10],'f'
         mov byte [es:0x11],0x07
         mov byte [es:0x12],'s'
         mov byte [es:0x13],0x07
         mov byte [es:0x14],'e'
         mov byte [es:0x15],0x07
         mov byte [es:0x16],'t'
         mov byte [es:0x17],0x07
         mov byte [es:0x18],':'
         mov byte [es:0x19],0x07

         mov ax,number                 ;取得标号number的偏移地址
         mov bx,10

         ;设置数据段的基地址
         mov cx,cs
         mov ds,cx

         ;求个位上的数字
         mov dx,0
         div bx
         mov [0x7c00+number+0x00],dl   ;保存个位上的数字

         ;求十位上的数字
         xor dx,dx
         div bx
         mov [0x7c00+number+0x01],dl   ;保存十位上的数字

         ;求百位上的数字
         xor dx,dx
         div bx
         mov [0x7c00+number+0x02],dl   ;保存百位上的数字

         ;求千位上的数字
         xor dx,dx
         div bx
         mov [0x7c00+number+0x03],dl   ;保存千位上的数字

         ;求万位上的数字 
         xor dx,dx
         div bx
         mov [0x7c00+number+0x04],dl   ;保存万位上的数字

         ;以下用十进制显示标号的偏移地址
         mov al,[0x7c00+number+0x04]
         add al,0x30
         mov [es:0x1a],al
         mov byte [es:0x1b],0x04
         
         mov al,[0x7c00+number+0x03]
         add al,0x30
         mov [es:0x1c],al
         mov byte [es:0x1d],0x04
         
         mov al,[0x7c00+number+0x02]
         add al,0x30
         mov [es:0x1e],al
         mov byte [es:0x1f],0x04

         mov al,[0x7c00+number+0x01]
         add al,0x30
         mov [es:0x20],al
         mov byte [es:0x21],0x04

         mov al,[0x7c00+number+0x00]
         add al,0x30
         mov [es:0x22],al
         mov byte [es:0x23],0x04
         
         mov byte [es:0x24],'D'
         mov byte [es:0x25],0x07
          
   infi: jmp near infi                 ;无限循环
      
  number db 0,0,0,0,0
  
  times 203 db 0 ;
  db 0x55,0xaa
视频用户注意:在刚开始录制配套视频时,尚未编写nasmide2.exe,所以视频中推荐使用Notepad++,现在已经不推荐使用。不排除某些读者朋友坚持使用这个软件,在这种情况下,您可以按如下方法进行配置,配置后将可以提供自动编译过程:

        1,启动NotePad++,在菜单上选择“运行(R)”->“运行(R)”。

        2,在弹出的窗口内,输入:cmd /k pushd "$(CURRENT_DIRECTORY)" & D:\ACERFILES\OLDE\PROGFILES\NASM\nasm.exe -f bin  "$(FULL_CURRENT_PATH)" -o "$(NAME_PART).bin" & PAUSE & EXIT。其中,“D:\ACERFILES\OLDE\PROGFILES\NASM\”应该改成你自己机器上实际的NASM安装路径。
        
cmd /k pushd "$(CURRENT_DIRECTORY)" & F:\LEEZHONG\NASM\nasm.exe -f bin  "$(FULL_CURRENT_PATH)" -o "$(NAME_PART).lst" & PAUSE & EXIT

        3,点击“保存”,然后为这个运行命令起一个名字并分配一个快捷键,这样你下次就可以直接快速执行编译过程。
cmd /k pushd "$(CURRENT_DIRECTORY)" & F:\LEEZHONG\NASM\nasm.exe -f bin  "$(FULL_CURRENT_PATH)" -o "$(NAME_PART).bin" -l "$(NAME_PART).lst" & PAUSE & EXIT

上述命令不用配置了,直接打开这个文件后点击编译文件,就在该目录里得到bin和lst了。

image-20230715160931783

xp /512xb 0x7c00
b 0x7c00
u/32

把显存映射到计算机可以访问的地址空间内,B8000-BFFF可以映射。

MOV ax, 0xb800
mov ds,ax

在virtualBox中移除原来的存储disk,挂载我们自己创建的。

image-20230715180057975

div语法

简言之就是为了存储商和余数,有时候需要使用2个寄存器进行操作。

add语法

image-20230716163059176

image-20230716163116357

显示数字

image-20230716163158341

image-20230716164517400

image-20230716164557506

附加段寄存器ES

段超越前缀

段超越前缀用来改变默认段寻址,通常内址寻址是数据段或者堆栈段,但你可以在指令前面加上段超越前缀,就可以访问到其它段内的数据。

8086/8088指令系统中的段地址有四个:

ES Extra segment 附加段寄存器

DS Data segment 数据段寄存器

CS Code segment 代码段寄存器

SS Stack segment 堆栈段寄存器

我们通常用到的寄存器间接寻址方式会用到下边几个

DI, SI, BX, BP

其中前三个对应的段默认位DS,就是数据段寄存器

而最后一个BP默认对应的是SS, 就是堆栈段寄存器

  • 有效地址EA存放在BX、SI、DI或BP中,EA为BX、SI、DI时,默认是DS,BP默认是SS,可以使用段超越前缀改变。

所以当我们要用到代码段寄存器或者附加段寄存器的时候就会用到段超越前缀

例如:

mov ax, [si] = mov ax, ds:[si]

mov ax, [bp] = mov ax, ss:[bp]

而段超越的则必须在前边加上段地址:

mov ax, cs:[si]

; 如果不加 [es:0x00],则段地址默认是在ds中,使用了段超越前缀后,段地址是在指定的段寄存器里

image-20230716203044671

虚拟机挂载的硬盘变为我们的硬盘。

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

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

相关文章

PLEX如何搭建个人局域网的视频网站

Plex是一款功能非常强大的影音媒体管理系统&#xff0c;最大的优势是多平台支持和界面优美&#xff0c;几乎可以在所有的平台上安装plex服务器和客户端&#xff0c;让你可以随时随地享受存储在家中的电影、照片、音乐&#xff0c;并且可以实现观看记录无缝衔接&#xff0c;手机…

VScode——NPM脚本窗口找不到

一、问题描述&#xff08;NPM终端在任务栏左侧找不到&#xff09; VScode&#xff08;Visual Studio Code&#xff09;版本&#xff1a;1.79.2 二、解决办法 第一步&#xff1a;通过设置/用户设置/扩展/MPM更改NPM默认配置&#xff0c;如下图所示&#xff1a; 第二步&#xff…

[java安全]CommonsCollections6

文章目录 【java安全】CommonsCollections6**测试环境**前言分析TiedMapEntry注意点一注意点二POC调用栈 【java安全】CommonsCollections6 测试环境 3.1-3.2.1&#xff0c;jdk1.7,1.8 前言 之前我们分析了CommonsCollections1 LazyMap利用链&#xff0c;但是在java 8u71以…

2023 年中回顾:珍惜当下,锻炼身体

文章大纲 过去几十年的经验&#xff1a;人类的悲喜并不相同马太效应破圈&#xff1a;健康的身体写博客这件事&#xff1a;价值导向参考文献 距离上次阶段性回顾仅仅过去半年&#xff0c;感觉整个IT 行业天翻地覆慨而慷了。 时光荏苒&#xff0c;我自己也在芯片领域深耕了365天&…

swagger不可用

swagger不可用 问题描述问题处理测试环境外网域名测试环境内网域名思考 总结 问题描述 上周swagger还没啥问题&#xff0c;这周一测试突然和我说&#xff0c;测试环境的swagger都用不了了&#xff0c;然后开始找原因 问题处理 测试环境外网域名 一直跳这个弹窗&#xff0c;百度…

学习AJAX

AJAX &#x1f680; HTTP请求报文响应报文 &#x1f684; express框架&#x1f6ac; express基本使用 &#x1f692; 原生AJAX&#x1f6ac; GET.HTML&#x1f6ac; POST.HTML&#x1f6ac; JSON.HTML&#x1f6ac; nodemon工具可以帮助重启服务&#x1f6ac; IE缓存问题&#…

MIT 6.829 -- L0 Background: Single-Link Communication

MIT 6.829 -- L0 Background: Single-Link Communication 前言ProblemModulation(调制) & Demodulation(解调)FramingError DetectionError RecoveryARQ Shared Media Access总结 本课程为MIT 6.829 计网课程,课程对应官网链接: Computer Networks Lecture Notes 本节对应…

操作系统——虚拟内存管理

文章目录 一、虚拟内存中的几种地址1、逻辑地址2、线性地址3、逻辑地址转线性地址4、线性地址转物理地址 二、进程与内存1、内核空间和用户空间2、内存映射3、进程内存分配与回收 早期程序直接运行在物理内存上&#xff0c;直接操作物理内存&#xff0c;这种方式存在几个问题&a…

【Python】selenium项目实战:从12306网站获取特定时间段二等座有票的车次

文章目录 一、项目背景二、页面查找1、查询条件2、定位有二等座的元素3、定位有二等座的车次信息4、CtrlF检验xpath查找的车次 三、代码实现 一、项目背景 工具&#xff1a; pythonpycharmselenium 12306网址&#xff1a; https://kyfw.12306.cn/otn/leftTicket/init?linktyp…

【GESP】2023年06月图形化四级 -- 密码合规检测

密码合规检测 【题目描述】 网站注册需要有用户名和密码,默认小猫角色和白色背景,编写程序以检查用户输入密码的有效性。 (1)合法的密码只能由a-z之间26个字母(字母不区分大小写)、0-9之间10个数字以及!@#$四个特殊字母构成。 (2)密码最短长度:6个字符,密码最大长…

通用技术 自动化测试与持续集成方案

目录 前言&#xff1a; 传统接口测试 接口测试自动化 接口自动化的持续集成 前言&#xff1a; 在现代软件开发中&#xff0c;自动化测试和持续集成是两个不可或缺的环节。自动化测试可以提高测试效率、减少人工错误&#xff0c;并确保软件的质量。持续集成则可以帮助开发团…

18.JavaWeb-JWT(登录、鉴权)

1.CSRF跨站请求伪造 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;通常缩写为 CSRF 或者 XSRF&#xff0c; 是一种挟制用户在当前已登录的Web应用程序上执行非本意的…

SOCKET编程基本原理

测试模拟环境 python 3.8—对应Pycharm 专业版 for linux 本文采用的环境是vmware + ubantu_64 先简单配置一下netstat工具 sudo apt-get install net-tools netstate基本用法 sudo netstat -at | grep 1234 // |管道函数 grep匹配正则表达式移除端口用Kill就可以了 SOCK…

Calendar类中的字段常量有哪些?

一、Calendar类介绍 Calender类是Java中用于处理日期和时间的类之一。它提供了一组方法&#xff0c;可以对日期和时间进行各种操作&#xff0c;如获取当前日期和时间、计算日期间的差值、设置特定日期和时间等。 Calendar类是一个抽象类&#xff0c;不能直接实例化&#xff0…

MySQL基础管理

目录 ​编辑 一、数据库管理 1.1语言分类 1.2、DDL 二、MySQL相关文件 三、MySQL相关命令 3.2.1创建表的流程 1.创建新的数据库 2.查看创建的数据库 3.进入text库中&#xff0c;创建表 4.查看text下的所有表 5.查看表的属性 6.向表中添加数据 7.查看表中的数据 1.3查看…

TinyKv调用流程梳理二

addNode生成peer func (c *client) heartbeatStreamLoop() {defer c.wg.Done()for {select {case <-c.ctx.Done():returndefault:}ctx, cancel : context.WithCancel(c.ctx)c.connMu.RLock()stream, err : c.leaderClient().RegionHeartbeat(ctx)c.connMu.RUnlock()if err !…

golang waitgroup

案例 WaitGroup 可以解决一个 goroutine 等待多个 goroutine 同时结束的场景&#xff0c;这个比较常见的场景就是例如 后端 worker 启动了多个消费者干活&#xff0c;还有爬虫并发爬取数据&#xff0c;多线程下载等等。 我们这里模拟一个 worker 的例子 package mainimport (…

Redis实现skipList(跳表) 代码有详解

Redis实现skipList(跳表) 项目介绍 非关系型数据库redis&#xff0c;以及levedb&#xff0c;rockdb其核心存储引擎的数据结构就是跳表。 本项目就是基于跳表实现的轻量级键值型存储引擎&#xff0c;使用C实现。插入数据、删除数据、查询数据、数据展示、数据落盘、文件加载数…

Java-API简析_java.lang.Runtime类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131714695 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

【GESP】2023年06月图形化四级 -- 按身高排序

按身高排序 【题目描述】 默认小猫角色和白色背景。有两个列表,第一个列表“names”存储名字,第二个列表“heights”存储这组名字对应的身高,这些身高由互不相同的正整数组成。 请按身高由大到小排序,同时能够得到对应名字的列表“names”。 例如: 名字列表:names = …