Android 低级别读取大于 2GB 的 SD 卡
我的Android应用程序尝试通过访问实际设备来读取SD卡的物理部门(在我的情况下,/dev/block/vold/179:1). (当然,这是在扎根的手机上) 我能够以FileInputStream的方式打开该设备,并从中读取数据.但是,我似乎无法读过2GB标记(我的存储卡是16GB). 这是因为Android不支持大于2GB的文件吗?如果是这样,为什么函数position()和skip()接受long参数?? 有人有建议如何从设备上读取2GB? 解决方案 尝试使用本机(JNI)lib创建并致电__llseek() int __llseek(unsigned int fd, unsigned long offset_high, unsigned long offset_low, loff_t *result, unsigned int whence); 我认为您应该在代码中添加原型,因为我怀疑是否有
0 2024-02-03
编程技术问答社区
降低位图字体比例的算法
这是对这个问题 . 我正在研究一个低级C应用程序,我必须在其中绘制文本.我决定将要用作数组的字体存储(也许是黑白,每个char 128x256),然后我会使用一些算法将其降低到我需要的尺寸(作为灰度,所以我可以有一些粗略的字体平滑). 注意:这是一个玩具项目,请忽略诸如在运行时进行计算之类的事情. 问题是哪种算法? 我抬起头来2xSaI,但是很复杂.我想我自己可以阅读描述并自己处理代码(我是一个初学者,并且已经在C/C ++编码不到一年). 建议,有人吗? 感谢您的时间! 编辑:请注意,输入为B&W,输出应平滑灰度 解决方案 找出将与目标像素相对应的源图像中的矩形.例如,如果您的源图像为50x100,目的地为20x40,则目的地的左上像素对应于源图像中从(0,0)到(2.2,2.2)的矩形.现在,对这些像素进行面积平均水平: 区域为2.2 * 2.2 = 4.84.您将将结果扩展到1/4.84. 像素为(0,0),(0,1),(1
2 2024-01-23
编程技术问答社区
Actionscript 3中循环的变量声明性能
尽管有关此问题的所有已知博客,但我总是怀疑一些结果,我的个人测试表明,付出的标准不是最好的. 在循环内声明变量,以使它们靠近其范围,并使方法更快地通过该方法达到,但要在 为了保存内存分配,但在遥远的实例中增加处理为迭代. 我的结果表明方法B更快(有时),我想知道围绕此的背景. 结果各不相同,而不是灌木丛的大师. 所以你们对此有何看法? 方法a var object:Object = new Object(); var loop:int = 100000 for (var i:int = 0; i
2 2024-01-09
编程技术问答社区
x86-64平台上的int_fast8_t大小与int_fast16_t大小
我已经了解到,在x86-64平台上使用任何64位寄存器都需要一个REX前缀,并且任何少于64位的地址都需要地址大小的前缀. . x86-64位: E3 rel8是jrcxz 67 E3 rel8是jecxz 67是用于地址尺寸覆盖前缀的OpCode. sizeof(int_fast8_t)是8位,而其他sizeof(int_fast16_t)和sizeof(int_fast32_t)(仅在Linux上)是64位. 当其他快速键入为64位时,为什么只有int_fast8_t 8位? 与对齐有关吗? 解决方案 为什么只有int_fast8_t是8位,而其他快速typdef为64位? 因为Glibc在X86-64是新的时做出了简单而可以说是糟糕的选择当这些C99类型是新的时,并且做出了不好的决定,不为X86-64专业化它. . 所有int_fast16/32/64_t均定义为所有平台上的long.那就完成了 long在32和
0 2024-01-08
编程技术问答社区
我在哪里可以找到关于CorFlags值的每一个位的含义的参考资料?
我正在处理一些相当低的水平,并试图确定为什么我使用Corflags.exe实用程序获得不同的输出.作为参考,输出是如此: $ corflags test2.exe Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.17929 Copyright (c) Microsoft Corporation. All rights reserved. Version : v4.0.30319 CLR Header: 2.5 PE : PE32 CorFlags : 0x1 ILONLY : 1 32BITREQ : 0 32BITPREF : 0 Signed : 0 $ corflags test.exe Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.
4 2024-01-05
编程技术问答社区
关于在汇编中保存变量的多种方式的混乱,又名.skip .equ和.quad
亲爱的堆栈溢出用户! 试图在这里学习汇编,我偶然发现了以下事实:到目前为止,我找到了使用汇编(AT&T语法)创建变量的三种方法: .equ使变量 .skip保留变量的特定存储量 .quad/long/word/byte创建一个小变量. 到目前为止,我收集的唯一区别是,.quad方法可能导致变量在特定条件下被执行(并且.skip类似于堆内存的作品?我认为?). ,至少我想知道,是否有任何理由使用任何特定方法?您认为最好使用哪一个来存储字符串,整数以及用户的某些输入? ? 编辑:按照Fuz的解释,我构建了以下代码,以测试差异: .data bar: .int 128 .equ bob, 128 .bss buf: .skip 128 buf1: .skip bar buf2: .skip bob .text .global main main: mov $256, %rax mov %rax, bar
4 2023-12-16
编程技术问答社区
指令级剖析。指令指针的意义?
在"汇编指令级别"进行分析代码时,指令指针的位置确实意味着鉴于现代CPU不执行串行或订购指令?例如,假设以下x64汇编代码: mov RAX, [RBX]; // Assume a cache miss here. mov RSI, [RBX + RCX]; // Another cache miss. xor R8, R8; add RDX, RAX; // Dependent on the load into RAX. add RDI, RSI; // Dependent on the load into RSI. 指令指针大部分时间都会花在哪种指令上?我可以想到所有这些的好论点: mov RAX, [RBX]大概要进行100个周期,因为这是一个缓存. mov RSI, [RBX + RCX]还需要100次循环,但可能与先前的指令同时执行.指令指针在其中一个或另一个
14 2023-12-16
编程技术问答社区
要学习汇编,我应该从32位还是64位开始?
我真的很想学习组装.我非常擅长C/C ++,但希望更好地了解较低级别的情况. 我意识到之前已经提出过与集会有关的问题,但是我只是在寻找我的情况特别的方向: 我正在运行Windows 7,并且对如何开始使用汇编感到困惑.我有从x64开始,因为我正在运行Windows 7?有些人说"先从32位开始" - 我该怎么做?我的操作系统与我为" 32"或" 64"位编写组装的能力有什么关系.实际上," n位"组件是什么意思,其中n是一个数字? 编辑: 这里有一些链接,可以帮助我开始组装;其他刚刚起步的人可能会发现他们有帮助.当我继续进行集会之旅时,我将继续更新此列表:) 注意:当我一直在学习时,我决定专注于MASM32编程.因此,以下大多数资源都集中在此上. www.masm32.com x86汇编wikibook wikibook x86 dissAssembly wikibook 翻译成汇编) winasm IDE (与MASM32一起播放) into
4 2023-12-16
编程技术问答社区
2个32位数相乘,用AVX2取前32位
我正在使用乘法(加上其他操作)作为整数划分的替代.我的解决方案最终要求我将2个32位数字乘在一起,并取得前32位(就像Mulhi功能一样),但是AVX2不提供_mm256_mulhi_epu16的32位变体(例如:没有'_mmm256_mulhi_epu32'函数). 我尝试了各种方法,例如检查AVX512的功能,甚至操纵32位整数为2个HI/LO 16位整数.我对使用低级编程的新手很新,所以我不知道什么是最佳的,甚至可能是可能的. 解决方案 这可以通过以下操作来完成: __m256i t1 = _mm256_mul_epu32(m, n); t1 = _mm256_srli_epi64(t1, 32);
6 2023-12-15
编程技术问答社区
为什么需要内存对齐?
我知道这个问题已被问到一千次,我已经阅读了每个答案,但我仍然没有得到.我的RAM模型可能有一些根本错误,这使我无法理解任何答案. 我从互联网上获得了所有这些小信息,但我只是无法连接它们. 这是我认为到目前为止所知道的:以IA-32体系结构为例,具有32位的单词边界(边界= CPU可以从内存中读取的最大值?).它始终以其单词边界读取. 1)那么,无论我提供什么地址,它总是会读取4个字节吗?如果我在地址x上有一个简单的字符,该怎么办.它会从该地址读取4个字节,然后做一些奇怪的事情才能获得一个字节? 2)如果是这样,那么一个字符串(一个char序列)n_chars * 4字节大吗?我很确定不是那样,但是我应该如何解释"总是会读其单词边界"? 3)内存对齐似乎仅带来数据结构.为什么?内存的其余部分是否不对齐?我的意思是物理,虚拟,内核空间等? 4)为什么我只能将32位值存储在可分配为4的地址上?我的意思是我知道它最终只会读32位,但是为什么它不能从一个奇数地址
0 2023-12-15
编程技术问答社区
堆栈框架是如何以及何时建立的?
我目前正在阅读有关利用Linux下的内存漏洞的信息,我发现很难找到有关何时确定堆栈帧布局的任何信息.换句话说,是在编译时间,程序执行之前确定的,还是在调用函数时构建的内容?操作系统之间的布局是否有所不同? 解决方案 有几个因素.在x86上,有一个调用惯例定义了如何调用函数.我认为其他体系结构也有类似的东西.系统库(例如GLIBC)可以定义其他约定.但是最终,编译器决定它是如何使用堆栈的 - 至少在它不需要连接外部库且需要遵循其堆栈layout时. 其他解决方案 我怀疑您通常会或很容易找到有关堆栈框架的设计答案.正如其他人所观察到的那样,记录的是该设计过程的结果,通常没有很多相关的理由,我同意这很有趣. 堆栈框架布局的每种设计都来自设计编译器或一组可互操作的编译器,用于特定处理器架构,甚至针对特定的操作系统.这将受到从呼叫者访问信息(参数?词汇范围?)的子例程所需的影响,哪些指令集可以很好(很多寄存器?易于推动论证?),编译器的优势或缺点等.例如,随着编译器和X86的
8 2023-12-15
编程技术问答社区
堆栈内有什么?
如果我运行程序,就像 一样 #include int main(int argc, char *argv[], char *env[]) { printf("My references are at %p, %p, %p\n", &argc, &argv, &env); } 我们可以看到这些区域实际上在堆栈中. 但是还有什么?如果我们在Linux 3.5.3中的所有值(例如,直到Segfault)中进行了循环,我们可以看到一些奇怪的数字和两个区域,并由一堆零隔开,也许试图防止覆盖环境变量变量偶然. 无论如何,在第一个区域中必须有很多数字,例如每个功能调用的所有帧. 我们如何区分每个帧的末端,参数所在的位置,金丝雀如果添加了一个,返回地址,CPU状态等? 解决方案 堆栈的内容基本上是: 无论操作系统都传递到程序. 呼叫帧(也称为堆栈帧,激活区域,...) 操作系统将传递给程序什么?典型的 *nix将通过环境,对程序的争论,可
2 2023-12-15
编程技术问答社区
缓存一致性的意义何在?
在X86之类的CPU上,它提供了缓存相干性,从实际角度来看,这有用?我知道,这个想法是在所有其他内核上立即在一个核心上完成内存更新.这是一个有用的属性.但是,如果不用汇编语言编写,则不能太依赖它,因为编译器可以在寄存器中存储变量分配,并且切勿将其写入内存.这意味着仍然必须采取明确的步骤,以确保在当前线程中可以看到其他线程中完成的工作.因此,从实际的角度来看,加速相干性达到了什么? 解决方案 想象您要这样做: lock(); //some synchronization primitive e.g. a semaphore/mutex globalint = somevalue; unlock(); 如果没有缓存连贯性,那么最后unlock()将不得不确保globalint现在到处都是可见的,而Cache Cooherance您需要做的就是将其写入内存并让硬件做魔术.一种软件解决方案将保持存在哪种内存,其中缓存,哪些内核以及某种程度上确保它们在原子上是同步的. ,如
12 2023-12-15
编程技术问答社区
在x86上独占访问L1高速缓存线?
如果一个人有一个64个字节缓冲区,该字节缓冲区大量读/写入,则很可能将其保存在L1中;但是有什么方法可以强迫这种行为? 如所示,给予对这64个字节的一个核心独家访问,并告诉它不要与其他内核或内存控制器同步数据,以便这些64个字节始终存在于一个核心的L1中,无论CPU是否认为它是否是经常使用. 解决方案 否,x86不允许您这样做.您可以使用clfushopt驱逐驱逐,也可以(在即将到来的CPU上)仅以clwb驱逐的方式写下,但是您不能在缓存或禁用连贯性中固定一条线. 您可以将整个CPU(或单个核心?)放入Cache-As-Ram(又名无填充)模式中,以禁用与内存控制器的同步,并禁用曾经写回数据. cache-as-as-ram(无填充模式)可执行代码 .在配置内存控制器之前,BIOS/固件通常在早期启动中使用.它不能以每条为基础可用,几乎可以肯定在这里实际上没有用.有趣的事实:离开此模式是我不确定无填充模式是否会阻止从L1D到L3的驱逐或其他方式;或者,如果数据仅在驱逐
10 2023-12-15
编程技术问答社区
LWARX和STWCX的x86等价物
我正在寻找相当于lwarx和stwcx(在PowerPC处理器上找到的)或在X86平台上实现类似功能的方法.另外,在哪里可以找到有关此类事情的最佳场所(即,用于锁定/无需锁定编程的好文章/网站/论坛). 编辑 我认为我可能需要提供更多细节,因为假设我只是在寻找CAS(比较和交换)操作.我要做的是用智能指针实现一个无锁的参考计数系统,这些系统可以通过多个线程访问和更改.我基本上需要一种在x86处理器上实现以下功能的方法. int* IncrementAndRetrieve(int **ptr) { int val; int *pval; do { // fetch the pointer to the value pval = *ptr; // if its NULL, then just return NULL, the smart pointer // will then become NULL as well i
8 2023-12-15
编程技术问答社区
为什么Linux不通过TSS使用硬件上下文切换?
我阅读以下语句: x86体系结构包括 特定段类型称为任务 州段(TSS),存储硬件 上下文.虽然Linux不使用 硬件上下文开关,这是 尽管如此,被迫为 系统中的每个不同CPU. 我想知道: 为什么Linux不将硬件支持用于上下文开关? 硬件方法不是比软件方法快得多吗? 是否有任何操作系统可以利用硬件上下文开关? Windows使用它吗? 终于一如既往地感谢您的耐心和回复. -----------添加----------------- 在 像我一样困惑的人可以看一下. 8^) 解决方案 X86 TSS对于硬件多任务处理非常慢,与软件任务切换相比,几乎没有好处. (实际上,我认为手动击败TSS很多次) TSS也以烦人和繁琐的工作而闻名,即使是x86-64也不是便携式的. Linux旨在处理多个体系结构,因此他们可能选择使用软件任务切换,因为它可以独立于机器的方式编写.此外,软件任务切换在可以完成的工作方面提供了更多的功能,并且通常比TSS
0 2023-12-15
编程技术问答社区
当不同的CPU核心在没有同步的情况下向同一个RAM地址写入时会发生什么?
让我们假设2个核心正在尝试在同一时间(Plus-Minus ETA)(plus-Minus eTA)中写下不同的值(1个字节),而无需使用任何互锁指令或内存屏障.在这种情况下会发生什么,将写什么价值给主RAM?第一个获胜?最后一个获胜?不确定的行为? 解决方案 x86(像其他所有主流SMP CPU架构一样)具有 硬件施加了订单(通过某些实施特定的机制,以防两种所有权请求在同一时钟周期中从不同的内核到达).在大多数现代X86 CPU中,第一家商店不会写信给RAM,因为有一个共享的书面l3缓存可以吸收连贯性流量而无需记忆. 在全球顺序中两个商店后出现的负载都将看到存储的值存储的值第二. . (我假设我们正在谈论正常的(而不是NT)商店到可缓存的内存区域(WB,USWC,UC,甚至WT).但是,无论哪种情况,基本思想都是相同的; 一家商店将首先出现,下一个商店将踩到.如果碰巧在全球订单中遇到负载,则可以暂时观察到第一家商店的数据硬件选择第二次是长期效果. 我们正在谈
4 2023-12-15
编程技术问答社区
如何在WinMobile6上启用ARMv6非对齐访问?
ARMV6引入了一个很棒的功能 - 不一致的内存访问,这使得代码中的某些内容更加简单,更快.但是微软仅在Wince6中提供API.现在,大多数PDA基于Winmobile6(CE 5.X上).默认情况下禁用了未对准的访问:( 我尝试在CP15寄存器中设置未对齐的标志,但这不起作用 - 我在读取不规则的数据时崩溃了. 是否有可能在Winmobile6上启用非对齐的访问? 编辑:我找到了该工具,它可以启用不重对的访问,但是我想从代码中打开/关闭它.是 nueadvancedprocessor . 解决方案 有一个未对齐的访问标志(CP15控制寄存器中的U位),还有一个对齐故障检查器(位).确保您拥有正确的组合.特别是,如果设置了一些位,那么即使您的u上有u,所有未对齐的访问都会导致数据中断.请查看有关此的ARM文档 - 全部可用,网址为 http://www.arm.com .. 特别是,您需要A2.8.2节" ARMV6系统中的非对齐数据访问"中的ARM体系结构参考
2 2023-12-08
编程技术问答社区