环境准备

WSL2 作为上位机

识别 Windows 11 Host 的 USB Serial Device

分别在 Windows 11 上安装 usbipd-win, 在 WSL2 上安装 user space tools for USB/IP

1
2
3
4
5
6
7
Microsoft Windows [版本 10.0.22621.1702]
(c) Microsoft Corporation。保留所有权利。

C:\Windows\System32>usbipd wsl list
BUSID VID:PID DEVICE STATE
1-9 046d:c534 USB 输入设备 Not attached
1-13 04e2:1410 USB 串行设备 (COM4) Not attached

WSL2 Ubuntu-20.04 创建 /dev/ttyUSB0

1
2
3
4
5
6
7
8
9
10
11
[Thu Jun 15 19:19:44 2023] vhci_hcd vhci_hcd.0: pdev(0) rhport(0) sockfd(3)
[Thu Jun 15 19:19:44 2023] vhci_hcd vhci_hcd.0: devid(65546) speed(2) speed_str(full-speed)
[Thu Jun 15 19:19:44 2023] vhci_hcd vhci_hcd.0: Device attached
[Thu Jun 15 19:19:45 2023] vhci_hcd: vhci_device speed not set
[Thu Jun 15 19:19:45 2023] usb 1-1: new full-speed USB device number 2 using vhci_hcd
[Thu Jun 15 19:19:45 2023] vhci_hcd: vhci_device speed not set
[Thu Jun 15 19:19:45 2023] usb 1-1: SetAddress Request (2) to port 0
[Thu Jun 15 19:19:45 2023] usb 1-1: New USB device found, idVendor=04e2, idProduct=1410, bcdDevice= 0.03
[Thu Jun 15 19:19:45 2023] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[Thu Jun 15 19:19:45 2023] xr_serial 1-1:1.0: xr_serial converter detected
[Thu Jun 15 19:19:45 2023] usb 1-1: xr_serial converter now attached to ttyUSB0

Recovery 模式应该连接哪个 Type-C (USB SERIAL) 接口

HiKey970 有两个 Type-C 接口,而且当板子被设置为 Recovery 模式时,两个接口均会被识别为“串口”。在左手边的 (J3101) 是用来访问 Debug UART 的,而在 HDMI 和 USB 中间的那个(J1801)是在 Recovery 模式下使用的。而且这两个接口是两个不同厂家提供的芯片,使用完全不同的内核驱动模块

USB-to-Serial on Hikey970

  • 前者(J3101):
    Bus 001 Device 003: ID 04e2:1410 Exar Corp. XR21V1410 USB-UART IC

Select CONFIG_USB_SERIAL_XR on WSL2 Kernal config

  • 后者(J1801):
    Bus 001 Device 002: ID 12d1:3609 Huawei Technologies Co., Ltd. USB SER

Select CONFIG_USB_SERIAL_OPTION on WSL2 Kernal config

参考

1. HiKey970 官方文档
2. usbipd-win github issues

系统调用是 Linux 用户态程序与内核通信的接口。 每个特定的文件系统都会在自己的 file_operations 里提供各种文件操作接口,像 .open, .close, .ioctl。系统调用会通过 VFS 的接口调用这些具体的实现,而对于应用程序来说,一般不会直接使用系统调用,而是调用 C 库函数 (C routines).

ioctl 这个系统调用的声明大概是这样:

1
COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, compat_ulong_t, arg)

ioctl 的 C 库函数 (Aarch64 实现):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
	.text
ENTRY(__ioctl)
/* move ioctl syscall number to x8 register */
mov x8, #__NR_ioctl
/* sign extend w0 to x0 */
sxtw x0, w0
/* issue software interrupt to invoke syscall */
svc #0x0
/* add 4095 to x0 and set flags according to result */
cmn x0, #4095
/* if carry bit is set (previous addition carrys out), branch to Lsyscall_error */
b.cs .Lsyscall_error
ret
PSEUDO_END (__ioctl)

/* symbol management, making __ioctl and ioctl effectively the same function */
libc_hidden_def (__ioctl)
weak_alias (__ioctl, ioctl)
Read more »

CONFIG_DEBUG_FS

如何在 WSL2 上启用 debugfs

确认下内核是否开启了 debugfs

1
zcat /proc/config.gz | grep CONFIG_DEBUG_FS

要想使用 debugfs,首先要挂载它到 /sys/kernel/debug

1
mount -t debugfs none /sys/kernel/debug/
Read more »

Gamma LUT property

Gamma LUT (Look-Up Table) is a property that is used to correct the color and brightness of an image or video. Gamma LUT is basically a table of values that is used to map input values to output values, for example, it may map low input values to higher output values to brighten the image.

Gamma LUT is used to adjust the gamma curve of an image or video, which means it can be used to correct the brightness and contrast of an image. This property is commonly used in image and video processing applications, such as photo editing software, video editing software, and color grading tools.

Gamma LUT can also be used to correct color shifts caused by different lighting conditions or camera settings. By adjusting the gamma curve of an image or video, it is possible to create a more natural and accurate representation of the original scene.

Read more »

Linux 内核的 patch 是以纯文本的邮件形式进行提交和代码走查的,而且 patch 是先到内核子系统 maintainer 维护的 git tree, 再到 Linus Torvalds 的 main tree。本文主要是以一个 patch 提交的实例来记录一下整个过程中的一些具体操作要点,至于 kernel patch 提交的规范和操作细节内核文档 和各种博客文章有很多,这里不再赘述。

Read more »

标准

ACPI 是什么?

ACPI是一个开放标准,全称为Advanced Configuration and Power Interface(高级配置与电源接口)。它是一种用于电源管理和配置硬件设备的接口规范。

ACPI的主要目的是提供一种标准化的方法,使操作系统能够与计算机的固件(如BIOS)进行交互,管理电源管理、设备配置和系统资源的一致性。它定义了一组操作系统接口和数据结构,用于控制和监测硬件设备的电源状态、配置和事件。

通过ACPI,操作系统能够实现电源管理的功能,如系统的睡眠、休眠和唤醒,以及动态调整设备的功耗和性能。它还提供了高级功能,包括热插拔设备的支持、温度传感器的监测以及处理器性能的调整。

ACPI存在于大多数现代计算机系统中,并得到广泛支持。它在各种操作系统中广泛使用,包括Windows、Linux、Apple macOS等。通过ACPI,计算机系统能够更好地管理电源和硬件资源,实现能效和性能的平衡,提供更好的用户体验。

UEFI GOP 是什么?

UEFI GOP 是 UEFI(统一可扩展固件接口)中的一个图形输出协议。它提供了在 UEFI 环境下进行图形输出的标准接口。

UEFI GOP 的主要功能包括:

  • 提供图形模式设置、获取当前图形模式等图形初始化相关功能。

  • 提供绘制像素、填充矩形、绘制线条等基本图形输出功能。

  • 提供双缓冲区切换、视口管理等高级图形功能。

  • 支持各种颜色格式如 RGB、YUV 等。

  • 提供与硬件无关的抽象接口,通过 GOP 驱动与特定硬件交互。

  • 支持全屏和窗口两种输出模式。

  • 支持各种分辨率的图形输出。

通过使用 UEFI GOP,操作系统和应用可以在 UEFI 阶段实现图形界面和图形输出,如启动菜单、系统配置界面等。许多操作系统的启动器都会使用 GOP 进行图形化显示。

所以简单来说,UEFI GOP 为 UEFI 固件和操作系统提供了标准的图形输出接口,使其可以实现固件过程中的图形化显示和交互。它是实现 UEFI 图形环境的基础。

HSA 是什么?

HSA(Heterogeneous System Architecture) 是一种异构系统架构,用于在CPU和GPU等异构处理器之间进行并行计算。其主要特点包括:

  • 协处理器架构:HSA定义了主处理器(CPU)和协处理器(GPU等)之间的关系,协处理器协助CPU完成计算任务。

  • 统一地址空间:CPU和协处理器共享同一个虚拟地址空间,可以直接访问对方的内存。

  • 协作计算模型:支持CPU和协处理器之间的并行计算,任务可以自动在最合适的处理器上运行。

  • 优化数据传输:通过DMA等机制优化CPU和协处理器之间的数据传输。

  • 标准化程序接口:为开发人员提供标准化的程序接口,简化异构计算的软件设计。

HSA让CPU和GPU之间可以高效协作,优化系统整体的并行计算性能,被认为是未来异构计算架构的发展方向。AMD是HSA的主要推动者,其APU产品已经开始支持HSA。HSA也吸引了其他处理器厂商的广泛支持。

总而言之,HSA是一种创新的异构系统架构,通过处理器协作和优化提升整体计算性能,对高效并行计算有重要意义。

目前支持HSA标准的SoC产品不多,主要有:

  • AMD Kaveri APU:这是AMD于2014年发布的首款HSA 1.0兼容APU,集成CPU和GPU,支持共享虚拟内存。

  • AMD Carrizo APU:2015年发布,同样支持HSA 1.0,并进一步增强了CPU和GPU的协作计算能力。

  • AMD Ryzen APU:如Ryzen 5 2400G,集成Vega graphics,支持共享内存和异构计算。

  • AMD Raven Ridge APU:首款集成Vega图形的Ryzen移动APU,支持HSA。

  • Qualcomm Snapdragon 820:高通在Snapdragon 820平台增加了HSA 1.1支持。

  • 领悟科技(HSA Foundation)Mustang-V100-A10:这是全球首块完全兼容HSA 1.0规范的独立heterogeneous SoC。

  • 领悟科技(HSA Foundation)Mustang-F100-A10:进一步优化的heterogeneous SoC。

总体来说,AMD是目前最主要的HSA支持厂商,其多款APU产品都实现了HSA规范。高通也加入了HSA支持。此外,一些创业公司如领悟科技也推出了支持HSA的SoC。随着规范的逐步完善,预计未来将会有更多的异构SoC产品实现HSA兼容。

我:那么符合 HSA 标准的 APU 与普通的 SoC 有什么区别?

ChatGPT:

符合HSA标准的APU和普通SoC的主要区别有:

  1. 统一地址空间

HSA APU采用统一地址空间,CPU和GPU可以直接访问对方的缓存和内存,简化数据传输。普通SoC的CPU和GPU存在独立的地址空间。

  1. 优化的内存访问

HSA APU支持CPU和GPU直接访问系统内存,无需数据复制,提高效率。普通SoC需要在内存空间之间进行数据复制。

  1. 标准化的程序接口

HSA提供标准化的程序接口如HSAIL,简化异构编程的复杂ity。普通SoC缺乏统一的接口。

  1. 优化的协作计算

HSA APU通过协处理器等机制,可根据workload自动在CPU和GPU间分配任务,调度更优化。普通SoC无法做到如此灵活的协作计算。

  1. 更高效的互联

HSA APU采用高速互联如AMD的Infinity Fabric,提升CPU和GPU之间的数据传输速度。

  1. 更紧密的硬件协作

HSA APU通过硬件级的优化如内存控制器集成,实现更紧密的协作。

综上,HSA APU通过硬件架构和软件接口的优化,实现了CPU与GPU更加紧密、高效的异构计算,相比普通SoC有明显优势。这使其在并行计算性能上有显著提升。

Linux

mmu_notifier vs. mmu_interval_notifier

M: please shed light on the distinction mmu_notifier from mmu_interval_notifier in the linux kernel

C: In the Linux kernel, both MMU notifier and MMU interval notifier are used to track changes in page tables and memory mappings. However, there are some differences between the two:

MMU notifier is used to track changes to page tables and memory mappings, and it is designed to be a general-purpose notifier. It is used by various subsystems in the kernel, such as memory management, file systems, and device drivers.

MMU interval notifier, on the other hand, is used specifically to track changes to a range of memory pages. It is used by subsystems that need to be notified of changes to a particular range of memory pages, such as virtualization subsystems.

In summary, MMU notifier is a more general-purpose notifier used to track changes to page tables and memory mappings, while MMU interval notifier is used specifically to track changes to a range of memory pages.

Read more »

来自 ChatGPT 的解释

What is Vulkan ICD?

Vulkan ICD (Installable Client Driver) is a software component that enables the Vulkan API (Application Programming Interface) to interact with the hardware of a computer system. Vulkan is a low-level graphics API developed by the Khronos Group, which provides developers with more control over hardware resources, leading to improved performance and efficiency in graphics-intensive applications such as video games. The Vulkan ICD is responsible for managing the communication between the Vulkan API and the graphics hardware of a system. It is typically provided by the manufacturer of the graphics card as a driver for the system.

Read more »

Light Display Manager 是一个轻量级的跨桌面环境的 Display Manager, 可以支持多种显示技术,如 X11, Mir, Wayland.

Build

Dependencies

  • 开发包依赖

    • libpam0g-dev
    • libgcrypt20-dev
    • libglib2.0-dev
    • libxklavier-dev
  • 构建工具依赖

    • intltool
    • yelp-tools
    • gtk-doc-tools
  • 安装

Lightdm 可执行程序路径 /usr/sbin/lightdm, 日志默认路径 /var/log/lightdm/lightdm.log. 所以构建时可以使用

  • --prefix 指定安装路径 (默认 /usr/local)
  • --localstatedir 指定日志路径 (默认 $prefix/var/log/lightdm)
  • --sysconfdir 指定 lightdm.conf 路径 (默认 $prefix/etc/lightdm)
1
2
3
./autogen.sh --prefix=/usr --localstatedir=/var --sysconfdir=/etc --disable-tests
make -j $JOBS
sudo make install

Graphics Boot-up

lightdm starts Xorg

Sanitizer 简介

Sanitizer 是一个动态 Bug 检测的工具,它可以检测的 Bug 有以下几类:

  • AddressSanitizer (ASan):
    • use-after-free
    • double-free
    • buffer (heap, stack, and global buffer) overflows
  • MemorySanitizer (MSan): uninitialized memory reads
  • UndefinedBehaviorSanitizer (UBSan)
    • signed integer overflow
    • use-of-null-pointer
    • division by zero
  • ThreadSanitizer: data races, deadlocks
  • LeakSanitizer: memory leaks

参考

[1]Be wise, sanitize: Keeping your C++ code free from bugs
[2]An LLVM developer setup: Modern C++ development tools

0%