Tag: 内核

C内核模块中数组初始化中的省略号

我正在检查github上的一些代码https://github.com/umlaeute/v4l2loopback/blob/master/v4l2loopback.c并遇到了这一行,令我感到困惑。 这是一些我不知道的非常酷的内核宏或gccfunction吗? = -1做什么? static int video_nr[MAX_DEVICES] = { [0 … (MAX_DEVICES-1)] = -1 }; module_param_array(video_nr, int, NULL, 0444); MODULE_PARM_DESC(video_nr, “video device numbers (-1=auto, 0=/dev/video0, etc.)”); 有问题的行是第一个,后两个用于上下文(这是使用内核宏创建cmdline可指定的参数http://lxr.free-electrons.com/source/include/linux/moduleparam.h#L103 ) 无论如何,数组初始化发生了什么? 该语法如何工作?

x86内核中的键盘IRQ

我正在尝试编写一个非常简单的内核用于学习目的。 在阅读了大量有关x86架构中PIC和IRQ的文章后,我发现IRQ1是键盘处理程序。 我正在使用以下代码打印正在按下的键: #include “port_io.h” #define IDT_SIZE 256 #define PIC_1_CTRL 0x20 #define PIC_2_CTRL 0xA0 #define PIC_1_DATA 0x21 #define PIC_2_DATA 0xA1 void keyboard_handler(); void load_idt(void*); struct idt_entry { unsigned short int offset_lowerbits; unsigned short int selector; unsigned char zero; unsigned char flags; unsigned short int offset_higherbits; }; struct idt_pointer { unsigned short limit; unsigned int base; […]

玩具OS文件系统

我在assembly / c中开发了一个运行基本终端的基本内核。 我把它设置为用grub运行iso。 我想继续这个操作系统,但没有文件系统,我觉得好像没有别的我能做的。 经过很长一段时间在互联网上,我已经想出了实现这一点我真的无能为力。 人们已经说过实现FAT或制作VFS,但没有任何进一步的,也没有教程,也没有任何参考。 有人可以解释文件系统如何工作,我可以在哪里开始/我可以连接预制系统,以及如何使用它? 另外,在编译我的操作系统时,我无法访问标准库。 我使用gcc,nasm,ld和grub-mkrescue(用于磁盘映像)。 我使用qemu进行模拟。 编辑减少OT 有人可以详细描述文件系统的工作原理,所以当我查看已经实现的文件系统的来源(如FAT)时,我能理解如何将它应用到我自己的操作系统中吗? 编辑 – 更简单 更容易。 我怎么能直接访问硬盘? 我的内核完全在保护模式下运行,因此我可以切换并直接写入硬盘驱动器。 可以使用如下文件实现文件系统: name 特殊字符 文本 特殊字符 即: hello world.script 0x00 println“Hello,world !!” 为0x00 在您不需要特殊分段的地方,您只需查看文件名和特殊字符(不是像’\ 0’这样的字符串中),然后读取,直到找到第二个非字符串字符。 是否有办法通过切入和退出保护模式或写入硬盘驱动器来实现这一点?

获取内核中当前运行程序的绝对路径

为了检索正在运行的程序的文件权限,我需要在当前运行的程序上执行kstat 。 然后我需要获取加载的ELF图像的绝对路径。 那可能吗? current->comm仅记录没有路径的程序名称。 或者其他什么方法呢?

如何正确使用copy_from_user?

我试图使用以下函数将值从用户空间复制到内核空间: static ssize_t device_write(struct file *filp, const char *buff, size_t len, loff_t *off) { unsigned long copy=0; int desp=0; copy = copy_from_user(&desp, &len, 4); printk(KERN_ALERT “copy: %lx\n”, copy); printk(KERN_ALERT “desp: %d\n”, desp); } 其中“len”是用户空间中存在的变量,我想将其复制到内核空间中的“desp” 我从用户空间调用的函数是(根据file_operations结构,write是device_write): write (fd,buffer,8, &off); 当我打印应该存储在“desp”中的值总是0(应该是8)。 我的代码有什么问题? 我一直在看几个例子,我实现了很多变化,但都没有。

在执行期间访问.eh_frame数据

我正在尝试从其中访问正在运行的程序的.eh_frame部分的内容(具体来说,该程序是Linux内核2.6.34.8)。 .eh_frame包含用于exception处理的有用数据,我想在内核代码内部使用它。 该部分已由gcc编写( readelf -a vmlinux.o包含.eh_frame ),问题是从代码中读取它。 我很确定精灵格式的文档说在代码执行期间可以访问.eh_frame 。 我查看了glibc的源代码,以寻找.eh_frame用法,并在sysdeps/generic/sysdep.h找到了大多数CFA指令的宏,但没有找到加载.eh_frame数据的实际代码。 是否需要修改加载内核以从文件加载数据的过程,或者.eh_frame info / .eh_frame_hdr段指针存储在某处作为宏/汇编程序名称(因此可以将其提取到C变量中)?

为什么我们需要list_for_each_safe()来删除内核链表中的节点?

我正在学习如何使用list.h中的内核链表API。 我了解到,当使用list_del()而不是使用list_for_each()删除节点时,我需要使用list_for_each() 。 list_for_each_safe()代码: #define list_for_each_safe(pos, n, head) \ for (pos = (head)->next, n = pos->next; pos != (head); \ pos = n, n = pos->next) list_for_each()代码: for (pos = (head)->next; pos != (head); pos = pos->next) 我注意到它们都非常相似,只是_safe版本需要一个额外的参数用作’临时存储’(这里说明, list.h )。 我知道何时应用相应的function, _safe版本用于删除,正常版本用于访问,但我很好奇额外的参数如何使其“安全”? 请考虑以下内容,我使用list_for_each_safe()删除链表中的每个节点: struct kool_list{ int to; struct list_head list; int from; }; struct kool_list […]

编写新的系统调用

我一直在尝试在raspberry的内核中编写一个新的系统调用(称为sys_defclose),但是在编译时我得到了这个错误: arch/arm/kernel/built-in.o: In function `__sys_trace_return’: :(.text+0xd50): undefined reference to `sys_defclose’ 我修改了以下文件: -include / linux / syscalls.h:我把我的系统调用的原型放在哪里 -arch / arm / include / asm / unistd.h:我把syscall表的新原始文件放在哪里: #define __NR_sys_defclose (__NR_SYSCALL_BASE+380) -arch / arm / kernel / calls.S:我把它放在哪里: CALL(sys_defclose) -i把sys_defclose的源码放在arch / arm / kernel中,我用新行修改了同一目录下的makefile obj-y +=sys_defclose.o 内核版本是raspberrypi的3.6。 谁能解释一下如何解决这个错误? 谢谢这是我的系统调用的实现 static struct task_struct* get_task_by_pid(pid_t pid) { return pid_task(find_pid_ns(pid, task_active_pid_ns(current)), […]

“{{}} while(0)”在内核代码中的作用是什么?

可能重复: 当我们定义宏时,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 […]

Linux内核调试打印输出?

有没有更好的方法来调试Linux内核中的打印输出? 现在乱丢代码: printk(KERN_DBG “%s:%d – %s() “, __FILE__, __LINE__, __FUNCTION__ ); 哪个不是很干净。 应该有一种方式让整行成为#ifdef :ed以一种不错的方式。