我正在尝试使用 Linux,只是遇到了模块堆叠的概念。它可用于使用其他模块导出的符号。意味着我们可以使用某个模块中已经制作的东西,所以我们不必做已经做过的事情。但是我仍然没有实时了解我们在 Linux 中看到的这种类型的概念。
我正在关注 o'reilly 书中的相同链接 - http://www.makelinux.net/ldd3/chp-2-sect-5.shtml
并口子系统中的堆叠如图2-2所示:

我无法理解这个数字。
您能否提供一些实时示例应用程序,我们可以在其中使用模块堆叠的概念,这将增加我的视野范围?
所以我正在使用 Ubuntu 并尝试使用一些我以前遇到过一些问题的硬件。
之前的问题是,制造我的硬件的公司将其内部零件出售给了另一家制造具有相同 ID 的不同硬件的公司。有人好心地为它制作了一个随 Ubuntu 一起提供的驱动程序,但阻止了我设备的驱动程序工作。在我的上一个系统上,我只是跟踪了内核模块并禁用了它。
我收到与我以前的机器相同的消息:
无法声明设备(Vid:0x2457,Pid:0x1002,iface:0)
但是插入设备似乎并没有像以前那样在 /dev 中创建一个条目。如何找到我的设备的所有权?我假设 dmesg:
USB 4-1:使用 ohci_hcd 和地址 16 的新全速 USB 设备
只是说它正在被检测到,并且不是 ohci 阻止了我的访问。
由于笔记本电脑中的风扇噪音很大,我需要更改 CPU 频率,为此我需要加载适当的内核模块。
我的笔记本电脑 Acer TravelMate 4002WLMi 中的 CPU 是:
$ cat /proc/cpuinfo | grep "model name"
model name : Intel(R) Pentium(R) M processor 1.60GHz
Run Code Online (Sandbox Code Playgroud)
这篇文章帮助我找到了我需要的内核模块(我的 CPU 频率只有一点点不同)。
之后,sudo modprobe speedstep_centrino命令什么都没有发生。echo $?返回0。
你能解释一下内核模块有什么问题以及如何使用适当的模块来改变 CPU 频率吗?
来自 Linux 内核 3.2 的文档(Documentation/kbuild/modules.txt)
=== 5. Module Installation
Modules which are included in the kernel are installed in the
directory:
/lib/modules/$(KERNELRELEASE)/kernel/
And external modules are installed in:
/lib/modules/$(KERNELRELEASE)/extra/
Run Code Online (Sandbox Code Playgroud)
这意味着如果我查看/lib/modules/$(KERNELRELEASE)/extra/我可以找到所有已安装的外部内核模块。但是,我发现官方的 Nvidia 显示驱动程序安装nvidia.ko到/lib/modules/$(KERNELRELEASE)/kernel/drivers/video/. 这与上述规则相矛盾,并表明路径不是包含/外部模块的可靠指标。
如何获取已安装的外部内核模块列表?如果发行版很重要,我想知道 RHEL 6 和 Ubuntu 10.04 的答案。
安装内核模块时,我可以选择使用INSTALL_MOD_STRIP=1. 这可以节省大量磁盘空间。
它也节省内存吗?为什么要在内核模块中保留调试符号?
今天我把我的工作站换成了 Debian。由于 Ubuntu 并不稳定。现在我安装了 VMware 播放器。我启动它并收到一条消息“在你可以运行 VMware 之前,必须编译几个模块并将其加载到正在运行的内核中。没有找到版本 2.6.32-5-amd64 的内核头文件”,在一个字段下面我可以给出一个文件位置。我现在该怎么办?我从来没有遇到过这样的情况。
我编写了一个具有初始化和结束功能的内核模块。我还想要一个函数,并且想随时从用户空间进程调用它。
是否适用?如果是这样,如何?
我正在使用 CentOS 5.2 和自定义内核,从 linux 2.6.18 修补。
编辑:为了清楚起见,我想将一个函数写入内核模块并从常规 source.c 文件中调用该函数。
我正在尝试在 ChrUbuntu 上为 3.xx 内核构建 CP210x 驱动程序。
构建说明: Ubuntu:
make (您的 cp210x 驱动程序)cp cp210x.ko /lib/modules/<kernel-version>/kernel/drivers/usb/serialinsmod /lib/modules/<kernel-version/kernel/drivers/usb/serial/usbserial.koinsmod cp210x.ko我apt-get install build-essential从那时开始:
root@ChrUbuntu:~/Documents/# make
make -C /lib/modules/3.4.0/build M=/home/me/Documents/Linux_3.x.x_VCP_Driver_Source modules
make: *** /lib/modules/3.4.0/build: No such file or directory. Stop.
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)
但我对错误感到困惑,因为该位置显然存在:
root@ChrUbuntu:/lib/modules/3.4.0# ls -la
total 820
lrwxrwxrwx 1 root root 105 Feb 8 17:01 build -> /build/x86-mario/tmp/portage/sys-kernel/chromeos-kernel-3.4-r996/work/chromeos-kernel-3.4/build/x86-mario
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我正在学习如何创建内核模块,并且一切正常:我编译、插入了.kowith sudo insmod cheat.ko,并且printkinit 函数(由 设置module_init)中的消息正确出现在/etc/log/syslog. 然后我对模块进行了更改,使用 将其删除sudo rmmod cheat.ko,重新插入,printk消息又恢复了。
然后,当我尝试一个新功能时,屏幕变得像一个 tty,到处都是错误消息,我做了 ctrl-alt-f2 ctrl-alt-f7(我在 ubuntu 上),然后我回到了 X 服务器。
我取消了对源文件的最新修改,重新编译,但现在的问题是我无法重新插入模块来再次测试,除非我重新启动,这对测试来说太烦人了。
如何在不重新启动的情况下重新插入修改后的模块?
我的尝试和我得到的信息:
cat /etc/log/syslog: 对我来说唯一相关的信息是:
BUG: unable to handle kernel NULL pointer dereference at 00000003
Run Code Online (Sandbox Code Playgroud)
所以这似乎是问题的原因,然后我得到了一个糟糕的:
Oops: 0002 [#1] SMP
Run Code Online (Sandbox Code Playgroud)
可怕的调试信息紧随其后,但似乎没有什么能帮助我重新插入模块。
sudo insmod cheat.ko:命令只是挂起,什么都不输出,我可以继续使用该终端模拟器的唯一方法是用 c-c
sudo rmmod cheat:
Error: Module cheat is not currently loaded
Run Code Online (Sandbox Code Playgroud)sudo modprobe -r cheat.ko
FATAL: Module cheat.ko not found.
Run Code Online (Sandbox Code Playgroud)lsmod …
或者是否有可能克服错误,因为代码不在内核的整体部分?