标签: kernel

扩展Magic Mouse的功能:我需要一个kext吗?

我最近购买了一只Magic Mouse.它太棒了,充满了潜力.不幸的是,它受到软件支持的严重阻碍.我想解决这个问题.我做了很多研究,这些是我迄今为止关于事件链的调查结果:

  1. Magic Mouse鼠标向系统发送完整的多点触控事件.
  2. 多点触控事件在MultitouchSupport.framework(Carbon)中处理
  3. 事件在框架中解释,并作为正常事件发送到系统
    • 当您用一根手指滚动时,它会发送实际的滚轮事件.
    • 当您用两根手指滑动时,它会发送滑动事件.
  4. 没有NSTouch事件发送到系统.您无法使用NSTouch API与鼠标进行交互.

在我发现上述所有内容之后,我将MultitouchSupport.framework文件进行了反汇编,并通过一些Google搜索,找到了如何将自己的回调插入链中,以便接收原始触摸事件数据.如果枚举设备列表,则可以为每个设备(触控板和鼠标)附加.这一发现将使我们能够创建一个在鼠标上使用多点触控的框架,但仅限于单个应用程序.请在此处查看我的帖子:Raw Multitouch Tracking.

我想在整个系统中为鼠标添加新功能,而不仅仅是一个应用程序.

为了做到这一点,我想出了如何使用Event Taps来查看最低级别的事件抽头是否允许我获取原始数据,解释它,并在其位置发送我自己的事件.不幸的是,这种情况并非如此.事件点击,即使在HID级别,仍然是在MultitouchSupport.framework中解释输入的步骤.

在此处查看我的事件点击尝试:事件点击 - 尝试原始多点触控.
一个有趣的旁注:当收到多点触控事件(例如滑动)时,会触发默认情况并打印出事件编号29.标题显示28为最大值.

关于我的问题,既然你掌握了所有的信息,并且已经看到了我的尝试:扩展Magic Mouse功能的最佳方法是什么?我知道我需要以足够低的水平插入一些东西,以便在处理输入并调度预定义事件之前获取输入.所以,把它归结为单句问题:

  • 有没有办法覆盖MultitouchSupport.framework中使用的默认回调?
  • 我是否需要编写一个kext并自己处理所有传入的数据?
  • 是否可以编写一个位于现在处理输入的kext 之上的kext,并在该kext完成所有艰苦的工作之后对其进行过滤?

我的第一个目标是,如果您点击时设备上有两个手指,则可以发送中键按钮点击事件.显然,目前还有很多可以做的事情,但这对于拍摄来说似乎是一件好事.

提前致谢!

-Sastira

kernel objective-c device-driver multi-touch magic-mouse

24
推荐指数
1
解决办法
4432
查看次数

调试操作系统

我正在阅读有关操作系统的一些常规内容并触及一个问题.开发人员在开发操作系统时如何调试,即调试操作系统本身?可以为OS开发人员调试哪些工具?

debugging operating-system kernel

24
推荐指数
1
解决办法
7242
查看次数

Linux中用户空间地址的嵌套页面错误

我想知道当内核运行故障处理程序以引入用户页面时,是否在功能上错误地对用户空间地址进行页面错误.

操作系统是Linux 2.6.30

假设任务的两个用户地址都有效(落在vma,rw权限范围内).

当我检查内核代码时,如果故障地址有效并且故障没有发生在原子上下文或irq处理程序中,我发现内核不介意嵌套故障.

(我不认为答案是cpu特定的,但我想补充一点,我对arm和mips感兴趣).

例如:如果我从页面错误处理程序打印堆栈数据,则可能发生这种情况.

linux kernel linux-kernel

24
推荐指数
1
解决办法
661
查看次数

Windows和Native API中的系统调用?

最近我在*NIX操作系统中使用了很多汇编语言.我想知道Windows域名.


在linux中调用约定:

mov $SYS_Call_NUM, %eax
mov $param1 , %ebx
mov $param2 , %ecx
int $0x80
Run Code Online (Sandbox Code Playgroud)

而已.这就是我们应该如何在linux中进行系统调用.

在linux中引用所有系统调用:

关于哪个$ SYS_Call_NUM以及哪些参数我们可以使用这个参考:http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

官方参考:http://kernel.org/doc/man-pages/online/dir_section_2.html


在Windows中调用约定:

???

Windows中所有系统调用的引用:

???

非官方:http://www.metasploit.com/users/opcode/syscalls.html,但除非我知道调用约定,否则如何在汇编中使用它们.

官方:???

  • 如果你说,他们没有记录它.那么如何在不知道系统调用的情况下为windows编写libc?如何进行Windows程序集编程?至少在驱动程序编程中需要了解这些.对?

现在,与所谓的Native API有什么关系?是Native APISystem calls for windows两者都是指同一件事的不同术语吗?为了证实我将这些来自两个非官方来源进行了比较

系统调用:http://www.metasploit.com/users/opcode/syscalls.html

Native API:http://undocumented.ntinternals.net/aindex.html

我的观察:

  1. 所有系统调用都以字母开头,Nt其中Native API由许多不以字母开头的函数组成Nt.
  2. System Call of windows是.的子集Native API.系统调用只是Native API的一部分.

任何人都可以证实并解释.

编辑:

还有另一个答案.这是第二个答案.我真的很喜欢它,但我不知道为什么回答者已删除它.我请他转发他的答案.

linux windows assembly kernel nt-native-api

24
推荐指数
2
解决办法
1万
查看次数

Windows 2008 R2 - 内核(系统进程PID = 4)锁定文件和文件夹

Windows 2008 R2 - 内核(系统进程PID = 4)长时间锁定文件和文件夹.例如,当删除文件时,文件可能会保持锁定1分钟或更长时间,并且只有在删除之后才能保持锁定状态.在另一些情况下,我遇到了无法删除的文件或文件夹.ProcMon显示系统进程持有这些资源的句柄几分钟然后发布它们我提到的资源都不是系统资源,只有我安装的文件和文件夹由我的应用程序处理.

kernel locking file windows-server-2008-r2 delete-file

24
推荐指数
3
解决办法
4万
查看次数

如何在内核模块代码中包含C backtrace?

所以我试图找出哪些内核进程正在调用块驱动程序中的某些函数.我认为在C库中包含backtrace()可以让它变得简单.但是我无法加载回溯.

我复制了这个示例函数来显示回溯:

http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/063/6391/6391l1.html

所有编译尝试都在一个地方或另一个地方发生错误,导致无法找到文件或未定义函数.

这是最接近的.

在Makefile中我放了编译器指令:

 -rdynamic -I/usr/include 
Run Code Online (Sandbox Code Playgroud)

如果我省略第二个,-I/usr/include,那么编译器报告它找不到所需的头文件execinfo.h.

接下来,在我想要进行回溯的代码中,我从示例中复制了该函数:

//trying to include the c backtrace capability
#include <execinfo.h>

void show_stackframe() {
void *trace[16];
char **messages = (char **)NULL;
int i, trace_size = 0;

trace_size = backtrace(trace, 16);
messages = backtrace_symbols(trace, trace_size);
printk(KERN_ERR "[bt] Execution path:\n");
for (i=0; i<trace_size; ++i)
    printk(KERN_ERR "[bt] %s\n", messages[i]);
}
//backtrace function
Run Code Online (Sandbox Code Playgroud)

我稍后在块驱动程序函数中调用此函数,其中发生错误的第一个符号.只是:

show_stackframe();
Run Code Online (Sandbox Code Playgroud)

所以当我编译它时,会出现以下错误:

user@slinux:~/2.6-32$ make -s
Invoking make againt the kernel at /lib/modules/2.6.32-5-686/build
In file included from /usr/include/features.h:346,
        from /usr/include/execinfo.h:22,
        from /home/linux/2.6-32/block/block26.c:49:
/usr/include/sys/cdefs.h:287:1: …
Run Code Online (Sandbox Code Playgroud)

c kernel backtrace linux-device-driver

24
推荐指数
2
解决办法
3万
查看次数

简单内核无法在GRUB中启动

我正在从OSDev.org学习一些OS开发.我有一个内核,我正在尝试使用qemu在GRUB Legacy(0.97)中启动.但是,当我输入时kernel 200+9,我收到了消息

[Multiboot-elf, <0x100000:0x80:0x4008>(bad), entry=0x10000c]
Run Code Online (Sandbox Code Playgroud)

这是我所期望的,除了(坏)部分.如果我boot现在输入GRUB就会挂起.

我认为数字0x100000,0x44,0x4008分别代表.text段起始地址,.bss起始地址和.bss段大小.我认为这是因为objdump -h在内核映像上运行会产生以下结果:

kernel.bin:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000044  00100000  00100000  00001000  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .bss          00004008  00100044  00100044  00001044  2**2
                  ALLOC
Run Code Online (Sandbox Code Playgroud)

所以你可以看到我提到的数字几乎匹配.问题是,而不是100044,.bss的开头只有44个.我认为这就是GRUB说错的原因.我的内存不足1 MB(低内存).但objdump告诉我我的部分超过了这个门槛,所以我不知道出了什么问题.无论如何,我会在下面粘贴我的代码,它相对较短.虽然我的问题可能是非常基本的,如果你以前做过OS开发,所以代码可能是无关紧要的.

;loader.s - contains the multiboot header for grub and calls the main kernel method

global loader                           ; making entry point visible to linker
global magic                            ; we will …
Run Code Online (Sandbox Code Playgroud)

assembly kernel grub qemu osdev

24
推荐指数
1
解决办法
3435
查看次数

使用modprobe"致命:模块未找到错误"

我有一个modprobe命令问题...我编译了hello world模块并加载它insmod,它工作正常,当我这样做时lsmod,我可以在输出列表中看到它.但是当我使用插入此模块时,我modprobe收到致命错误:

root@okapi:/home/ravi# modprobe ./hello.ko 
FATAL: Module ./hello.ko not found.
root@okapi:/home/ravi#
Run Code Online (Sandbox Code Playgroud)

这是模块代码:

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
        printk(KERN_ALERT "Hello, world\n");
        return 0;
}
static void hello_exit(void)
{
        printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);
Run Code Online (Sandbox Code Playgroud)

和Makefile

obj-m += hello.o

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

c linux kernel linux-device-driver linux-kernel

23
推荐指数
2
解决办法
14万
查看次数

在Mac OS X上构建Linux内核

我正在做一个修改Linux内核的项目.我有一个桌面Linux机器,我没有问题在它上面构建内核.

但是,我要去旅行,我想继续前进.我只有一台MacBook.当我试图构建Linux内核时,它抱怨说elf.h was not found.

我从互联网上下载了一个elf.h.现在它抱怨:NO ELF

我尝试/usr/include从Linux桌面复制整个,并将其设置为include目录,但仍然会出现奇怪的错误"u8" not declared

在Mac上进行内核开发的标准方法是什么?我有一台在同一台Mac上运行Linux的虚拟机,它将用于测试修改后的内核.但是,我真的不想在它上面构建内核,因为它有点慢.

linux macos kernel elf

23
推荐指数
2
解决办法
3万
查看次数

linux内核源代码中的"当前"是什么

我正在研究Linux内核,我遇到了问题

我看到很多linux内核源文件都有current-> files.那么"当前"是什么?

struct file *fget(unsigned int fd)
{
     struct file *file;
     struct files_struct *files = current->files;

     rcu_read_lock();
     file = fcheck_files(files, fd);
     if (file) {
             /* File object ref couldn't be taken */
             if (file->f_mode & FMODE_PATH ||
                 !atomic_long_inc_not_zero(&file->f_count))
                     file = NULL;
     }
     rcu_read_unlock();

     return file;
 }
Run Code Online (Sandbox Code Playgroud)

linux kernel linux-kernel

23
推荐指数
1
解决办法
3万
查看次数