我的问题的核心是"如何为学习问题设计内核函数?"
作为一个快速的背景,我正在阅读关于支持向量机和内核机器的书籍,我看到作者给出了内核的例子(多项式内核均匀和非均匀,高斯内核,以及基于文本的内核的暗示等等)但是,所有这些都提供了结果的图片而没有指定内核,或者模糊地宣称"可以构造一个有效的内核".我对为新问题设计内核时的过程感兴趣.
可能最简单的例子是学习XOR,这是一个嵌入真实平面的最小(4点)非线性数据集.如何能够提出一个自然(和非平凡)内核来线性分离这些数据?
作为一个更复杂的例子(参见Cristianini,SVM简介,图6.2),如何设计内核来学习棋盘图案?Cristianini声称图片是"使用高斯内核"得出的,但似乎他使用了多个,并且它们以未指定的方式组合和修改.
如果这个问题太宽泛而无法在这里回答,我会理解一个这样的内核函数的构造,尽管我更喜欢这个例子有点简单.
有没有一种最简单的方法来启用 linux 内核驱动程序dev_dbg调试消息(实际上它是一个trace样式消息),希望不会弄乱内核补丁/重新编译或驱动程序实现一些额外的东西debugfs?也许有一种方法可以在内核中启用一些简单的东西(比如一个标志?)触发特定驱动程序或所有驱动程序 dev_dbg(它可以用 `dmesg|grep "driverName" 过滤)输出?
内核版本是4.14. 根本没有syslog/daemonlog/system运行日志。没有网络接口,只有一个串口可用。目标系统非常慢而且非常紧凑,所以没有办法添加 syslog/etc,除了 dmesg 什么都没有,在那里看到这样的行的输出会很好:
dev_dbg(&client->dev, "bla bla bla\n");
不幸的是,一些帖子已经建议debug为bootargs内核参数添加关键字还不够。
输出像dev_info进入 dmesg 没有问题,所以它绝对接近。谢谢
在没有深入了解原因的细节的情况下,我正在寻找一种干净(尽可能)的方式来替换可加载模块的内核函数和系统调用.我最初的想法是编写一些代码来覆盖一些函数,这些函数将采用原始函数(如果可能的话,可能会调用函数),然后添加一些我自己的代码.关键是我写的函数必须具有原始函数的名称,因此其他代码在尝试访问它时将访问我的函数.
我可以很容易地(相对地)在内核中直接执行此操作,只需将我的代码放入适当的函数中,但我想知道是否有人知道一点C魔法不一定是可怕的内核(或C)编码实践,可以实现同样的结果.
我想到了#define和typedef的想法,但我不能完全破解它.
简而言之:有没有人知道如何有效地覆盖Linux内核中的函数(来自模块)?
编辑:因为它被问到,我本质上想要从内核中记录某些功能(创建/删除目录等),但为了理智,一个可加载的模块似乎有意义,而不是必须编写一个大补丁内核代码并重新编译每个更改.内核添加的代码量很少,但是我希望将大部分工作卸载到模块中.
可能的重复:
当我们定义一个宏时,do(0)有什么用?
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?
C多行宏:do/while(0)vs scope block
我已经看到了很多这样的用法,以前我是程序员想要轻松打破一段代码.为什么我们需要在这里执行while {...} while(0)循环?我们试图告诉编译器一些东西吗?
例如,在Linux内核2.6.25中,包含/ asm-ia64/system.h
/*
* - clearing psr.i is implicitly serialized (visible by next insn)
* - setting psr.i requires data serialization
* - we need a stop-bit before reading PSR because we sometimes
* write a floating-point register right before reading the PSR
* and that writes to PSR.mfl
*/
#define __local_irq_save(x) \
do { \
ia64_stop(); \
(x) = ia64_getreg(_IA64_REG_PSR); \
ia64_stop(); \
ia64_rsm(IA64_PSR_I); \
} while (0)
Run Code Online (Sandbox Code Playgroud) 当我尝试在RedHat EL5上安装软件时,我得到的错误是软/硬nofile的预期值是4096而默认值是1024.我设法增加了数量,但我不知道参数是什么.他们是指软链接和硬链接吗?
我改变它的方式是:
A)修改/etc/security/limits.conf
user soft nofile 5000
user hard nofile 6000
Run Code Online (Sandbox Code Playgroud)
B)修改/etc/pam.d/system-auth
session required /lib/security/$ISA/pam_limits.so
Run Code Online (Sandbox Code Playgroud)
C)修改/etc/pam.d/login
session required pam_limits.so
Run Code Online (Sandbox Code Playgroud)
进行更改后(通过切换到root).似乎我必须重新启动机器才能使其生效.但是一些网上帖子说它应该在做出改变后立即生效.如果有人能澄清它,我将不胜感激.
有没有办法在linux内核中获取函数调用?我知道__ func __返回正在执行的函数名.我正在寻找名为" __ func __ "的函数
kernel linux-device-driver linux-kernel embedded-linux kernel-mode
在最初的vmsplice()实现中,有人建议如果你有一个用户区缓冲区2x可以容纳管道的最大页数,那么缓冲区后半部分成功的vmsplice()将保证内核完成使用缓冲区的前半部分.
但事实并非如此,特别是对于TCP,内核页面将被保留,直到从另一方接收到ACK.修复这个问题是未来的工作,因此对于TCP,内核仍然需要从管道中复制页面.
vmsplice()有一个SPLICE_F_GIFT选项可以处理这个,但问题是这暴露了另外两个问题 - 如何有效地从内核获取新页面,以及如何减少缓存垃圾.第一个问题是mmap需要内核清除页面,第二个问题是虽然mmap可能会使用内核中的花式kscrubd功能,但这会增加进程的工作集(缓存垃圾).
基于此,我有以下问题:
mmap/ vmsplice/ splice/ munmap目前在TCP服务器中进行零复制的最佳实践还是今天我们有更好的选择?Linux内核代码使用"statement-expression"和typeof扩展,使其只能在gcc下编译.
我想的更多,更没有意义.
它违背了可移植性和标准C的目的.(现在linux内核代码需要一个支持gcc扩展的特定编译器).
这是一个糟糕的设计选择还是有特定的理由让linux内核代码特定于gcc?
编辑:当我说它破坏了可移植性时,我在不同的环境中使用它.我在思考,通过符合标准C,它将被任何支持标准C的编译器所接受(这正是创建标准的目的 - 统一C的所有不同方言),因此更加便携.当然,由于gcc如此受欢迎,并且gcc支持zillion架构,因此这条线几乎毫无意义.我只是问是否有一个特定的理由背后不符合标准C.
我想知道如何编辑Android操作系统源代码来强加新的权限.例如,我们拥有BLUETOOTH权限,如果设备提供了新的传感器,那么在应用程序级别使用清单条目为android rom中提供的新权限创建权限以便应用程序使用新传感器.
有人知道在AOSP源代码中如何在操作系统级别创建新的权限?
我认为如果我们修改了android源代码来添加新的权限,我们必须编译我们的自定义SDK以便在应用程序开发中使用权限,否则现有的SDK会给出编译时错误,因为它不会识别我们的自定义权限...
任何想法,想法高度赞赏.
所以我使用Lubuntu并使用vmplayer作为VM运行,我正在尝试安装vmware工具.做完之后
./vmware-install.pl
Run Code Online (Sandbox Code Playgroud)
并且正在进行默认设置
The path "" is not a valid path to the 3.8.0-19-generic kernel headers.
Would you like to cange it? [yes]
Enter the path to the kernel header files for the 3.8.0-19-generic kernel?
Run Code Online (Sandbox Code Playgroud)
当我做的时候
whereis 3.8.0-19-generic kernel
Run Code Online (Sandbox Code Playgroud)
它说
3.8:
kernel: /usr/src/linux-headers-3.8.0-30/kernel /usr/src/linux-headers-3.8.0-19/kernel /usr/src/linux-headers-3.8.0-19-generic/kernel /usr/src/linux-headers-3.8.0-30-generic-kernel
Run Code Online (Sandbox Code Playgroud)
我尝试了所有这四个,没有一条路径有效.它仍然说路径不是3.8.0-19通用/内核的有效路径.
请注意,在我做之前
whereis 3.8.0-generic kernel
Run Code Online (Sandbox Code Playgroud)
它只给了我'-19'内核,但后来我做到了
sudo apt-get install linux-headers-$(uname -r)
sudo apt-get install linux-headers-generic
Run Code Online (Sandbox Code Playgroud)
看看它是否会解决任何问题,但事实并非如此.它添加了'-30'内核,但似乎没有解决问题.关于什么是错的任何想法?
kernel ×10
linux ×5
c ×3
linux-kernel ×3
android ×1
debugging ×1
driver ×1
gcc ×1
install ×1
kernel-mode ×1
mmap ×1
module ×1
permissions ×1
splice ×1
svm ×1
trace ×1
vmware-tools ×1
zero-copy ×1