Tag: 内核

在android内核开发linux中使用蓝牙

我想知道如果有人有有用的链接或可以提供建议,我如何使用C / C ++而不是JAVA API在Android中使用蓝牙? 我找到了这篇文章,但我想知道我是否提供了完整的信息?

idt_table undefined! 编译内核模块时发出警告

我正在尝试在内核模块中使用gate_desc *idt_table 。 set_trap_gate()定义的set_trap_gate()函数使用此指针。 在desc.h中也有一个定义: extern gate_desc idt_table[] 。 我尝试了不同的东西: 在我的模块中使用idt_table而没有定义或做法 用我的(有效) idt_table地址影响idt_table我在编译期间得到一个id_table未定义的警告,或者为idt_table得到不完整的类型。 创建一个名为gate_desc *it = (gate_desc *)@;的新var gate_desc *it = (gate_desc *)@; 并将set_trap_gate , set_gate , write_idt_entry , pack_gate函数从sched.h复制到我的模块文件(重命名它们,并使用它而不是idt_table )。 这编译很好,但插入我的模块时,我在模块(ret -1)错误中得到一个未知符号。 (我的模块中没有对idt_table的引用,我在sched中使用的函数使用我的变量)。 我试着看看sched.h中包含的文件在哪里被定义为idt_table ,但找不到它! 有人知道我怎么用,来自sched.h的idt_table指针(用corrct地址影响它)还是创建一个新指针?

自己内核的键盘中断处理程序(C)

我正在写一个小操作系统,作为学校分配的一部分,但我得到了卡住键盘输入(按一个键 – >显示在屏幕上)。 我正在使用osdev.org上的Bare Bones教程(gcc交叉编译器,GRUB引导程序,ld链接器),因为我处于保护模式,所以我不能使用BIOS中断进行输入,这就是为什么我必须编写自己的中断处理程序( ?)但即使在我阅读了一些osdev文章和论坛讨论后,我也不确定该怎么做。 非常类似的问题( http://forum.osdev.org/viewtopic.php?f=1&t=9746 ),除了我不知道如何“设置中断”。 #if !defined(__cplusplus) #include /* C doesn’t have booleans by default. */ #endif #include #include #define INT_DISABLE 0 #define INT_ENABLE 0x200 #define PIC1 0x20 #define PIC2 0xA0 #define ICW1 0x11 #define ICW4 0x01 void outb( unsigned short port, unsigned char val ) { asm volatile(“outb %0, %1” […]

奇怪的错误(取消引用指向不完整类型的指针)

void get_cwd(char* buf) { char *result; current->fs->pwd; result = get_dentry_path(current->fs->pwd); memcpy(buf, result, strlen(result)+1); kfree(result); } 错误:取消引用指向不完整类型的指针 错误指向current-> fs-> pwd; 包括: #include #include #include #include #include #include #include #include #include #include #include 如果我键入current-> fs; 在第5行gcc不会在这一行给出错误。 问题在于pwd字段。

在不知道返回类型的情况下将结构的成员初始化为函数指针

我有这个结构: typedef struct xyz_data { void *myfa; <——- correct void *myfb; <——- incorrect } 而这个function定义: asmlinkage ssize_t (*real_sys_read)(unsigned int fd, char __user *buf, size_t count); asmlinkage ssize_t hooked_sys_read(unsigned int fd, char __user *buf, size_t count); (正如你可能猜测的那样,这将指向内核的__NR_read )。 将*myfa;保存到*myfa; 就像xyz_data_something->myfa = hooked_sys_read一样简单,但myfb怎么样? 我不确定xyz_data_something->myfb = &real_sys_read是否有效。 我正在劫持一些系统调用(如果你对项目感兴趣,一切都在GitHub中可用),每个被劫持的系统调用都会使用该结构来调用它所属的真实系统调用(将通过*myfb访问),使用返回值。 请记住,每个系统调用都有自己的返回类型。

与netlink的内核空间用户空间通信

我的目标是始终在内核内存中有一个数组或列表,以便始终可以从内核空间访问它。 为此,我在这里推荐使用netlink套接字。 我按照这个示例 ,它显示了如何发送字符串。 我不确定如何在套接字中发送结构数组或结构列表。 typedef struct { int fiveDollarBills; int denDollarBills; } Bills; 是否可以使用netlink发送列表或数组?

禁用缓存后系统变得非常慢

我通过为我的intel机器设置CR0的CD位来禁用缓存。 我使用了上一篇文章中描述的代码 我还使用smp_call_function()函数来设置所有CPU的CR0。 问题是: 设置所有CPU的CR0的CD位后,机器变得非常慢。 我甚至不能使用键盘。 我的问题是: 我想通过设置CR0的CD位来禁用缓存后检查CR0寄存器。 所以我至少需要能够使用键盘。 无论如何,我禁用缓存后可以帮助我使用键盘吗? 完全出乎我的意料,禁用缓存会使系统几乎冻结。

内核空间中PCI内存的地址映射

我正在尝试从可加载的内核模块读取和写入PCI设备。 因此我按照这篇文章 : pci_enable_device(dev); pci_request_regions(dev, “expdev”); bar1 = pci_iomap(dev, 1, 0); // void iowrite32(u32 val, void __iomem *addr) iowrite32( 0xaaaaaaaa, bar1 + 0x060000); /* offset from device spec */ 但最终设备没有按预期完成他的工作。 然后我查看bar1后面的地址,发现了一个非常大的值ffffbaaaaa004500 。 在这一点上,我真的不明白那里发生了什么,什么是正确的。 我可以将bar1解释为内核地址空间内的地址,该地址直接指向基本地址,该地址是PCI芯片选择地址的0x60000偏移量吗? 如何将写入bar1 + offset的值复制到设备中? 该机制如何在iowrite32和pci_iomap后面工作? 感谢致敬 亚历克斯 PS:我成功测试了同一地址的回读。 注册PCI设备的说明: PCIBAR0 PCI基地址0; 用于存储器映射配置寄存器 PCIBAR1 PCI基地址1; 用于I / O映射配置寄存器 PCIBAR2 PCI基地址2; 用于本地地址空间0 PCIBAR3 PCI基地址3; […]

在可加载的Linux内核模块上设置cpu affinity

我需要创建一个内核模块,在计算机的每个核心上启用ARM PMU计数器。 我在设置cpu亲和性时遇到问题。 我试过sched_get_affinity ,但显然,它只适用于用户空间进程。 我的代码如下。 有任何想法吗? #define _GNU_SOURCE #include /* Needed by all modules */ #include /* Needed for KERN_INFO */ int init_module(void){ unsigned reg; /* enable user-mode access to the performance counters*/ asm volatile(“MRC p15, 0, %0, C9, C14, 0\n\t” : “=r”(reg)); reg |= 1; asm volatile(“MCR p15, 0, %0, C9, C14, 0\n\t” […]

标准C库和系统调用如何协同工作?

我最近对编译器,标准库和内核的内部工作感兴趣。 当我在寻找标准C库的源代码时,我遇到了Glibc。 但它在Glibc的官方网站上所说的是: the library which defines the ”system calls” and other basic facilities such as open, malloc, printf, exit… 所以我猜Glibc实际上并没有提供标准C库的源代码,而是提供了对这些函数的系统调用,然后内核负责处理它们,对吗? 我想更多地了解这些事情。 例如,如何在C程序中执行sin , printf和strlen函数? 如果Glibc只提供系统调用,那些函数的实际源代码在哪里? 内核如何执行它们? 哪里可以找到执行这些function的内核部分的源代码?