我正在使用远程(k)gdb来调试模块中的问题,该模块在加载时会引起恐慌,例如何时init()被调用.
堆栈跟踪只显示do_one_initcall(mod->init)导致崩溃.为了获得在gdb中加载的符号文件,我需要获取模块文本部分的地址,并获得我需要加载模块.
因为insmod在busybox(1.16.1)中不支持-m所以我坚持grep modulename /proc/modules+添加偏移nm来计算地址.
所以我在这里面临一个鸡和蛋的问题 - 为了能够调试模块加载,我需要加载模块 - 但是为了加载模块,我需要调试问题. ..
所以我目前正在考虑两种选择 - 是否有办法获取地址信息:
所有这一切都在调用之前mod->init()- 所以我可以在那里放置一个断点,加载符号文件,点击c并看到它崩溃和燃烧......
我正在编写一个Linux内核模块.它与所有源文件(尽管许可证是专有的)一起发布,以针对正在运行的内核进行编译.安装我的模块(作为.deb包分发)时,它会自动编译和安装.这有效.
问题是在整个Linux系统的常规升级过程中,安装了较新版本的Linux内核.当这样的新版本的内核开始运行时,它没有为我编译我的模块,并且我的应用程序失败了.我想在安装新的Linux内核软件包时编译和安装我的模块.
因此我的问题是:在dpkg安装新的Linux内核软件包时,是否有一种机制可以触发我的软件包中的某些内容来编译和安装我的模块?
同样的问题rpm?
再次,我需要你的内核模块的帮助.我已经实现了一个客户端模块,但每次连接函数都返回errno = 110(超时).我不明白为什么?为了测试这个模块,我在监听模式下启动了netcat(nc -vl -p4242).你对这个神秘的bug有什么建议吗?
int init_module(void)
{
struct socket* sock = NULL;
struct sockaddr_in* dest = {0};
int retVal = 0;
dest = (struct sockaddr_in*)kmalloc(sizeof(struct sockaddr_in), GFP_KERNEL);
sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock);
dest->sin_family = AF_INET;
dest->sin_addr.s_addr = htonl(in_aton("127.0.0.1"));
dest->sin_port = htons(4242);
printk(KERN_EMERG "Connect to %X:%u\n", dest->sin_addr.s_addr, 4242);
retVal = sock->ops->connect(sock, (struct sockaddr*)dest, sizeof(struct sockaddr_in), !O_NONBLOCK);
if (retVal >= 0) {
printk(KERN_EMERG "Connected\n");
sock_release(sock);
}
else
printk(KERN_EMERG "Error %d\n", -retVal);
return (0);
}
Run Code Online (Sandbox Code Playgroud)
调试输出(dmesg)
Message from syslogd@century at Sun Jun 19 …Run Code Online (Sandbox Code Playgroud) 我有兴趣用我将在linux内核3中实现的自定义替换系统调用.我读到sys调用表不再暴露.
有任何想法吗?
任何对此http://www.linuxtopia.org/online_books/linux_kernel/linux_kernel_module_programming_2.6/x978.html示例的引用,但对于内核3将不胜感激:)
谢谢!
我正在编写一个内核模块,需要有关本地机器接口的信息,就像通过一个简单的'ifconfig'命令重新调整的那些,我已经搜索了很多,但找不到任何东西
我编写了一个示例hello.ko内核模块:
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world.\n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
Run Code Online (Sandbox Code Playgroud)
在这里,我使用了"printk"方法,这是Linux公开的内核API.我可以在"/ proc/kallsyms"中看到Linux导出的符号.我很想知道gcc/ld如何链接被调用的内核API?gcc/ld是从"/ proc/kallsyms"或其他文件获取内核方法的地址并执行链接吗?如果是的话,gcc/ld怎么知道呢?我无法说出任何选择.
是否有基于内核检测的方法来测量内核在启动期间转移到用户空间的时间?我可以使用printk的定时信息,但我只是不确定,放置此printk的确切位置,以便观察内核何时转移到Userspace.
我正在使用Ubuntu和VirtualBox.我正在为我的shell定义一个新命令来输出子进程的一些特性(如兄弟树等).为了输出这些特性,我创建了一个内核模块并使用了task_struct.我还测试了我的shell之外的内核模块,它可以工作.现在我的问题是如何在我的shell中触发这个内核模块(在C代码中),以便我的内核模块将被加载?
我搜索并发现我需要使用modprobe或insmod等系统调用,但不知道如何使用它们.我尝试了下面的代码,但它没有用:
的setuid(0);
system("/ sbin/insmod /.../mymodule.ko");
谢谢您的帮助.
我使用Linux内核的v4.0.5开发了一个简单的线路规则,在Mint Linux下运行.
tty_ldisc_ops结构如下所示:
static struct tty_ldisc_ops my_ldisc = {
.owner = THIS_MODULE,
.magic = TTY_LDISC_MAGIC,
.name = "my_ldisc",
.open = my_open,
.close = my_close,
.read = my_read,
.write = my_write,
.ioctl = my_ioctl,
.poll = my_poll,
.receive_buf = my_receive,
.write_wakeup = my_wakeup,
};
Run Code Online (Sandbox Code Playgroud)
该模块通过添加insmod my_lkm.ko.我知道它正在添加正确,因为我已经使用printk来指示它并且可以通过看到消息dmesg.此外,在启动时,我的用户空间应用程序使用ioctl,我也验证了通过printk工作.
问题是,在my_write中,copy_from_user总是返回一个非零值,表明它以某种方式失败了.
这是my_write():
static ssize_t my_write(struct tty_struct *tty,
struct file *file,
const unsigned char *buf,
size_t nr)
{
int error = 0;
unsigned char data[MAX]; //MAX is 256
if(!my_tty) {
return -EIO; …Run Code Online (Sandbox Code Playgroud) 我有一个内核模块,该模块在初始化例程中有一个while(1)循环,该循环应该无限运行。
如果我在用户空间程序中有等效的代码,则当我按Control + C时,用户空间程序将终止,但是内核模块不是这种情况。
有没有办法向内核模块发送终止信号(当它仍在运行其init例程时),以便它可以终止/退出?
提前致谢