下图引自《从头开始编程》一书。
为什么程序内存区域被限制在0xbfffffff和之间0x8048000?这个选择背后的理由是什么?这个区域之外是什么?
这张图说明的应该是一个 32 位的程序。64 位程序的内存布局是什么?
图片中提到了“启动时”,那么在运行过程中布局会发生变化吗?
最后但并非最不重要的一点是,Linux 内核是否也遵循这种布局?
我正在尝试在设备模式下为单个 USB 设备控制器端口添加 uvc 和大容量存储。我正在使用 configfs 来完成工作。
任何人都可以告诉如何做到这一点。
问候, GBiradar
下图包含更改文件夹权限的命令:
我想将 Raspberry Pi 中的权限文件夹更改为r权限,它是/var/www. 它失败并说"chmod: invalid mode: '-R' try chmod :--help to more information"。
我需要在 USB 内核模块中添加一个短暂的延迟,以避免在小型嵌入式 Linux 设备启动时出现极其罕见的内核恐慌。有问题的代码如下。如果我在代码中添加一个 prink,该设备会成功运行一整夜,而之前它曾经失败过。我想添加一个小的延迟,但 usleep_range 和 msleep 会导致内核回溯“在原子时调度”。如何在不睡觉的情况下在这部分代码中添加延迟?是一个while循环来做到这一点吗?
usb_hub_for_each_child(udev, chix, childdev) {
printk(KERN_ERR "r8a66597: Start USB Discover\n");
//usleep_range(10000, 11000);
//preempt_disable();
//msleep(1);
collect_usb_address_map(childdev, map);
//usleep_range(10000, 11000);
printk(KERN_ERR "r8a66597: Stop USB Discover\n");
//msleep(1);
//preempt_enable();
}
Run Code Online (Sandbox Code Playgroud) linux kernel linux-device-driver linux-kernel embedded-linux
我希望 dmesg 在不传递 -T 参数的情况下打印人类可读的日期时间。有没有办法在不设置别名的情况下做到这一点?也许在配置文件中?
dmesg 输出:
# dmesg | tail -1
[ 6.639729] IPv6: enp03: link becomes ready
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我希望 dmesg 打印:
# dmesg | tail -1
[Fri Sep 15 08:15:29 2017] IPv6: enp03: link becomes ready
Run Code Online (Sandbox Code Playgroud) 我正在学习嵌入式系统
我需要从用户空间守护进程和内核空间在控制台上打印调试信息,我使用 printf 作为用户空间,使用 printk(KERN_CRIT) 作为内核空间。
然而,输出混杂成一团乱麻和乱序。我猜 KERN_CRIT 非常快,有什么干净的方法可以完成这项工作吗??非常感谢
有什么影响?内核是用静态库编译的还是内在实现的?
此外,根据this,内核代码不能使用任何浮点运算。这是为什么?
我正在更改文件 /etc/resolv.conf。但是 DNS 正在再次解析为旧 IP,而不是我更新的 IP,我希望避免重新启动服务器。有人可以建议一个解决方法吗?
我将 PIC 的固件(阵列)存储在头文件 (pic_firmware.h) 中。
该阵列由我的定制板的两个 USB Linux 驱动程序使用。
#ifndef PIC_FIRMWARE_H
#define PIC_FIRMWARE_H
const unsigned char ucPICAppsectorFirmware[] =
{
0xa5,0xef,0x2b,0xf0, 0x12,0x00,0x12,0x00, // Address 0x3000
0x81,0xef,0x29,0xf0, 0x12,0x00,0x12,0x00, // Address 0x3008
0x00,0x00,0xff,0xff, 0xff,0xff,0xff,0xff, // Address 0x3010
0xab,0xef,0x29,0xf0, 0x12,0x00,0xff,0xff, // Address 0x3018
....
}
#endif
Run Code Online (Sandbox Code Playgroud)
当我将两个驱动程序添加为内置驱动程序并在两个驱动程序代码中包含头文件(#include“pic_firmware.h”)时,我收到多个定义错误
| drivers/usb/misc/pic_dfu.o:(.rodata+0x80): multiple definition of `ucPICAppsectorFirmware'
| drivers/usb/misc/usb_mib.o:(.rodata+0xcc0): first defined here
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误。谢谢你的时间..
我正在内联系统调用。是的,我知道这是有问题的,但我有充分的理由。我已经大量地追踪了我的错误,我只是问为什么__NR_open在这个 arm64 Arch Linux 系统上消失了?
5.0.1-1-ARCH #1 SMP Sun Mar 10 15:08:34 MDT 2019 aarch64 GNU/Linux
同样,我的代码是内联系统调用。这种内联方法适用于另一个X86_64系统,实际上内联mmap() 也适用于该系统。但是,在此 arm64 Arch Linux 上内联open()失败并显示EFAULT。
追踪我的错误,首先,在这个构建环境中甚至没有定义__NR_open。其次,常规open()调用open64()执行一条svc指令,其中 x8 设置为 #56, __NR_openat。第三,__NR_open通常定义为 5 并且该数字已重新用于__NR_setxattr。这解释了EFAULT。
基本上,open()在这个系统的用户库中被转换成openat()并且__NR_open系统调用已经完全消失,由一个新的系统调用接管。我不明白的是__NR_open是在arm64的规范源中定义的,但不是在这个 Arch Linux arm64 系统上定义的。
我的错误修复很简单:内联openat()代替。但我的问题是为什么删除了这个,为什么这不被认为是从 Linux POV 中破坏的?我在想 Linus 说我们不破坏用户空间! …