nt!CcFindBcb函数分析

第一部分:

1: kd> p
nt!CcAcquireByteRangeForWrite+0x377:
80a13c49 e866e4ffff      call    nt!CcFindBcb (80a120b4)
1: kd> t
nt!CcFindBcb:
80a120b4 55              push    ebp
1: kd> kc
 #
00 nt!CcFindBcb
01 nt!CcAcquireByteRangeForWrite
02 nt!CcFlushCache
03 Ntfs!LfsFlushLfcb
04 Ntfs!LfsFlushToLsnPriv
05 Ntfs!LfsWriteLfsRestart
06 Ntfs!LfsWriteRestartArea
07 Ntfs!NtfsCheckpointVolume
08 Ntfs!NtfsCheckpointAllVolumes
09 nt!ExpWorkerThread
0a nt!PspSystemThreadStartup
0b nt!KiThreadStartup
1: kd> dv
 SharedCacheMap = 0x89469530
     FileOffset = 0xf78d2768 {7884800}
 BeyondLastByte = 0xf78d26c8 {7888896}
            Bcb = 0xf78d26fc
          Found = 0x00 ''

1: kd> ?0n7884800
Evaluate expression: 7884800 = 00785000

第二部分:

   //
    //  Get address of Bcb listhead that is *after* the Bcb we are looking for,
    //  for backwards scan.  It is important that we fail in the forward
    //  direction so that we are looking in the right segment of the Bcb list.
    //

    BcbList = GetBcbListHead( SharedCacheMap, FileOffset->QuadPart + SIZE_PER_BCB_LIST, TRUE );

    [+0x018] SectionSize      : {67108864} [Type: _LARGE_INTEGER]
1: kd> ?0n67108864
Evaluate expression: 67108864 = 04000000


#define BEGIN_BCB_LIST_ARRAY             (0x200000)
#define SIZE_PER_BCB_LIST                (VACB_MAPPING_GRANULARITY * 2)
#define BCB_LIST_SHIFT                   (VACB_OFFSET_SHIFT + 1)

#define VACB_OFFSET_SHIFT                (18)
#define VACB_LEVEL_SHIFT                  (7)

#define VACB_SIZE_OF_FIRST_LEVEL         (1 << (VACB_OFFSET_SHIFT + VACB_LEVEL_SHIFT))

#define GetBcbListHead(SCM,OFF,FAILSUCC) (                                                         \
  (((SCM)->SectionSize.QuadPart > BEGIN_BCB_LIST_ARRAY) &&                                         \
   FlagOn((SCM)->Flags, MODIFIED_WRITE_DISABLED)) ?                                                \
   (((SCM)->SectionSize.QuadPart > VACB_SIZE_OF_FIRST_LEVEL) ?                                     \
    CcGetBcbListHeadLargeOffset((SCM),(OFF),(FAILSUCC)) :                                          \
    (((OFF) >= (SCM)->SectionSize.QuadPart) ? &(SCM)->BcbList :                                    \
     ((PLIST_ENTRY)((SCM)->Vacbs) + (((SCM)->SectionSize.QuadPart + (OFF)) >> BCB_LIST_SHIFT)))) : \
   &(SCM)->BcbList                                                                                 \
)


10  0000 0000 0000 0000 0000 0000

2000000

CcGetBcbListHeadLargeOffset((SCM),(OFF),(FAILSUCC))


1: kd> p
nt!CcFindBcb+0x1d:
80a120d1 3d00002000      cmp     eax,200000h
1: kd> p
nt!CcFindBcb+0x22:
80a120d6 7665            jbe     nt!CcFindBcb+0x89 (80a1213d)
1: kd> r
eax=04000000


1: kd> p
nt!CcFindBcb+0x30:
80a120e4 3d00000002      cmp     eax,2000000h
1: kd> p
nt!CcFindBcb+0x35:
80a120e9 7619            jbe     nt!CcFindBcb+0x50 (80a12104)
1: kd> r
eax=04000000


第三部分:nt!CcGetBcbListHeadLargeOffset

1: kd> kc
 #
00 nt!CcGetBcbListHeadLargeOffset
01 nt!CcFindBcb
02 nt!CcAcquireByteRangeForWrite
03 nt!CcFlushCache
04 Ntfs!LfsFlushLfcb
05 Ntfs!LfsFlushToLsnPriv
06 Ntfs!LfsWriteLfsRestart
07 Ntfs!LfsWriteRestartArea
08 Ntfs!NtfsCheckpointVolume
09 Ntfs!NtfsCheckpointAllVolumes
0a nt!ExpWorkerThread
0b nt!PspSystemThreadStartup
0c nt!KiThreadStartup
1: kd> dv
 SharedCacheMap = 0x89469530
     FileOffset = 0n8409088
FailToSuccessor = 0x01 ''
    SavedLevels = 0x80a189aa
SavedVacbArrays = struct _VACB **[7]
          Shift = 8
   SavedIndexes = unsigned long [7]
          Level = 0

1: kd> ?0n8409088
Evaluate expression: 8409088 = 00805000


#define SIZE_PER_BCB_LIST                (VACB_MAPPING_GRANULARITY * 2)
#define VACB_MAPPING_GRANULARITY         (0x40000)

80000+00785000=00805000

1: kd> dx -r1 ((ntkrnlmp!_VACB * *)0x89469320)
((ntkrnlmp!_VACB * *)0x89469320)                 : 0x89469320 [Type: _VACB * *]
    0x894d1008 [Type: _VACB *]
1: kd> dx -r1 ((ntkrnlmp!_VACB *)0x894d1008)
((ntkrnlmp!_VACB *)0x894d1008)                 : 0x894d1008 [Type: _VACB *]
    [+0x000] BaseAddress      : 0x89988018 [Type: void *]
    [+0x004] SharedCacheMap   : 0x0 [Type: _SHARED_CACHE_MAP *]
    [+0x008] Overlay          [Type: __unnamed]
    [+0x010] LruList          [Type: _LIST_ENTRY]


第四部分:

    Shift = VACB_OFFSET_SHIFT + VACB_LEVEL_SHIFT;    25

#define VACB_OFFSET_SHIFT                (18)
#define VACB_LEVEL_SHIFT                  (7)


    do {

        Level += 1;
        Shift += VACB_LEVEL_SHIFT;

    } while (SharedCacheMap->SectionSize.QuadPart > ((LONGLONG)1 << Shift));

1: kd> p
nt!CcGetBcbListHeadLargeOffset+0x46:
80a189f0 8345fc07        add     dword ptr [ebp-4],7
1: kd> p
nt!CcGetBcbListHeadLargeOffset+0x4a:
80a189f4 8b4dfc          mov     ecx,dword ptr [ebp-4]
1: kd> r
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=89469530 edi=89469320
eip=80a189f4 esp=f78d2610 ebp=f78d2660 iopl=0         nv up ei pl nz ac po nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000212
nt!CcGetBcbListHeadLargeOffset+0x4a:
80a189f4 8b4dfc          mov     ecx,dword ptr [ebp-4] ss:0010:f78d265c=00000020
1: kd> dd f78d2660-4
f78d265c  00000020

dv
          Shift = 0x20
          Level = 1

    if (FileOffset >= ((LONGLONG)1 << Shift)) {
        return &SharedCacheMap->BcbList;
    }


    //
    //  Now descend the tree to the bottom level to get the caller's Bcb ListHead.
    //

    Shift -= VACB_LEVEL_SHIFT;    25    0x2000000
    do {

        //
        //  Calculate the index into the Vacb block for this level.
        //

        Index = (ULONG)(FileOffset >> Shift);    =0
        ASSERT(Index <= VACB_LAST_INDEX_FOR_LEVEL);


1: kd> p
nt!CcGetBcbListHeadLargeOffset+0x9d:
80a18a47 83fe7f          cmp     esi,7Fh
1: kd> r
eax=00000000 ebx=00000000 ecx=00000019 edx=00000000 esi=00000000 edi=89469320

第五部分:

        //
        //  Get block address for next level.
        //

        NextVacbArray = (PVACB *)VacbArray[Index];    894d1008


1: kd> p
nt!CcGetBcbListHeadLargeOffset+0xb8:
80a18a62 8b1cb7          mov     ebx,dword ptr [edi+esi*4]
1: kd> p
nt!CcGetBcbListHeadLargeOffset+0xbb:
80a18a65 33c9            xor     ecx,ecx
1: kd> r
eax=00000000 ebx=894d1008 ecx=00000019 edx=00000000 esi=00000000 edi=89469320


1: kd> dd 89469320
89469320  894d1008 00000000 00000000 00000000
89469330  00000000 00000000 00000000 00000000
89469340  00000000 00000000 00000000 00000000

1: kd> p
nt!CcGetBcbListHeadLargeOffset+0x13c:
80a18ae6 e825b10d00      call    nt!_allshl (80af3c10)
1: kd> r
eax=00000001 ebx=894d1008 ecx=00000019 edx=00000000 esi=00000000 edi=894d1008


1: kd> p
nt!CcGetBcbListHeadLargeOffset+0x141:
80a18aeb 83e801          sub     eax,1
1: kd> r
eax=02000000


1: kd> r
eax=01ffffff ebx=894d1008 ecx=00000019 edx=00000000 esi=00000000 edi=894d1008
eip=80a18af1 esp=f78d2610 ebp=f78d2660 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
nt!CcGetBcbListHeadLargeOffset+0x147:
80a18af1 21450c          and     dword ptr [ebp+0Ch],eax ss:0010:f78d266c=00805000
1: kd> dd f78d2660+c
f78d266c  00805000

1ff    ffff    0080    5000

1: kd> dv
 SharedCacheMap = 0x89469530
     FileOffset = 0n8409088


1: kd> dv
 SharedCacheMap = 0x89469530
     FileOffset = 0n8409088
FailToSuccessor = 0x01 ''
    SavedLevels = 1
SavedVacbArrays = struct _VACB **[7]
          Shift = 0x12


    Index = (ULONG)(FileOffset >> Shift);
    return (PLIST_ENTRY)((PCHAR)&VacbArray[Index & ~1] + VACB_LEVEL_BLOCK_SIZE);
}

80    5000

1000 0000 1001 0000 0000 0000  

1000 0000 1001 0000 0000 0000  

10 00 00

0x20


1: kd> p
nt!CcGetBcbListHeadLargeOffset+0x161:
80a18b0b 8b4dfc          mov     ecx,dword ptr [ebp-4]
1: kd> p
nt!CcGetBcbListHeadLargeOffset+0x164:
80a18b0e e81db10d00      call    nt!_allshr (80af3c30)
1: kd> r
eax=00805000 ebx=894d1008 ecx=00000012 edx=00000000 esi=00000000 edi=894d1008
eip=80a18b0e esp=f78d2610 ebp=f78d2660 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
nt!CcGetBcbListHeadLargeOffset+0x164:
80a18b0e e81db10d00      call    nt!_allshr (80af3c30)
1: kd> p
nt!CcGetBcbListHeadLargeOffset+0x169:
80a18b13 83e0fe          and     eax,0FFFFFFFEh
1: kd> r
eax=00000020


#define VACB_LEVEL_BLOCK_SIZE             ((1 << VACB_LEVEL_SHIFT) * sizeof(PVOID))

#define VACB_LEVEL_SHIFT                  (7)

1000 0000 00
10    00 00    00 00

200


1: kd> p
nt!CcGetBcbListHeadLargeOffset+0x16c:
80a18b16 8d848300020000  lea     eax,[ebx+eax*4+200h]
1: kd> r
eax=00000020 ebx=894d1008

1: kd> r
eax=894d1288


1: kd> dd 894d1008+80+200
894d1288  898f1298 894d1290 894d1288 894d1298
894d1298  894d1290 894d12a0 894d1298 894d12a8

第六部分:


1: kd> p
nt!CcFindBcb+0x4e:
80a12102 eb3c            jmp     nt!CcFindBcb+0x8c (80a12140)
1: kd> r
eax=894d1288


1: kd> dt _bcb  0x898f1298-10
nt!_BCB
   +0x000 Dummy            : _MBCB
   +0x000 NodeTypeCode     : 0n765
   +0x002 Dirty            : 0x1 ''
   +0x003 Reserved         : 0 ''
   +0x004 ByteLength       : 0x1000
   +0x008 FileOffset       : _LARGE_INTEGER 0x787000
   +0x010 BcbLinks         : _LIST_ENTRY [ 0x8962bcf8 - 0x894d1288 ]
   +0x018 BeyondLastByte   : _LARGE_INTEGER 0x788000
   +0x020 OldestLsn        : _LARGE_INTEGER 0x0
   +0x028 NewestLsn        : _LARGE_INTEGER 0x0
   +0x030 Vacb             : 0x89988498 _VACB
   +0x034 PinCount         : 1
   +0x038 Resource         : _ERESOURCE
   +0x070 SharedCacheMap   : 0x89469530 _SHARED_CACHE_MAP
   +0x074 BaseAddress      : 0xc2c47000 Void


1: kd> dt LIST_ENTRY 894d1288
ntdll!LIST_ENTRY
 [ 0x898f1298 - 0x894d1290 ]
   +0x000 Flink            : 0x898f1298 _LIST_ENTRY [ 0x8962bcf8 - 0x894d1288 ]
   +0x004 Blink            : 0x894d1290 _LIST_ENTRY [ 0x894d1288 - 0x894d1298 ]

1: kd> p
nt!CcFindBcb+0x91:
80a12145 837e0400        cmp     dword ptr [esi+4],0
1: kd> r
eax=898f1288 ebx=89469530 ecx=00000012 edx=00000000 esi=f78d2768 edi=89469530


1: kd> ?0n7884800
Evaluate expression: 7884800 = 00785000

1: kd> dt _bcb  0x898f1298-10
nt!_BCB
   +0x000 Dummy            : _MBCB
   +0x000 NodeTypeCode     : 0n765
   +0x002 Dirty            : 0x1 ''
   +0x003 Reserved         : 0 ''
   +0x004 ByteLength       : 0x1000
   +0x008 FileOffset       : _LARGE_INTEGER 0x787000
   +0x010 BcbLinks         : _LIST_ENTRY [ 0x8962bcf8 - 0x894d1288 ]
   +0x018 BeyondLastByte   : _LARGE_INTEGER 0x788000
   +0x020 OldestLsn        : _LARGE_INTEGER 0x0
   +0x028 NewestLsn        : _LARGE_INTEGER 0x0
   +0x030 Vacb             : 0x89988498 _VACB
   +0x034 PinCount         : 1
   +0x038 Resource         : _ERESOURCE
   +0x070 SharedCacheMap   : 0x89469530 _SHARED_CACHE_MAP
   +0x074 BaseAddress      : 0xc2c47000 Void

1: kd> dt _bcb  0x8962bcf8-10
nt!_BCB
   +0x000 Dummy            : _MBCB
   +0x000 NodeTypeCode     : 0n765
   +0x002 Dirty            : 0x1 ''
   +0x003 Reserved         : 0 ''
   +0x004 ByteLength       : 0x1000
   +0x008 FileOffset       : _LARGE_INTEGER 0x786000
   +0x010 BcbLinks         : _LIST_ENTRY [ 0x894c6668 - 0x898f1298 ]
   +0x018 BeyondLastByte   : _LARGE_INTEGER 0x787000
   +0x020 OldestLsn        : _LARGE_INTEGER 0x0
   +0x028 NewestLsn        : _LARGE_INTEGER 0x0
   +0x030 Vacb             : (null)
   +0x034 PinCount         : 0
   +0x038 Resource         : _ERESOURCE
   +0x070 SharedCacheMap   : 0x89469530 _SHARED_CACHE_MAP
   +0x074 BaseAddress      : (null)


1: kd> dt _bcb 0x894c6668-10
nt!_BCB
   +0x000 Dummy            : _MBCB
   +0x000 NodeTypeCode     : 0n765
   +0x002 Dirty            : 0x1 ''
   +0x003 Reserved         : 0 ''
   +0x004 ByteLength       : 0x1000
   +0x008 FileOffset       : _LARGE_INTEGER 0x785000
   +0x010 BcbLinks         : _LIST_ENTRY [ 0x894d1280 - 0x8962bcf8 ]
   +0x018 BeyondLastByte   : _LARGE_INTEGER 0x786000
   +0x020 OldestLsn        : _LARGE_INTEGER 0x0
   +0x028 NewestLsn        : _LARGE_INTEGER 0x0
   +0x030 Vacb             : (null)
   +0x034 PinCount         : 0
   +0x038 Resource         : _ERESOURCE
   +0x070 SharedCacheMap   : 0x89469530 _SHARED_CACHE_MAP
   +0x074 BaseAddress      : (null)


1: kd> dt _bcb 0x894d1280-10
nt!_BCB
   +0x000 Dummy            : _MBCB
   +0x000 NodeTypeCode     : 0n4712        //错误
   +0x002 Dirty            : 0x4d 'M'
   +0x003 Reserved         : 0x89 ''
   +0x004 ByteLength       : 0x894d1278
   +0x008 FileOffset       : _LARGE_INTEGER 0x894d1280`894d1270
   +0x010 BcbLinks         : _LIST_ENTRY [ 0x894d1278 - 0x894c6668 ]
   +0x018 BeyondLastByte   : _LARGE_INTEGER 0x894d1290`898f1298
   +0x020 OldestLsn        : _LARGE_INTEGER 0x894d1298`894d1288
   +0x028 NewestLsn        : _LARGE_INTEGER 0x894d12a0`894d1290
   +0x030 Vacb             : 0x894d1298 _VACB
   +0x034 PinCount         : 0x894d12a8
   +0x038 Resource         : _ERESOURCE
   +0x070 SharedCacheMap   : 0x894d12d8 _SHARED_CACHE_MAP
   +0x074 BaseAddress      : 0x894d12e8 Void

1: kd> p
nt!CcFindBcb+0xb1:
80a12165 3bd1            cmp     edx,ecx
1: kd> r
eax=8962bce8 ebx=89469530 ecx=00786000 edx=00785000


1: kd> p
nt!CcFindBcb+0xbe:
80a12172 83e810          sub     eax,10h
1: kd> p
nt!CcFindBcb+0xc1:
80a12175 668138fd02      cmp     word ptr [eax],2FDh
1: kd> r
eax=894c6658


            if (FileOffset->QuadPart >= Bcbt->FileOffset.QuadPart) {
                Found = TRUE;
                break;
            }

第七部分:


1: kd> dt _bcb 894c6658
nt!_BCB
   +0x000 Dummy            : _MBCB
   +0x000 NodeTypeCode     : 0n765
   +0x002 Dirty            : 0x1 ''
   +0x003 Reserved         : 0 ''
   +0x004 ByteLength       : 0x1000
   +0x008 FileOffset       : _LARGE_INTEGER 0x785000
   +0x010 BcbLinks         : _LIST_ENTRY [ 0x894d1280 - 0x8962bcf8 ]
   +0x018 BeyondLastByte   : _LARGE_INTEGER 0x786000
   +0x020 OldestLsn        : _LARGE_INTEGER 0x0
   +0x028 NewestLsn        : _LARGE_INTEGER 0x0
   +0x030 Vacb             : (null)
   +0x034 PinCount         : 0
   +0x038 Resource         : _ERESOURCE
   +0x070 SharedCacheMap   : 0x89469530 _SHARED_CACHE_MAP
   +0x074 BaseAddress      : (null)

1: kd> dv
 SharedCacheMap = 0x89469530
     FileOffset = 0xf78d2768 {7884800}
 BeyondLastByte = 0xf78d26c8 {7888896}
            Bcb = 0xf78d26fc
          Found = 0x01 ''
1: kd> dx -r1 ((ntkrnlmp!_BCB * *)0xf78d26fc)
((ntkrnlmp!_BCB * *)0xf78d26fc)                 : 0xf78d26fc [Type: _BCB * *]
    0x894c6658 [Type: _BCB *]

    return Found;
}


第八部分:

                //
                //  Position ourselves.  If we did not find a Bcb for the page, then
                //  a lower FileOffset was returned, so we want to move forward one.
                //

                if (!CcFindBcb( SharedCacheMap,
                                StartingOffset,
                                &StartingOffsetBias,
                                &Bcb )) {                //返回到这里:
                    Bcb = CONTAINING_RECORD( Bcb->BcbLinks.Blink, BCB, BcbLinks );
                }

dv
                   Bcb = 0x894c6658

                    Bcb = CONTAINING_RECORD( Bcb->BcbLinks.Blink, BCB, BcbLinks );    =0x8962bcf8-10

1: kd> dx -r1 ((ntkrnlmp!_BCB *)0x894c6658)
((ntkrnlmp!_BCB *)0x894c6658)                 : 0x894c6658 [Type: _BCB *]
    [+0x000] Dummy            [Type: _MBCB]
    [+0x000] NodeTypeCode     : 765 [Type: short]
    [+0x002] Dirty            : 0x1 [Type: unsigned char]
    [+0x003] Reserved         : 0x0 [Type: unsigned char]
    [+0x004] ByteLength       : 0x1000 [Type: unsigned long]
    [+0x008] FileOffset       : {7884800} [Type: _LARGE_INTEGER]
    [+0x010] BcbLinks         [Type: _LIST_ENTRY]
    [+0x018] BeyondLastByte   : {7888896} [Type: _LARGE_INTEGER]
    [+0x020] OldestLsn        : {0} [Type: _LARGE_INTEGER]
    [+0x028] NewestLsn        : {0} [Type: _LARGE_INTEGER]
    [+0x030] Vacb             : 0x0 [Type: _VACB *]
    [+0x034] PinCount         : 0x0 [Type: unsigned long]
    [+0x038] Resource         [Type: _ERESOURCE]
    [+0x070] SharedCacheMap   : 0x89469530 [Type: _SHARED_CACHE_MAP *]
    [+0x074] BaseAddress      : 0x0 [Type: void *]
1: kd> dx -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x894c6668))
(*((ntkrnlmp!_LIST_ENTRY *)0x894c6668))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x894d1280 [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0x8962bcf8 [Type: _LIST_ENTRY *]        Blink            : 0x8962bcf8


1: kd> dt _bcb 0x8962bcf8-10
nt!_BCB
   +0x000 Dummy            : _MBCB
   +0x000 NodeTypeCode     : 0n765
   +0x002 Dirty            : 0x1 ''
   +0x003 Reserved         : 0 ''
   +0x004 ByteLength       : 0x1000
   +0x008 FileOffset       : _LARGE_INTEGER 0x786000
   +0x010 BcbLinks         : _LIST_ENTRY [ 0x894c6668 - 0x898f1298 ]
   +0x018 BeyondLastByte   : _LARGE_INTEGER 0x787000
   +0x020 OldestLsn        : _LARGE_INTEGER 0x0
   +0x028 NewestLsn        : _LARGE_INTEGER 0x0
   +0x030 Vacb             : (null)
   +0x034 PinCount         : 0
   +0x038 Resource         : _ERESOURCE
   +0x070 SharedCacheMap   : 0x89469530 _SHARED_CACHE_MAP
   +0x074 BaseAddress      : (null)

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矩阵及矩阵快速幂

一.矩阵与模板 【模板】矩阵求和 时间限制&#xff1a;1秒 内存限制&#xff1a;128M 题目描述 给出两个&#x1d45b;行&#x1d45a;列的矩阵&#xff0c;求两个矩阵的和 输入描述 第一行输入两个以空格分隔的整数&#x1d45b;,&#x1d45a;&#xff0c;表示矩…

rk3588获取探维雷达数据

可以在上期部署完 FASTLIO 的工作空间内&#xff0c;继续部署探维雷达的驱动程序。不要问为什么不用 mid360&#xff0c;因为我手上只有探维雷达。 探维雷达的驱动链接&#xff1a;https://github.com/TanwayLab/tanwaylidar_view/blob/main/README.md 下载驱动并编译 因为沿…

HTML简介,初步了解HTML

<html> <body> <h1>我的第一个标题</h1> <p1>我的第一个段落</p1> </body> </html> 什么是HTML HTML是用来描述网页的一种语言。 HTML指的是超文本标记语言。 HTML不是一种编程语言&#xff0c;而是一种标记语言。 标记语…

ARM集群服务器 定义

ARM集群服务器的核心定义可归纳为以下要点&#xff1a; 一、核心定义 ARM集群服务器是将‌多个基于ARM架构的处理器节点‌集成在单一物理机箱内&#xff0c;通过高速网络互联形成的分布式计算系统。每个节点均具备独立的计算单元&#xff08;如CPU、GPU/NPU&#xff09;、内存…

进程和线程的区别?

进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是操作系统资源分配和调度的核心概念&#xff0c;它们的区别主要体现在以下几个方面&#xff1a; 1. ​​定义与资源分配​​ ​​进程​​ 是程序的​​一次执行实例​​&#xff0c;拥有独立的地址空…

AR 学习:开启未来学习新视界​

AR 学习&#xff0c;即增强现实学习&#xff0c;是一种创新的学习方式&#xff0c;它巧妙地将增强现实技术融入到教育领域。简单来说&#xff0c;就是利用 AR 技术把虚拟的信息和现实场景完美融合&#xff0c;为学习者打造出一个沉浸式的学习环境。AR 学习打破了传统学习的边界…

C++并发编程-4.unique_lock,共享锁和递归锁

本文介绍C 并发中使用的其他类型的锁&#xff0c;包括unique_lock&#xff0c;shared_lock, 以及recursive_lock等。shared_lock和unique_lock比较常用&#xff0c;而recursive_lock用的不多&#xff0c;或尽可能规避用这种锁。 unique_lock unique_lock和lock_guard基本用法…

stm32 freertos下基于 hal库的模拟I2C驱动实现

一 前言 最近搞了两个项目&#xff0c;调了一版freertos下基于hal库得模拟I2C驱动&#xff0c;非常实用&#xff0c;直接拷贝就能用&#xff0c;这里做下记录&#xff0c;主要用到如下四个文件&#xff1a; delay.cdelay.hi2cc.ci2cc.h 二 代码实现 delay.c #include "…

文心大模型 4.5 系列开源首发:技术深度解析与应用指南

文心大模型 4.5 系列开源首发&#xff1a;技术深度解析与应用指南 2025 年 6 月 30 日&#xff0c;百度正式在国内领先的开源平台 GitCode 发布文心大模型 4.5 系列开源模型。此次开源不仅覆盖了从数亿到数百亿参数的多种规模&#xff0c;还在多模态理解、指令遵循、世界知识记…

智能制造——58页智慧工厂解决方案【附全文阅读】

适应人群为制造业企业管理者、技术人员及规划改造团队。主要内容是以 JetLinks IoT 平台为基础&#xff0c;构建涵盖设备层、网络层、平台层和应用层的智慧工厂体系&#xff0c;通过多种通信协议实现设备互联&#xff0c;利用大数据、AI 等技术实现数据采集与处理、设备全生命周…

DeepSeek16-open-webui Pipelines开发填坑

一、虚拟环境安装 mkdir open_webui_pipelines cd open_webui_pipelines python -m venv py3119_env call py3119_env\Scripts\activate 二、下载服务以及安装依赖 git clone https://github.com/open-webui/pipelines.git cd pipelines pip install -r requirements.txt三、…

兰亭妙微APP 界面设计与软件开发综合服务商

兰亭妙微作为 APP 界面设计公司与软件开发公司&#xff0c;自 2011 年成立以来&#xff0c;由清华团队主导&#xff0c;在软件和互联网 UI/UE 设计开发领域发展 16 年&#xff0c;积累了一定的行业经验。 在 APP 界面设计方面&#xff0c;我们的团队包含交互设计师、用户体验相…

【算法】动态规划:1137. 第 N 个泰波那契数

1137. 第 N 个泰波那契数 简单 相关标签 premium lock icon 相关企业 提示 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 示例 1&#xff1a; 输入&am…

[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的校园家教兼职信息交流平台管理系统,推荐!

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园家教兼职信息交流平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的…

vue-33(实践练习:使用 Nuxt.js 和 SSR 构建一个简单的博客)

实践练习:使用 Nuxt.js 和 SSR 构建一个简单的博客 使用 Nuxt.js 和 SSR 构建一个简单的博客是巩固你对服务器端渲染理解以及 Nuxt.js 如何简化这一过程的好方法。这个练习将带你完成设置基本博客结构、获取数据并以用户友好的格式展示,同时利用 SSR 的优势来提升 SEO 和性能…

如何在 .Net 7 中使用 MQTT 客户端

介绍 MQTT&#xff08;消息队列遥测传输&#xff09;是一种轻量级消息传递协议&#xff0c;专为资源受限的环境而设计。MQTT 广泛应用于物联网 (IoT) 和机器对机器 (M2M) 通信。 本文将讨论如何在 .NET 7 中实现 MQTT 消费者。我们将使用 MQTTnet 库&#xff0c;这是 C# 中的高…

云上攻防—Docker安全容器逃逸特权模式危险挂载

前言 之前分享的是云服务安全&#xff0c;今天开始云原生安全&#xff0c;安全道路依旧很长。 什么是Docker呢&#xff0c;它是开源的容器化平台&#xff0c;用于开发、部署和运行应用程序。它通过将应用程序及其依赖项打包在轻量级的容器中&#xff0c;实现环境一致性、快速…

2025API 开发工具Apipost 与 Apifox深度对比

在当今数字化时代&#xff0c;API 开发是构建各类软件应用的关键环节。Apipost 和 Apifox 作为两款知名的 API 开发工具&#xff0c;它们在实际开发场景中表现究竟如何呢&#xff1f;接下来&#xff0c;让我们从多个功能点进行深入对比。 一、API 设计功能 接口定义与参数设置…

从零开始搭建Windows AI开发环境:QWQ-32B部署+Cursor插件优化实战

文章目录 前言1.安装Ollama2.QwQ-32B模型安装与运行3.Cursor安装与配置4. 简单使用测试5. 调用本地大模型6. 安装内网穿透7. 配置固定公网地址总结 前言 本方案提出了一种基于Windows系统的智能化开发平台搭建策略&#xff0c;通过融合Cursor智能编程平台、Ollama模型运行框架…

PostgreSQL 中,若需显示 不在 `IN` 子句列表中的数据

在 PostgreSQL 中&#xff0c;若需显示 不在 IN 子句列表中的数据&#xff0c;可以通过以下方法实现&#xff1a; 方法 1&#xff1a;使用 NOT IN&#xff08;注意 NULL 值&#xff09; 直接筛选不包含在 IN 列表中的记录&#xff1a; SELECT * FROM your_table WHERE your_c…