Tag: linux device driver

linux内核如何pipe理小于1GB的物理内存?

我正在学习linux内核的内部知识,在阅读“理解Linux内核”的同时,还碰到了很多与内存有关的问题。 其中之一是,如果我的系统上安装了只有512MB的物理内存,Linux内核如何处理内存映射。 就像我读的那样,内核映射0(或16)MB-896MB物理内存到0xC0000000的线性地址并且可以直接对它进行寻址。 所以,在上面描述的情况下,我只有512 MB: 内核如何从仅512 MB映射896 MB? 在所描述的scheme中,内核进行设置,以便每个进程的页表将从0xC0000000到0xFFFFFFFF(1GB)的虚拟地址直接映射到从0x00000000到0x3FFFFFFF(1GB)的物理地址。 但是,当我只有512 MB物理RAM时,如何映射虚拟地址从0xC0000000-0xFFFFFFFF到物理0x00000000-0x3FFFFFFF? 点是我有一个物理范围只有0x00000000-0x20000000。 在这种情况下用户模式进程呢? 每篇文章只解释了情况,当你安装了4GB内存,内核将1GB映射到内核空间,用户进程使用剩余的RAM。 我会感谢任何帮助提高我的理解。 谢谢..!

Linux内核如何知道在哪里寻找驱动程序固件?

我正在Ubuntu下编译一个自定义的内核,我遇到了内核似乎不知道在哪里寻找固件的问题。 在Ubuntu 8.04下,固件与驱动程序模块的内核版本相同。 例如,内核2.6.24-24-generic将其内核模块存储在: /lib/modules/2.6.24-24-generic 和它的固件在: /lib/firmware/2.6.24-24-generic 当我根据“ 替代构build方法:老式的Debian方式 ”编译2.6.24-24-generic Ubuntu内核时,我得到相应的模块目录,除了需要固件的那些设备(除了我的英特尔无线网卡(ipw2200模块)。 内核日志显示例如当ipw2200尝试加载固件时,控制固件加载的内核子系统无法find它: ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2 errno-base.h将其定义为: #define ENOENT 2 /* No such file or directory */ (返回ENOENT的函数在它前面放一个减号。) 我试图在/ lib / firmware中创build一个符号链接,其中我的内核名称指向2.6.24-24的通用目录,但是这导致了相同的错误。 这个固件是非英特尔的,由英特尔提供,并由Ubuntu打包。 我不相信它有一个特定的内核版本。 cmp显示各个目录中的版本是相同的。 那么内核如何知道在哪里寻找固件? 更新 我发现这个解决scheme是针对我遇到的确切问题,但是由于Ubuntu已经取消/etc/hotplug.d而不再工作,并且不再将其固件存储在/usr/lib/hotplug/firmware 。 UPDATE2 还有一些研究发现了更多的答案。 直到udev 92版本,程序firmware_helper是固件加载的方式。 从udev 93开始,这个程序被replace为一个名为firmware.sh的脚本,据我所知可以提供相同的function。 这两个硬编码到/lib/firmware的固件path。 […]

学习内核编程

我想学习linux内核编程。 那会是什么起点呢? 什么可能是一些更简单的问题的目标? 提前致谢

内核堆栈和用户空间堆栈

内核堆栈和用户堆栈有什么区别? 为什么使用内核堆栈? 如果一个局部variables在ISR中被声明,它将被存储在哪里? 每个进程都有自己的内核堆栈吗? 那么这两个堆栈之间的过程如何协调?

如何使用netlink套接字与内核模块进行通信?

我正在尝试编写一个与使用netlink的用户进程进行通信的linux内核模块。 我正在使用netlink,因为用户程序我想沟通,只使用套接字通信,我不能改变,以添加ioctl()或任何东西。 问题是我不知道如何做到这一点。 我GOOGLE了,但我发现的所有例子是像这样的老,不再有效的当前内核版本。 我也看过这个SO问题,但这里的示例使用套接字操作的libnl ,但我想坚持标准套接字函数(由sys/socket.h定义)。 所以有人可以在这里指导我一些教程或指导或者一些可以帮助我理解netlink的接口和用法的东西。 我将非常感谢一个工作的例子,没有什么奇特的,只是一个非常基本的例子,如何从用户程序中的套接字到内核中的套接字build立连接,然后将数据从用户进程发送到内核并从内核接收回来。 也请不要告诉我看内核代码。 我已经在做这件事了,但是这需要花费很多时间,我还没有做很多事情。 更新:经过大量的反复试验,我有下面的代码发送消息从用户程序到内核,但从内核到用户程序的消息,即使用netlink_unicast()不起作用。 它不仅没有工作,电话挂起的系统,然后我不得不重新启动机器。 有人可以看一下,告诉我我在做什么错。 netlink_unicast()调用在下面的代码中被注释。 对于内核到用户程序消息,应该取消注释。 用户程序 #include <sys/socket.h> #include <linux/netlink.h> #define NETLINK_USER 31 #define MAX_PAYLOAD 1024 /* maximum payload size*/ struct sockaddr_nl src_addr, dest_addr; struct nlmsghdr *nlh = NULL; struct iovec iov; int sock_fd; struct msghdr msg; void main() { sock_fd=socket(PF_NETLINK, SOCK_RAW, NETLINK_USER); if(sock_fd<0) return […]