天道酬勤,学无止境

kernel

Inability of Linux Kernel to support 1GB physical memory and the HIGHMEM solution

问题 我一直在阅读 [1] 以了解 HIGHMEM。 文章说“但是,如果内核希望能够直接访问系统的物理内存,它必须设置页表,将该内存映射到内核的地址空间部分”。这正是我感到困惑的地方。 直接访问物理内存是什么意思? 这是否意味着明确说明物理地址?(AFAIK,这在 Linux 内核中是不可能的)然后他们继续说“它必须设置页表,将该内存映射到内核的地址空间部分”。 那是您在 HIGHMEM 解决方案中所做的事情,不是吗? 请帮助我了解导致 HIGHMEM 解决方案的问题。 [1] http://lwn.net/Articles/75174/ 回答1 1 但是,如果内核希望能够直接访问系统的物理内存,它必须设置页表,将该内存映射到内核的地址空间部分我认为作者想强调内核需要页表来寻址物理内存。 2 t 必须建立页表,将该内存映射到内核的地址空间部分地址空间的内核部分也需要页表来映射该内存,而高端内存则没有直接的内核映射。 您可以在那篇文章中找到“当内核需要处理高内存中的页面时,它必须显式设置一个特殊的页表以首先将其映射到内核的地址空间”。 回答2 首先,这仅与 x86-32 架构相关 如果你仔细阅读这篇文章,你就会明白其中的概念。 下面是一种简化(而且有点粗略)的方式来看待它: 1) 内核开始时为 32 位平台完全映射出可寻址内存(无论实际可用内存如何),我说 1GB 给我 3GB

2022-07-11 09:34:35    分类:技术分享    linux   linux-kernel   operating-system   kernel   virtual-memory

KMDF IOCTL communication with nonpnp driver?

问题 我正在尝试编写一个 Windows 非 pnp 内核模式软件驱动程序,它应该与我的用户模式应用程序进行双向通信(用户发送请求并且驱动程序响应)。 问题是我找不到示例或文档——msdn 示例驱动程序远未编译——如何使用非 pnp 驱动程序处理 IOCTL 请求。 我在研究上浪费了几天时间,但无法让它发挥作用。 我只是想问一下这种沟通方式是否是推荐的方式,并且会感激一切能帮助我完成项目的东西,比如易于理解的文档或简单的示例驱动程序。

2022-05-14 19:13:03    分类:技术分享    c   windows   kernel   driver   ioctl

How to read 32-bit PCI bar memory in 64-bit linux kernel environment

问题 我想在我的 PCIe 设备上进行 I/O。我正在运行带有 linux 内核 4.4.0 的 Ubuntu 16.0.4 LTS lspci -v命令的输出是: 06:00.0 Unclassified device [00ff]: Device 1aa1:2000 (rev 01) Subsystem: Device 1aa1:2000 Physical Slot: 1-4 Flags: bus master, fast devsel, latency 0, IRQ 16 Memory at f1008000 (32-bit, non-prefetchable) [size=8K] Memory at ee000000 (32-bit, non-prefetchable) [size=32M] Memory at f100a000 (32-bit, non-prefetchable) [size=4K] Memory at f0000000 (32-bit, non-prefetchable) [size=16M] Memory at f1000000 (32-bit, non-prefetchable) [size=32K] Capabilities: <access denied> Kernel driver in use: my_pci Kernel modules

2022-05-14 17:55:21    分类:技术分享    linux-kernel   kernel   linux-device-driver

What is the difference between AF_NETLINK(NETLINK_ROUTE) and AF_ROUTE sockets in Linux?

问题 我试图理解为什么存在两个不同的协议族来通过套接字操作内核路由表。 任何人都可以帮助我理解两种类型的插座有什么区别吗? 看起来两者都有相同的目的 - 操作内核路由表,但是程序员决定是否使用AF_ROUTE或AF_NETLINK (NETLINK_ROUTE)套接字的标准是什么? 创建两个套接字类型: sockfd = socket(AF_ROUTE, SOCK_RAW, 0); sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 回答1 与 BSD 路由套接字相关 在 BSD TCP/IP 堆栈实现中,有一个特殊的套接字称为路由套接字。 它有一个地址族 AF_ROUTE、一个协议族 PF_ROUTE 和一个套接字类型 SOCK_RAW。 BSD 中的路由套接字被进程用来在内核路由表中添加或删除路由。 在 Linux 中,路由套接字的等效功能由 netlink 套接字协议类型 NETLINK_ROUTE 提供。 Netlink 套接字提供了 BSD 路由套接字的功能超集。 您可以在本文中阅读更多内容。 回答2

2022-05-14 12:46:06    分类:技术分享    linux   sockets   kernel

Linux kernel: Role of zero page allocation at paging_init time

问题 我试图了解启动时为 arch/arm 保留的内核内存。 在setup_arch()中有一个调用 paging_init() 用于设置页表、初始化区域内存映射等。 它还在分配实际mem_map之前分配一个zero page 。 void __init paging_init(const struct machine_desc *mdesc) { void *zero_page; --- zero_page = early_alloc(PAGE_SIZE); --- empty_zero_page = virt_to_page(zero_page); __flush_dcache_page(NULL, empty_zero_page); } 有人可以解释zero page的作用吗? 这个问题是其中的一部分。 回答1 零页是用零填充的页。 您可以映射到此页面并获得宽零虚拟区域。 每当您写入其中一个页面时,COW 都会工作,您将获得一个新页面。 反过来也是如此:如果您有一个零数据的内存区域,您可以将此数据映射到零页面并释放这些具有“0”数据的页面。 换句话说,这是关于内核如何节省内存的。 ps 注意COW不是和零页直接连接的,是一个比较宽泛的概念 来自@artless_noise 的补充: 它还允许分配一个大数组,但不消耗内存。 所有页面最初都是零页面并映射到相同的物理零页面。

2022-05-13 02:05:11    分类:技术分享    memory-management   linux-kernel   arm   kernel   boot

Is there raw linux system call API/ABI documentation

问题 系统调用有 man(2) 页,但这些描述了位于系统调用之上的 C 库 (glibc) 的行为。 原始系统调用 API/ABI 是否记录在某处(UseTheSourceLuke 除外)? 我在手册页中看到了一些关于内核/libc 之间差异的内容,但我没有感觉到记录这些差异是首要任务。 我真正想说的是:C 库是否被 POLICY 视为稳定/记录的 Linux API,而内核的系统调用 API/ABI 被认为是不稳定的(可能会更改),因此故意未记录或优先级低? 那么更改系统调用的内核开发人员会在 glibc 中解决问题吗? 那么其他的libc呢? 我能找到关于这个主题的历史讨论吗? 编辑:所以 ABI 是稳定的,系统调用的行为也是稳定的,但内核开发人员没有记录它们。 glibc 正在记录它们(带有自己的添加/更改)。 正确的? 回答1 回答2 回答3 我真正想说的是:C 库是否被 POLICY 视为稳定/记录的 Linux API,而内核的系统调用 API/ABI 被认为是不稳定的(可能会更改),因此故意未记录或优先级低? 如果不指定谁的政策,为了什么,就不可能谈论政策。 为“Linux”编程的人通常实际上是为一种或多种 GNU/Linux 编程,而不是为裸内核编程。 因此我倾向于说我们可能没有考虑内核开发者政策。 事实上,如果 C 库接口完全可用,那么我们不是在谈论裸内核。 此外

2022-05-12 12:05:21    分类:技术分享    c   linux   api   assembly   kernel

Contiguous Memory Allocation (CMA) reserved size vs. System Memory

问题 我们正在开发一个多媒体密集型应用程序,该应用程序在具有 1GB 内存的飞思卡尔 imx6q 上运行。 该系统配备了一个14Mpixel的摄像头。 为了处理来自这台相机的数据,我们使用了大量的原始缓冲区(每个缓冲区 29MB)。 事实上,我相信至少我们正在使用:3*29MB(v4l2 的 ringbuffer)+1*29MB(v4l2 的 dummybuffer)+1*29MB(缓冲区的本地副本)+PCIe DMA 使用的 50MB 在许多情况下,我们会用完连续的内存空间,并且系统无法分配它需要的所有缓冲区。 在内核中,CONFIG_CMA_SIZE_MBYTES=256 和 CONFIG_CMA_AREAS=7。 我正在研究将 CMA 大小增加到 384MB 的可能性,但担心这可能会影响系统性能,因为正在运行的应用程序是大量多线程的。 这表示(1GB - 384MB)是应用程序和系统运行的剩余空间。 问题是,将 CMA 升至 384 会损害系统性能吗? 记住系统有 1GB 内存,适合我们应用程序的预留 CMA 内存的最佳大小是多少?

2022-05-11 09:06:08    分类:技术分享    multithreading   memory-management   kernel   ram   dma

How to get a file list from a directory inside the linux kernel?

问题 我刚刚看到在任何rootfs之前都有一个ROOT /目录(无论是来自initrd还是形成磁盘) 我已经知道它确实包含/root和/dev以及已安装的 devtmpfs (如果选择了CONFIG_DEVTMPFS_MOUNT ) 。 但我无法找到是否有其他目录以及它们是什么。 所以关键是在init/do_mounts.c的第 403 行之前插入代码,以便将列表打印到屏幕上。 问题是我不知道如何使用 struct direent 获取旧readdir()的目录列表( int readdir(unsigned int fd, struct dirent *dirp, unsigned int count); ) 回答1 我找不到任何其他示例如何执行此操作,所以这是我的代码: typedef int (*readdir_t)(void *, const char *, int, loff_t, u64, unsigned); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) struct callback_context { struct dir_context ctx; readdir_t filler; void* context; }; int iterate_dir_callback(struct dir_context

2022-05-10 19:21:08    分类:技术分享    c   linux   linux-kernel   kernel   virtual-directory

Getting bandwidth used by SciPy's gaussian_kde function

问题 我正在使用 SciPy 的 stats.gaussian_kde 函数从x,y点的数据集中生成核密度估计 (kde) 函数。 这是我的代码的简单 MWE: import numpy as np from scipy import stats def random_data(N): # Generate some random data. return np.random.uniform(0., 10., N) # Data lists. x_data = random_data(100) y_data = random_data(100) # Obtain the gaussian kernel. kernel = stats.gaussian_kde(np.vstack([x_data, y_data])) 由于我没有手动设置带宽(通过bw_method键),因此该函数默认使用 Scott 规则(参见函数描述)。 我需要的是获得这个由stats.gaussian_kde函数自动设置的带宽值。 我试过使用: print kernel.set_bandwidth() 但它总是返回None而不是浮点数。 回答1 简短的回答 带宽是kernel.covariance_factor()乘以您正在使用的样本的 std 。 (这是一维样本的情况,在默认情况下使用 Scott

2022-05-08 02:20:09    分类:技术分享    python   kernel   scipy   bandwidth