xv6_lecture2 C in xv6

经典的一道指针和数组题: 假设 x 的地址为 0x7fffdfbf7f00, 打印出来的值分别是多少? #include <stdio.h> int main() { int x[5]; printf("%p\n", x); printf("%p\n", x+1); printf("%p\n", &x) printf("%p\n", &x+1); return 0; } 0x7fffdfbf7f00 # 打印的数组的地址 0x7fffdfbf7f04 # 打印的是数组第二个元素的地址 0x7fffdfbf7f00 # &x也是数组的地址 0x7fffdfbf7f14 # x + sizeof(x)的地址

2024-12-26 · 1 min

Drm -- Memory Management

Introduction DRM 核心包括两个内存管理器,分别是 Translation Table Manager(TTM) 和 Graphics Execution Manager(GEM). TTM 是第一个被开发的 DRM 内存管理器。它提供了一个单一的用户空间 API 来满足所有硬件的需求,支持统一内存体系结构(Unified Memory Architecture,UMA)设备和具有专用视频 RAM (即大多数离散显卡)的设备。这导致了一大段复杂的代码,结果很难用于驱动程序开发。 由于 TTM 的复杂性,GEM 最初是由英特尔(Intel)赞助的一个项目。GEM 没有提供每个图形内存相关问题的解决方案,而是确定了驱动程序之间的公共代码,并创建了一个支持库来共享它。GEM 的初始化和执行要求比 TTM 简单,但没有视频 RAM 管理功能,因此仅限于 UMA 设备。 GEM Initialization 在 struct drm_driver driver feature 中设置 DRIVER_GEM bit. 中间层会自动调用drm_gem_init()来完成 GEM 的初始化. GEM Objects Creation GEM object 由结构体 struct drm_gem_object表示, 通过drm_gem_oject_init()初始化, 利用 shmem 来分配 anonymous pageable memory. 如果 hardware 需要 physical contiguous system memory(通常是嵌入式设备需求), 那么可以不需要使用 shmem, 而是通过drm_gem_private_object_init()初始化....

2024-12-10 · 3 min

Professional CMake: A Practical Guide Part III The Bigger Picture

Chapter 23. Finding Things 中等规模以上的项目除了本身的项目之外, 可能还依赖于其他东西. 比如 a particular library or tool, location of a specific configuration file or a header for a library. 甚至项目可能需要找一个 package, 其中定义了一系列内容, 包括 targets, functions, variables… find_...命令提供了搜索 file、library 或 progaram,甚至 package 的能力. 23.1 Finding Files and Paths find_file(outVar name | NAMES name1 [name2...] [HINTS path1 [path2...] [ENV var]...] [PATHS path1 [path2...] [ENV var]...] [PATH_SUFFIXES suffix1 [suffix2 ...]] [NO_DEFAULT_PATH] [NO_PACKAGE_ROOT_PATH] [NO_CMAKE_PATH] [NO_CMAKE_ENVIRONMENT_PATH] [NO_SYSTEM_ENVIRONMENT_PATH] [NO_CMAKE_SYSTEM_PATH] [CMAKE_FIND_ROOT_PATH_BOTH | ONLY_CMAKE_FIND_ROOT_PATH | NO_CMAKE_FIND_ROOT_PATH] [DOC "description"] ) 搜索顺序按如下表格:...

2024-11-30 · 5 min

Professional CMake: A Practical Guide Part II Builds In Depth

Chapter 13. Build Type 13.1 Build Type Basics cmake 有以下几种 build type, 不同的 tpye 会导致 compiler 和 linker flags 不同: Debug: no optimization and full debug information. Release: typically full optimization and no debug information. RelWithDebInfo: 有优化 + debug info. MinRizeRel: 优化 size. 13.1.1 Single Configuration Generators 像 make, ninja, 每个 build directory 只支持一种 build type, 需要在编译时指定 cache variable CMAKE_BUILD_TYPE: cmake -G Ninja -DCMAKE_BUILD_TYPE:STRING=Debug ../source cmake --build . 一种可能的文件布局方式: 13.1.2 Multiple Configuration Generators 类似 Xcode and Visual Studio, 不关注, 跳过....

2024-11-29 · 13 min

Professional CMake: A Practical Guide Part I Fundamentals

Reference Professional CMake A Practical Guide version 1.0.0 2018 年出版, 基于 cmake 3.12 版本(2018-7-17). 目前该书出到了 19th Edition, 支持到 cmake 3.30, 不断更新中. Chapter 1. Introduction From Wikipedia: CMake is a free, cross-platform, software development tool for building applications via compiler-independent instructions. It also can automate testing, packaging and installation. It runs on a variety of platforms and supports many programming languages. Build 部分由其他不同的 build tool 负责, 比如 make, ninja, Visual Studio, XCode…...

2024-11-20 · 14 min

Modern Cmake

Getting Started Installing CMake Running CMake Building a project ~/package $ mkdir build ~/package $ cd build ~/package/build $ cmake .. ~/package/build $ make make 可以替换成 cmake --build . 新版本的 cmake 可以使用-S, -B 指定 source 和 build 目录: ~/package $ cmake -S . -B build ~/package $ cmake --build build install 命令: # From the build directory (pick one) ~/package/build $ make install ~/package/build $ cmake --build . --target install ~/package/build $ cmake --install ....

2024-11-13 · 3 min

GNU Linker Script

Reference 官方文档: https://sourceware.org/binutils/docs/ld.pdf 2. Invocation 讲了 command line ld 的各种选项。 3. Linker Script 3.1 Basic Linker Script Concepts loadable section and allocatable section A section may be marked as loadable, which means that the contents should be loaded into memory when the output file is run. A section with no contents may be allocatable, which means that an area in memory should be set aside, but nothing in particular should be loaded there (in some cases this memory must be zeroed out)....

2024-11-12 · 3 min

Drm -- Panel and Bridge

Panel and Bridge 情况 1:设备树存在 panel 节点 imx6ull-dhcom-pdk2.dts 中的存在 panel 节点,对应 panel-simple.c: &lcdif { status = "okay"; port { display_out: endpoint { remote-endpoint = <&panel_in>; }; }; }; panel { compatible = "auo,g101evn010"; power-supply = <&ldo4_ext>; backlight = <&lcd_backlight>; port { panel_in: endpoint { remote-endpoint = <&display_out>; }; }; }; 这种情况比较简单,在底层 driver 中调用drm_of_find_panel_or_bridge找到设备树中的 panel 节点,和 panel driver 匹配,找到 panel driver 注册的 drm_panel 结构体。 再调用devm_drm_panel_bridge_add, 分配 panel_bridge, 注册一个固定的drm_bridge。 最后调用drm_bridge_attach, 调用到 bridge->funcs->attach, 即 panel_bridge_attach, 注册 connector,以及把 connector attach 到 encoder。...

2024-10-15 · 4 min

CS61A Project2 Cats

Overview 使用如下命令对每个 question 检查正确性: python3 ok -q [question number] -i 使用 ok 系统允许的 debug 打印: print("DEBUG:", x) 运行 cats GUI 系统: python3 cats_gui.py Problem 1 实现 pick 函数,其中函数接受的参数: paragraphs: 表示 paragraphs 的字符串 list select: 一个对字符串的判断函数,return True or False k: 第 k 个满足 select 的 paragraphs 返回 paragraphs 中第 k 个满足 select 的字符串,没有满足的返回空字符串。 def pick(paragraphs, select, k): """Return the Kth paragraph from PARAGRAPHS for which the SELECT returns True. If there are fewer than K such paragraphs, return an empty string....

2024-09-29 · 4 min

Debug DRM driver in QEMU with Buildroot support

Buildroot 编译 kernel 和 rootfs 我们想在 QEMU 中进行 debug,那么首先需要准备好 kernel image 和 rootfs。这边我们采用的是 buildroot 的方式来创建我们需要的 kernel 和 rootfs。 下载 buildroot 2024: wget https://buildroot.org/downloads/buildroot-2024.02.6.tar.gz 接着进入 buildroot 目录,执行 make qemu_x86_64_defconfig,使用 qemu 的配置: cd buildroot-2024.02.6/ make qemu_x86_64_defconfig 对该 config 文件作如下改动: # support custom linux source code BR2_PACKAGE_OVERRIDE_FILE="board/qemu/x86_64/custom_override.mk" BR2_LINUX_KERNEL_CUSTOM_VERSION=y BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="linux-6.10" BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/qemu/x86_64/custom_linux.config" # GDB support BR2_PACKAGE_HOST_GDB=y # cross gdb for host machine BR2_PACKAGE_GDB=y BR2_PACKAGE_GDB_SERVER=y BR2_TOOLCHAIN_BUILDROOT_CXX=y BR2_DEBUG_3=y BR2_ENABLE_DEBUG=y # enable debug symbol in packages BR2_OPTIMIZE_0=y BR2_PACKAGE_LIBDRM=y BR2_PACKAGE_DRMTEST=y # custom drm test package 改动目的主要是:...

2024-09-26 · 2 min