Articles of 内核

有关内核3.x上设备驱动程序编程的文档

我有一些家庭作业,我应该在内核3.x上编写一个虚拟设备驱动程序。你能提供一些关于它的文档吗? 我使用的是fedora btw。 我知道有很多教程,但在2.x和3.x之间有一些区别。

这正是Linux内核中的romfs吗?

我必须用romfs创build带有定制可加载模块的文件系统。 不过,我有一些困惑(我还是新的内核的东西): 在读取romfs文件: romfs之后 ,据我所知, romfs是类似于ext2, ext3, ext4….的文件系统,用于在启动时创build内核需要的init ramdisk。 但是,据说从2.1.21版开始, romfs被整合到了内核中: romfs homepage 。 在主页上,我们只能下载用于创buildromfs映像文件的genromfs工具。 所以,我想在这里明确:内核中包含的模块romfs用于读取romfs文件系统,而genromfs用于创build一个,是不是(我试过genromfs ,但我想确认)? initrd是由mkinitrd -allow-missing -f initrd.img kernel-version在源目录(要加载的文件系统)中创build的,并由以下内容解压缩: gzip -dc initrd.img | cpio -idv gzip -dc initrd.img | cpio -idv ,当使用romfs时,我必须使用mkinitrd创build它的图像,并使用它来解genromfs -fdv romfs.img它: genromfs -fdv romfs.img 。 在内核启动的时候这和initrd是一样的吗? initrd涉及到压缩,而romfs不是,这可以吗? 如果是这样的话, romfs模块必须被内置到内核中以便在早期的内核启动阶段读取,是吗? 在我的系统中,我们有一台无盘机器,目前, initrd被用作引导阶段文件系统以及最终的根文件系统。 但是,因为romfs是只读的,所以使用romfs拒绝用户写入文件系统的能力(所以,我们不能像echo "something" > /tmp/something.txt这样的东西)?

从Linux内核运行外部二进制文件

在我们的开发团队中,我们正根据自己的需求修改驱动程序。 我们需要它在linux文件系统中执行外部二进制文件(用户空间应用程序)。 这样做是正确的吗? 从linux内核中调用二进制文件的最好方法是什么? system(),popen()? 感谢您的回答。

ARM字符设备驱动程序初始化不会创build/ dev /文件

我正在为ARM平台上的GPIO引脚编写驱动程序。 我的驱动程序正常工作,直到现在我通过手动mknod'ing设备文件避免了这个问题。 我的初始化代码: static int __init gpio_init (void) { void *ptr_error; if (register_chrdev(249, "gpio_device", &fops) < 0){ printk(KERN_INFO "Registering device failed\n"); return -EINVAL; } if ((device_class = class_create(THIS_MODULE, "gpio_device")) == NULL){ unregister_chrdev_region(DEV_T, 1); printk(KERN_INFO "Class creation failed\n"); return -EINVAL; } ptr_error = device_create(device_class, NULL, DEV_T, NULL, "gpio_device"); if (IS_ERR(ptr_error)){ class_destroy(device_class); unregister_chrdev_region(DEV_T, 1); printk(KERN_INFO "Device creation […]

Linux中的raw_spin_lock是否禁用hrtimer中断?

在一个处理器上,在同一个线程中,首先调用raw_spin_lock(),然后启动一个hrtimer,再次返回到raw_spin_lock(),在那里它将旋转。 在hrtimer中断处理函数中,raw_spin_unlock()将被调用。 这会导致僵局吗? 将在raw_spin_lock()上旋转禁用中断​​?

如何在linux 3.5.4中调用一个自定义系统调用的系统调用

我正在linux中实现我自己的系统调用。 它正在调用里面的重命名系统调用。 它使用用户参数(以下是代码)将代码传递给重命名。 这里是基本的代码: int sys_mycall(const char __user * inputFile) { // // Code to generate my the "fileName" // // old_fs = get_fs(); set_fs(KERNEL_DS); ans = sys_renameat(AT_FDCWD, fileName, AT_FDCWD, inputFile); set_fs(old_fs); return ans; } 我在这里有两个疑问。 我正在使用old_fs = get_fs(); , set_fs(KERNEL_DS); 和set_fs(old_fs); 绕过实际调用sys_rename因为有错误。 我从这个问题得到了答案: 从内核分配用户空间内存 …这是一个正确的工作? 如何从系统调用中调用系统调用 编辑: int sys_myfunc(const char __user * inputFileUser) { […]

共享内存页面和分叉

如果父母与另一个进程共享某些页面,我们将父项分叉。 从我知道孩子复制页面表,我们设置页面为只读,做写时复制。 但是,如果我们写错了,这将创build一个共享内存页面的副本。 Linux内核如何避免这种情况?

哪个驱动程序是一个句柄的所有者?

有没有什么办法可以确定哪个车手是hanlde的车主? 我的意思是它存储在Windows对象的任何地方? 我可以通过volatilty看到句柄,但所有内核句柄都分配给System.exe pid:4,我需要确切地知道哪个驱动程序正在使用此系统句柄? 谢谢

关于init_task(pid 0或pid 1?)的困惑

我正在玩Linux内核,有一件事我不明白是init_task任务的PID。 据我所知,有两个特殊的pid:idle / swapper任务的pid 0,init任务的pid 1。 每个在线资源(例如一个 , 两个 )我都可以find, init_task任务代表了交换任务,即它应该有pid 0。 但是当我使用从init_task开始的for_each_processmacros打印所有的pid时,我得到pid 1作为第一个进程。 我根本没有得到0。 这意味着init_task具有pid 1,并且它是init任务(?!)。 请帮我解决这个困惑。 PS内核版本是2.4。

被阻止的系统调用不会让SIGKILL终止进程

我有一个关于内核线程之间的信号传播的查询。 情景是这样的: 从用户空间应用程序进行系统调用,内核在系统调用内部创build一个线程(让它命名为thread1)。 现在在thread1中,内核在while循环中循环,并被阻塞。 主线程也在while循环中循环。 如果我执行kill -9 <“user app pid>”,应用程序将无法正常退出,即使/ proc项仍然存在,虽然/ proc // fd文件夹变空了。 如果我在主线程的while循环中join以下内容,它会正确捕获信号并退出。 如果我把以下只在thread1的while循环中,主线程仍然不退出。 if (signal_pending(current)) { return; } 你能否build议,内核在这种情况下应该如何处理kill -9信号? 在SIGKILL之后,进程的状态变成僵尸。 系统调用具有以下实现: thread1 = kthread_create(thread_fn, NULL, "thread1"); if (thread1) { wake_up_process(thread1); } printk(KERN_NOTICE "Main thread: current:%s\n", current->comm); while(1) { DELAY_SEC(1) thread_fn是: int thread_fn(void* data) { while(1) { DELAY_SEC(1) } } 问候, 索尼卡