我编译和运行的chardev.c从例子中lkmpg和写入设备时,收到了意想不到的错误:
anon@anon:~/lkmpg$ sudo echo "hi" > /dev/chardev
bash: /dev/chardev: Permission denied
Run Code Online (Sandbox Code Playgroud)
模块写入功能如下所示:
/*
* Called when a process writes to dev file: echo "hi" > /dev/chardev
*/
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
printk(KERN_ALERT "Sorry, this operation isn't supported.\n");
return -EINVAL;
}
Run Code Online (Sandbox Code Playgroud)
我没有收到无效操作的预期错误,并且错误打印到/ var/log/messages.
我可以从设备上读取没有问题,收到预期的结果:
anon@anon:~/lkmpg$ cat /dev/chardev
I already told you 6 times Hello world!
Run Code Online (Sandbox Code Playgroud)
使用以下命令手动创建设备/ dev/chardev:
sudo mknod /dev/chardev c 252 0
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
- 编辑 - …
我正在编写一个内核模块,通过控制校验和来检查代码段的完整性以便运行任务.我遇到了几个障碍:
module_list如果变量没有被内核导出(如果没有这样的符号ksyms),我如何获取变量?我可以看到调用lsmod命令的所有模块,所以如何在模块中获取它?我正在尝试实现一个使用zlib的内核模块,那么有没有可用于linux-2.6.17.8的Zlib模块?
如果我需要将zlib的源文件转换为内核空间,我需要替换malloc,函数调用,断言等?
每次指针指向空值或其他东西时,模块都会卡住并拒绝被删除或卸载.摆脱它的唯一方法是重新启动机器.无论如何不必经常重启?我已经尝试通过使用rmmod -f但不使用来强制删除它.我正在运行kernel v 2.6.35
我正在编写一个需要在当前运行的内核的驱动器上读取MBR的模块.但是,如果我硬编码/ dev/sda,如果我在/ dev/sdb中安装模块,它将读取错误的MBR.
有没有办法获取当前运行的内核的当前驱动器路径?
(我会使用filp_open(),vfs_read()和filp_close()来读取前512个字节.)
我编写了一个简单的hello world内核模块,编译并安装在/lib/modules/kernel_version/extra/路径中.
随着insmod它正确加载,但modprobe我得到一个错误
modprobe: FATAL: Module hello_world.ko not found.
Run Code Online (Sandbox Code Playgroud)
我已经安装了所有必需品.
这是Makefile的编译和安装:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules_install
Run Code Online (Sandbox Code Playgroud)
请告诉我如何完成.
提前致谢.
我刚刚开始阅读Ldd3并尝试实现一个简单的模块,或多或少遵循本书中的示例.模块将带有自定义fops(空函数)的char设备添加到内核.模块加载没有问题,但是当我尝试打开设备时,进程被杀死,dmesg打印出调试信息.我的内核是4.8.0.X86-64.这是我的代码
#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h> // for dev_t
#include <linux/kdev_t.h> // for MAJOR, MINOR macros etc..
#include <linux/fs.h> // for alloc_chrdev_region etc ..
#include <linux/cdev.h> // to register char devic
MODULE_LICENSE("Dual BSD/GPL");
dev_t hello_num;
struct cdev *my_cdev;
loff_t hello_llseek(struct file *filepo, loff_t offset, int a){
return 0;
}
int hello_open(struct inode *inode, struct file *flip){
printk(KERN_ALERT "you opened this device");
return 0;
}
ssize_t hello_read(struct file *filep, char __user *ptr, size_t sizee, loff_t *gela){
return 0;
}
ssize_t …Run Code Online (Sandbox Code Playgroud) 从内核模块,我试图使用call_usermodehelper函数来执行可执行文件sha1,该文件将文件作为参数并将文件的SHA1哈希值写入另一个文件(命名为output)。可执行文件完美运行。
int result=-1;
name = "/home/file"
char *hargv[] = {"/home/sha1", name,NULL };
char *henvp[] = {"HOME=/", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
result = call_usermodehelper("/home/sha1", hargv, henvp, 1);
Run Code Online (Sandbox Code Playgroud)
但是大多数情况下,call_usermodehelper返回-14并无法执行可执行文件。可能是什么原因?
有时它可以工作,但是随后创建的输出文件被锁定(与直接运行sha1时不同),我必须先运行chown才能正确使用它。如何预防?
无论如何,没有call_usermodehelper可以执行此操作吗?
linux kernel-module linux-kernel user-mode-linux kernel-mode
无法在AWS EC2 ubuntu 16.04实例中使用snd-aloop音频驱动程序
在snd-aloop上运行modprobe
$modprobe snd-aloop
modprobe: FATAL: Module snd-aloop not found in directory /lib/modules/4.4.0-1052-aws
Run Code Online (Sandbox Code Playgroud)
AWS matchine中的内核是 -
/lib/modules/4.4.0-1049-aws
/lib/modules/4.4.0-1052-aws
/lib/modules/4.4.0-116-generic
Run Code Online (Sandbox Code Playgroud)
当前内核已加载
$uname -r
4.4.0-1052-aws
Run Code Online (Sandbox Code Playgroud)
"/lib/modules/4.4.0-116-generic"内核.location - /lib/modules/4.4.0-116-generic/kernel/sound/drivers/snd-aloop.ko
我已经阅读了以下文档
1. https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedKernels.html - 用于更改内核的Aws文档指南.
我不记得其他链接,但我搜索了很多.
请指出我正确的方向.如何在AWS EC2 Ubuntu 16.04实例中使用音频驱动程序sdn-aloop?
我有这个代码,我正在尝试使内核模块打印系统的正常运行时间,完全在simple_init上.
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <sys/sysinfo.h>
/* This function is called when the module is loaded. */
int simple_init(void)
{
struct sysinfo info;
sysinfo(&info);
printk("This pc has been on for %ld seconds\n", info.uptime);;
printk(KERN_INFO "Loading Module\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这就是我要做的,如果这不是一个内核模块,我发现有一个类似于sysinfo的linux库,它是linux/sysinfo,但即使我使用那个,它只有一个struct sysinfo而不是一个函数我可以调用sysinfo(),当我尝试这样做时,我得到了
error: implicit declaration of function ‘sysinfo’ [-Werror=implicit-function-declaration]
sysinfo(&info);
Run Code Online (Sandbox Code Playgroud)
有谁知道其他任何有效的方法?
谢谢
kernel-module ×10
linux ×8
kernel ×6
linux-kernel ×6
c ×5
amazon-ec2 ×1
audio ×1
integrity ×1
kernel-mode ×1
memory ×1
ubuntu ×1
zlib ×1