标签: low-level

Python中的逐位减法

这是昨天我的问题的后续行动:

CMS慷慨地提供了使用按位运算符在C中添加两个数字的示例:

#include<stdio.h>

int add(int x, int y) {
    int a, b;
    do {
        a = x & y;
        b = x ^ y;
        x = a << 1;
        y = b;
    } while (a);
    return b;
}

int main( void ){
    printf( "6 + 3 = %d", add(6,3));
    printf( "6 - 3 = %d", add(6,-3));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,然后我将它移植到Python,如下所示:

def add(x, y):
    while True:
        a = x & y
        b = x ^ y
        x = a …
Run Code Online (Sandbox Code Playgroud)

python low-level

8
推荐指数
2
解决办法
4736
查看次数

CPU如何实现MUL/MULT等指令?

在不同的汇编语言中,MUL(x86)/ MULT(mips)指的是乘法.这是程序员的黑盒子.我感兴趣的是,无论架构如何,CPU实际上如何实现乘法.假设我的寄存器中有两个16位值,而且我是cpu,所以我必须使用其他的bit-fiddling指令实现MUL(和,或者,xor,not,shl,shr等).我该怎么办?

cpu assembly boolean low-level digital-logic

8
推荐指数
1
解决办法
4474
查看次数

分配延迟似乎很高,为什么?

我有一个在低延迟环境中运行的(java)应用程序,它通常处理大约600微米(+/- 100)的指令.当然,随着我们进一步进入微秒空间,您看到的成本延迟会发生变化,现在我们已经注意到2/3的时间用于分配2个核心域对象.

基准测试已将代码的违规部分与现有引用中的对象构造完全隔离,即基本上是一组引用(每个类中约15个)和一些新的列表,但请参阅下面关于确切测量的内容的注释这里.

每个人一直需要~100微米,这对我来说是莫名其妙的,我试图找出原因.一个快速的基准测试表明,一个类似大小的对象充满了字符串需要大约2-3微米到新的,显然这种基准充满了困难,但认为它可能是有用的基线.

这里有2个Q.

  • 如何调查这种行为?
  • 缓慢分配的解释是什么?

请注意,所涉及的硬件是Sun X4600上的Solaris 10 x86,带有8*双核opteron @ 3.2GHz

我们看过的东西包括

  • 检查PrintTLAB统计信息,显示一些缓慢的分配,因此不存在争用.
  • PrintCompilation建议这些代码中的一个不是JIT友好的,虽然Solaris似乎在这里有一些不寻常的行为(即对现代的linux,没有与solaris10类似的老式的Linux现在就可以进行替换)
  • LogCompilation ...有点难以解析,至少可以说这是一项持续的工作,到目前为止还没有什么明显的
  • JVM版本...在6u6和6u14中保持一致,尚未尝试过6u18或最新版本7

任何和所有的想法赞赏

关于各种帖子的评论摘要,试图让事情更清楚

  • 我测量的成本是创造,它通过生成器(像一个内置对象的总成本这些),其私人构造函数调用新的ArrayList几次以及对现有对象设置引用.测量的成本包括设置构建器的成本以及构建器到域对象的转换
  • 编译(通过热点)有明显的影响,但它仍然相对较慢(在这种情况下编译从100micros到~60)
  • 在我的天真基准测试中编译(通过热点)需要将分配时间从~2micros降低到~300ns
  • 延迟不会因年轻的收集算法(ParNew或平行清除)而有所不同

java latency allocation jvm-hotspot low-level

8
推荐指数
1
解决办法
528
查看次数

为什么会有这么多不同的调用约定?

从历史上看,为什么它似乎只是关于每个人和他们的孩子兄弟定义他们自己的呼叫惯例?你有C,C++,Windows,Pascal,Fortran,Fastcall以及其他可能没有提及的其他人.对于绝大多数用例,一项公约不应该是最有效的吗?是否有任何理由更喜欢一个而不是另一个?

assembly history calling-convention low-level

8
推荐指数
1
解决办法
366
查看次数

为什么函数调用而不是变量地址用于检测堆栈增长方向?

我读到了检测堆栈增长检测问题的不同响应,我理解,在现代架构中,堆栈可能会随机增长,可能会在堆外创建,依此类推.

但是,在这个经典的访谈问题中,我想了解为什么人们使用函数调用而不是在同一函数中比较2个局部变量.我认为必须有一些特殊的理由这样做,但不是一个C /低级开发人员[Java :)],我只是在猜测.

这是我试过的代码:

void sub (int *a)  {
    int b;
    int c;
    printf ("a:%d\n", a);
    printf ("b:%d\n", &b);
    printf ("c:%d\n", &c);
    if (&b > a) {
        printf ("Stack grows up.\n");
    } else {
        printf ("Stack grows down.\n");
    }
}

int main (void) {
    int a;
    int b;
    sub (&a);
    printf ("\nHere we go again!!\n");
    if (&b > &a)  {
        printf ("Stack grows up.\n");
    } else  {
        printf ("Stack grows down.\n");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我还发现这篇文章试图优化我不理解的解决方案:http …

c c++ stack low-level

8
推荐指数
3
解决办法
617
查看次数

晶体管级别的"if"语句是什么?

我最近参加了数字逻辑课程并学习了所有关于AND,OR和其他各种逻辑的知识.我们没有涉及的一件事,对编程来说是完全必要的,是if陈述,让我对他们的工作方式感到好奇.

我最好的猜测是它只是一个2:1的多路复用器,当你添加更多else语句时,它会变成4:1和8:1,但对于这样一个简单的概念来说,这似乎有点过于复杂.

任何人都知道一个if声明实际上转化为什么?

logic if-statement low-level

8
推荐指数
1
解决办法
2141
查看次数

视力障碍者如何处理启动失败和其他低级别环境

我知道屏幕阅读器和类似的软件可以帮助盲人和视障人士在Windows或其他操作系统中使用计算机.

我很好奇在较低级别的环境中可以获得哪些支持,例如OS安装程序和BIOS设置等.

boot accessibility blindness low-level

7
推荐指数
1
解决办法
279
查看次数

困惑于内存映射

我最近开始进入低级别的东西,并研究引导加载程序和操作系统等...

据我了解,至少对于ARM处理器,外围设备由引导加载程序初始化,然后映射到物理内存空间.从这里开始,代码只需将值写入映射到外设寄存器的存储空间即可访问外设.稍后,如果芯片具有MMU,则可以将其用于进一步重新映射到虚拟存储器空间.我对吗?

我不明白的是(假设我上面说的是正确的):

  • 如果外围设备尚未映射到地址空间,引导加载程序如何初始化?
  • 通过虚拟内存映射,有一些表可以告诉MMU在哪里映射什么.但是什么决定了外围设备在物理内存中的映射位置?

memory arm low-level

7
推荐指数
1
解决办法
6562
查看次数

如何在 Linux 终端上进行按键检测,python 中的低级样式

我刚刚在 python 中实现了一个 Linux 命令外壳,仅使用os库的低级系统调用,诸如此类fork()

我想知道如何实现一个键侦听器,该侦听器将侦听键 (UP|DOWN) 以滚动浏览我的 shell 的历史记录。

我想在不使用任何花哨的库的情况下做到这一点,但我也希望这不是超级复杂的事情。到目前为止,我的代码只有大约 100 行代码,我不想为了获得一个简单的功能而创建一个怪物:D

我对这个问题的想法是,应该可以创建一个带有某种循环的子进程,它将侦听 up^[[A和 down ^[[B,按键,然后以某种方式将文本放入我的输入字段,就像一个普通终端。

到目前为止,我最感兴趣的是 key-listener 的可能性。但接下来我可能必须弄清楚如何将该文本输入到输入字段中。关于这一点,我想我可能必须使用提供的一些stdin功能sys

我只对让它在 Linux 上运行感兴趣,并希望继续使用低级系统调用,最好不是为我处理所有事情的 Python 库。这是一个学习练习。

python linux keypress low-level python-os

7
推荐指数
1
解决办法
866
查看次数

清理静态独立 nolibc 程序?

我正在为 Linux 开发一个静态独立的 nolibc/nostdlib 程序,并希望使用 C 编译器的内存、地址和未定义行为清理程序来改进我的代码。

当我尝试时,我无法让它工作:

clang -static -ffreestanding -nostdlib -fno-omit-frame-pointer -fsanitize=undefined -g -o program program.c
Run Code Online (Sandbox Code Playgroud)

这会导致编译器发出调用诸如__ubsan_handle_type_mismatch_v1@plt. 它编译和链接成功,但程序在运行时在这些引用附近出现段错误。更具体地说,在我的内存分配器中:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) up
(gdb) disas
Dump of assembler code for function lone_reallocate:
...
   0x00000000002116d0 <+160>:   bl      0x206470 <__ubsan_handle_pointer_overflow@plt>
=> 0x00000000002116d4 <+164>:   b       0x2116d8 <lone_reallocate+168>
   0x00000000002116d8 <+168>:   ldur    x8, [x29, #-72]
...
Run Code Online (Sandbox Code Playgroud)

我认为这些函数由于缺乏 libc 支持而丢失。当我尝试使用该-static-libsan选项时,出现许多未定义的符号错误:

error: undefined symbol: __aarch64_cas8_acq_rel
error: undefined symbol: pthread_self
error: undefined symbol: dl_iterate_phdr
error: …
Run Code Online (Sandbox Code Playgroud)

c low-level sanitizer freestanding address-sanitizer

7
推荐指数
0
解决办法
202
查看次数