小编Cha*_*Kim的帖子

第一次运行 qemu,vnc 查看器不会自动打开

最近我下载了 qemu,然后运行了 configure、make 和 make install。当我跑

qemu-system-sparc linux-0.2.img
Run Code Online (Sandbox Code Playgroud)

我只看到下面的一条消息

运行在`::1:5900'上的VNC服务器

在这种状态下,当我通过键入 打开 vncviewer 窗口时vncviewer :5900,我会看到该窗口。
窗口显示仿真屏幕

欢迎使用 2014 年 3 月 10 日 08:41 构建的 OpenBIOS v1.1 输入
“帮助”以获取详细信息
尝试磁盘...
加载或初始化程序未设置有效状态
0>

如何让 vnc 窗口自动出现?以及如何提供正确的 linux 映像?
当我构建我的 linux 映像时,我可以获得 sImage.elf 或 sImage.bin 也包含文件系统。

vnc qemu

5
推荐指数
1
解决办法
5729
查看次数

Makefile 中目标先决条件行中的两个冒号

在 busybox Makefile 中,我看到

.tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S scripts FORCE
        $(call if_changed_dep,as_o_S)
Run Code Online (Sandbox Code Playgroud)

为什么规则中有两个冒号?这是什么意思?

makefile gnu-make busybox

5
推荐指数
0
解决办法
1371
查看次数

从应用程序传递到qemu的CPU写入值很奇怪

我试图使用QEMU在sparc虚拟机上运行RTEMS(实时操作系统)应用程序.我几乎在那里,我几小时前就已经看过了.但在删除一些打印后,它无法正常工作,后来我发现它不是因为已删除的打印件.RTEMS映像和QEMU仿真模型之间没有正确传递数据.(我正在使用QEMU版本1.5.50和借用QEMU版本2.0.0的lan9118.c模型.我稍微修改了lan9118.)
在QEMU模型,内存区域ops定义为

struct MemoryRegionOps {
    /* Read from the memory region. @addr is relative to @mr; @size is
     * in bytes. */
    uint64_t (*read)(void *opaque,
                     hwaddr addr,
                     unsigned size);
    /* Write to the memory region. @addr is relative to @mr; @size is
     * in bytes. */
    void (*write)(void *opaque,
                  hwaddr addr,
                  uint64_t data,
                  unsigned size);
...
}
Run Code Online (Sandbox Code Playgroud)

在RTEMS应用程序中,我写的设备就像

        *TX_FIFO_PORT = cmdA;
        *TX_FIFO_PORT = cmdB;
Run Code Online (Sandbox Code Playgroud)

其中TX_FIFO_PORT的定义如下.

#define TX_FIFO_PORT                    (volatile ulong *)(SMSC9118_BASE + 0x20)
Run Code Online (Sandbox Code Playgroud)

但是当我写作时,

cmdA : 0x2a300200 and cmdB : 0x2a002a00, …
Run Code Online (Sandbox Code Playgroud)

c pointers qemu volatile endianness

5
推荐指数
1
解决办法
246
查看次数

如何在 C 中以十六进制字节格式打印浮点数?

我想查看 IEEE754 格式表示形式的浮点值 3.14159265。于是写了这段测试代码。

#include <stdio.h>

main()
{
int i;
float a = 3.141592654;

printf("a = %f\n", a);

// print test 1
printf("test 1 : a = %x\n", a);
printf("test 1 2nd time : a = %x\n", a);

// print test 2
char *pt = (char *)&a;
printf("test 2 :\n");
for(i=0;i<4;i++){
    printf("%x ", (char)(*pt++));
}
printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

当我运行它几次时,它显示如下:

ckim@stph45:~/test5] test
a = 3.141593
test 1 : a = e0cd2000
test 1 2nd time : a = e0cd2000
test 2 : …
Run Code Online (Sandbox Code Playgroud)

c floating-point printf

5
推荐指数
1
解决办法
2万
查看次数

numpy.astype(np.uint8) 如何转换浮点数组?-1.2997805 变成 255

这是 ipython3 中的执行

In [81]: r2
Out[81]: 
array([-1.2997805, -1.4251276, -1.3047135, ..., -2.0358603, -1.9741256,
       -1.6412157], dtype=float32)

In [82]: r2.astype(np.uint8)
Out[82]: array([255, 255, 255, ..., 254, 255, 255], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)

-1.2997805 如何转换为 255?

添加:从下面的评论(谢谢),我这样测试。看起来 float 已转换为 int,并且模 255(将其读取为 unsigned int8)已完成。

is first convereted to int. and the it is cut using modulo(%).  
In [98]: b
Out[98]: array([-1.,  0.,  1.])

In [99]: b.astype(np.uint8)
Out[99]: array([255,   0,   1], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)

python numpy python-3.5

5
推荐指数
1
解决办法
2万
查看次数

Arm链接器在函数调用中使用的“胶合板”是什么?

我刚刚阅读了https://www.keil.com/support/man/docs/armlink/armlink_pge1406301797482.htm。但无法理解arm链接器在函数调用之间插入的胶合板是什么。

在“ARM 架构的过程调用标准”文档中,它说:

5.3.1.1 链接器对 IP 的使用 ARM 和 Thumb 状态 BL 指令都无法寻址完整的 32 位地址空间,因此链接器可能需要在调用例程和被调用例程之间插入一个胶合板。子程序。还可能需要胶合板来支持 ARM-Thumb 互操作或动态链接。插入的任何单板必须保留除 IP (r12) 和条件代码标志之外的所有寄存器的内容;符合要求的程序必须假设可以在任何支持互操作或长分支的重定位的分支指令处插入更改 IP 的胶合代码。注意 R_ARM_CALL、R_ARM_JUMP24、R_ARM_PC24、R_ARM_THM_CALL、R_ARM_THM_JUMP24 和 R_ARM_THM_JUMP19 是具有此属性的 ELF 重定位类型的示例。请参阅 [AAELF] 了解完整详细信息

这是我的猜测,是这样的吗?:当函数 A 调用函数 B 时,并且当这两个函数相距太远而命令bl无法表达时,链接器会在函数 A 和 B 之间插入函数 C,使得函数 C 靠近函数 B。现在函数 A 使用b指令转到函数C(在函数调用之间复制所有寄存器),并且函数C使用bl指令(也复制所有寄存器)。当然r12寄存器是用来保存剩余的长跳转地址位的。这就是贴面的意思吗?(我不知道为什么arm不解释veneer是什么,而只解释veneer提供了什么..)

c arm function eabi

5
推荐指数
1
解决办法
3592
查看次数

绘制简单图形的最简单的python代码是什么(比matlab更简单)

如果我想在Matlab中从0到9绘制ay = x ^ 2图,我可以做

a = [0:1:10]
b = a.^2
plot(a,b)
Run Code Online (Sandbox Code Playgroud)

使用python,我可以像下面一样

import matplotlib.pyplot as plt
import numpy as np

a=[x for x in xrange(10)]
b=np.square(a)
plt.plot(a,b)
plt.show()
Run Code Online (Sandbox Code Playgroud)

但是与我认为python代码更简单的相反,这需要使用matlab的更多行。(我猜想python试图使事物变轻,因此我们在实际需要它们时需要导入事物,因此需要更多行。)我可以使上面的python代码更简单(我的意思是更短)吗?

编辑:我知道处理时间无关紧要,但是我只是很好奇代码可以变短。

python matlab plot matplotlib

4
推荐指数
1
解决办法
1万
查看次数

从 5.4.21 切换到 5.10.0-rc5 后,模块构建中出现“struct mm_struct”没有名为“mmap_sem”的成员错误

我一直在我的 Linux 设备驱动程序中使用这个函数。这是为了将用户页面固定为用户虚拟地址(所需的页面数量)并获取其内核地址。顺便说一下,它是在linux-5.4.21中使用的。(我认为这个方法可能有一些问题。但它有效,所以我正在使用它)

static unsigned long uvirt_to_kvirt_ppin(unsigned long uvirt, unsigned long length, struct page *pages)
{
    int res;
    int offs;
    uint64_t *kvpaddr;
    uint64_t kvaddr;
    uint64_t paddr;

    offs = uvirt % PAGE_SIZE;
    down_read(&current->mm->mmap_sem);
    res = get_user_pages( uvirt, length>>PAGE_SHIFT, FOLL_WRITE, &pages, NULL);
    if (res) {
        kvpaddr = kmap(pages);
        kvaddr = ((unsigned long long int)(kvpaddr)+offs);
        paddr = page_to_phys(pages) + offs;
    }
    else {
        printk("get_user_pages failed! res = %x\n", res);
        return -1;
    }
    up_read(&current->mm->mmap_sem);
    return kvaddr;
}
Run Code Online (Sandbox Code Playgroud)

但是今天,当我尝试针对内核 5.10.0-rc5 构建模块时,我遇到了此错误消息。这意味着随着内核的升级,mm_struct 结构发生了变化。

/home/ckim/prj/abdsn/ab21sim/ab21tsim/QEMU/qemu_test/test_ldd_vanila/axpu_ldd_kc.c: In function …
Run Code Online (Sandbox Code Playgroud)

c memory-management linux-device-driver linux-kernel

4
推荐指数
1
解决办法
3095
查看次数

在Python中公开C++类(只能加载ET_DYN和ET_EXEC)

我在这里看看如何向Python公开c ++.我已经构建了Python深度学习代码,它使用boost-python连接c ++和python,它运行正常,所以我的系统有boost-python alread设置的东西.这里是我的HELLO.CPP代码(我曾经WorldC和WorldP清楚地显示在声明中C++和Python的类名称的使用.我不知道为什么原始网页使用相同的类名World引起混乱初学者. )

#include <boost/python.hpp>
using namespace boost::python;

struct WorldC
{
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    std::string msg;
};

BOOST_PYTHON_MODULE(hello)
{
    class_<WorldC>("WorldP")
        .def("greet", &WorldC::greet)
        .def("set", &WorldC::set)
    ;
}
Run Code Online (Sandbox Code Playgroud)

这就是我打招呼的方式.所以

g++ -shared -c -o hello.so -fPIC hello.cpp -lboostpython -lpython2.7 -I/usr/local/include/python2.7
Run Code Online (Sandbox Code Playgroud)

当我在python中运行import hello时,它给了我这个错误.

>>> import hello
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./hello.so: only ET_DYN and ET_EXEC can be loaded
Run Code Online (Sandbox Code Playgroud)

谁能告诉我什么是错的? …

python boost

3
推荐指数
1
解决办法
3023
查看次数

我该如何回忆起先前命令的参数?(在csh和bash中?)

我通常使用csh(实际上,我的/ bin / csh链接到tcsh,这是csh的改进版本),并且经常!$用来指代最后一个命令的最后一个参数。
但是有时我想使用上two一个命令的最后一个参数。我怎样才能做到这一点?我想我可以访问任何先前命令的参数。

我已经阅读了如何回忆上一个bash命令的参数?但找不到答案。我们如何引用上一个命令的倒数第二个参数?

例如,如果我给了echo Tiger Rabbit,我如何在以下命令中引用Tiger?最好的答案是csh,但我也对bash情况感到好奇。

bash csh tcsh

3
推荐指数
1
解决办法
1176
查看次数