我每秒下载数千个文件.每个文件大约5KB,总下载速度约为200Mb/s.我需要保存所有这些文件.
下载过程分为数千个正在运行的异步任务.当他们完成下载文件并想要保存文件时,他们会将其添加到要保存的文件队列中.
这是这个课程的样子.我在一开始就创建了这个类的实例,并让我的任务添加需要保存到队列中的文件.
Public Class FileSaver
Structure FileToSave
Dim path As String
Dim data() As Byte
End Structure
Private FileQueue As New Concurrent.BlockingCollection(Of FileToSave)
Sub New()
Task.Run(
Async Function()
While 1
Dim fl As FileToSave = FileQueue.Take()
Using sourceStream As New FileStream(fl.path, FileMode.Append, FileAccess.Write, FileShare.None, bufferSize:=4096, useAsync:=True)
Await sourceStream.WriteAsync(fl.data, 0, fl.data.Length)
End Using
End While
End Function
)
End Sub
Public Sub Add(path As String, data() As Byte)
Dim fl As FileToSave
fl.path = path
fl.data = data
FileQueue.Add(fl)
End …Run Code Online (Sandbox Code Playgroud) 我将kexec压缩为一个二进制文件,并将其编写为x86_64 ELF。运行正常。
由于它是64位二进制文件,因此我知道处理器必须处于64位长模式。这需要使用分页,所以我知道必须打开分页。
我的问题是,这些页表的状态是什么?是否有某些区域(例如我加载的二进制文件)可以保证进行身份映射?是否所有可用的RAM标识都已映射?由于启用了分页,因此页面在哪里?
执行完kexec'之后,我想对整个地址空间进行身份映射。为此,我需要在我知道物理地址的地址处构建一些页表结构,然后将该结构的地址写入CR3。
如果我知道加载到内存中的小精灵二进制文件是身份映射的,则可以在其中静态构建页表,然后进行无缝切换。如果kexec之后没有标识映射的页面,则需要关闭分页,退出long模式,然后进行设置,然后重新进入long 64位模式。
谢谢!
[user@localhost ~]$ declare -p test
declare -- test="eval \\\\\\\\; eval \\\\\\\\;"
[user@localhost ~]$ $test
-bash: \\: command not found
-bash: \: command not found
Run Code Online (Sandbox Code Playgroud)
看起来第二组反斜杠的解析次数是第一组的两倍。我添加任意数量的反斜杠都会发生这种情况。
为什么?
.net ×1
bash ×1
bootloader ×1
elf ×1
file ×1
file-io ×1
linux ×1
linux-kernel ×1
performance ×1
vb.net ×1