Articles of 内核

在用NT DDK构build的用户模式程序中包含C ++头文件

所以…我有一个内核模式组件和一个用户模式组件,使用NT DDK 7.1.0的交钥匙构build环境。 内核组件都是.c / .h / .rc文件。 用户模式组件是.cpp / .c / .h / .rc文件。 起初,使用构build似乎是最简单的,因为我看到你可以修改用户模式组件的./sources文件来说: TARGETNAME = MyUserModeComponent TARGETTYPE = PROGRAM UMTYPE = windows UMENTRY = winmain USE_MSVCRT = 1 这似乎并没有引起问题,所以我很高兴,直到我试图#include <string> (或<memory> ,或其他)没有find的东西: 错误C1083:无法打开包含文件:“string”:没有这样的文件或目录 不过,它正在用C ++语言语义编译用户模式片断。 但是,我如何获得标准包括工作? 我在技术上不需要为用户模式部分使用DDK 构build工具。 我可以做一个视觉工作室解决scheme。 我有点担心,因为我碰到了其他的烦恼,如DDK默认使用__stdcall而不是__cdecl这个事实…没有任何编译指示或编译器开关来覆盖这个。 你真的必须进入你关心的每一个声明,并改变它,假设你有源代码这样做。 : – / 我开始怀疑这是不是只是一个分形下降到“只是因为你可以并不意味着你应该build立与DDK用户模式的应用程序,这里是龙。 所以我的问题不仅仅是关于这个特殊的技术障碍,而是如果我放弃使用DDK工具构buildC ++用户模式组件的想法…仅仅因为内核组件是纯C的。

编译我自己的内核(而不是从linux-kernel源代码)

我从这里跟随内核教程 即时通讯编辑我的文件有问题。 当我尝试编译时出现以下错误: main.c:8: error: expected declaration specifiers or '…' before 'size_t' main.c:8: error: conflicting types for 'memcpy' ./include/system.h:5: note: previous declaration of 'memcpy' was here main.c: In function 'memcpy': main.c:12: error: 'count' undeclared (first use in this function) main.c:12: error: (Each undeclared identifier is reported only once main.c:12: error: for each function it appears […]

字符设备捕获多个(int)ioctl参数

我必须编写一个linux char设备,它可以为每个unlock_ioctl处理ioctl(无BKL)函数。 目前,我可以从用户空间ioctl命令收到一个参数 __get_user(myint, (int __user *) arg); 我怎样才能接收多个int参数(例如这个调用)? ioctl(fp, SZ_NEW_DEV_FORMAT, 0, 1, 30);

无法理解Linux内核模块中read_proc的工作

我正在阅读此页面上的内核模块示例 程序中使用的read_proc如下所示: int fortune_read( char *page, char **start, off_t off, int count, int *eof, void *data ) { int len; if (off > 0) { *eof = 1; return 0; } /* Wrap-around */ if (next_fortune >= cookie_index) next_fortune = 0; len = sprintf(page, "%s\n", &cookie_pot[next_fortune]); next_fortune += len; return len; } 有人可以解释为什么off被检查为大于0.此外,有人可以解释什么是closures和计数论证的重要性。 到目前为止,我的理解是,我们必须在页面上写入数据,并且在数据结束时必须设置eof。 谢谢。

I2C设备的linux驱动

如何使i2c设备的字符设备,打开,closures,ioctl等function? 过去两周我一直在寻找关于它的信息,但找不到任何工作。 我发现了一些基本的Linux设备驱动程序的信息,但它是为2.6内核编写的,我使用3.4.79(我试图在cubian distr上为cubieboard2写这个驱动程序),所以这本书有许多不赞成使用的函数,写我的驱动程序就像那里,但它仍然不工作(给我内核错误,而我正在修理猫字符设备)。 任何人都可以解释我该怎么做,或者至less给我一个工作的例子。 所以,有我的代码: http : //pastebin.com/T7PBTpym 我只是试图让i2c总线的工作,但在我的示波器上,我没有看到任何i2c线,而我没有得到任何错误,当我编译它。 另外我无法find如何将设备驱动程序附加到i2c总线号码。 因为我的cubieboard2上有4个i2c总线,如何将设备驱动程序附加到i2c-1总线上?

.NET Thread.Sleep是否受到DST(或系统时间)更改的影响?

我不确定Windows内核如何处理线程时间… 我正在谈论的DST和任何其他事件,影响一天在Windows上的时间框。 例如, Thread.Sleep将阻塞从零到无限毫秒的线程。 如果内核使用与一天中的时间相同的“时钟”,那么何时使用 (a)某人手动改变一天的时间,或者 (b)一些时间服务器的同步改变了一天的时间,或者 (c)夏时制开始或结束,系统已configuration为响应这两个DST事件, 等等 , 睡觉线程在任何方式受到影响? 即内核是否处理这样的事件,程序员不需要做什么? 注意 :对于非关键应用程序,这可能是一个谁在乎? 情况。 对于关键应用,知道这个问题的答案是重要的,因为有可能必须编程这样的例外条件。 谢谢 编辑:我想到了一个简单的testing,我在LINQPad 4中运行。 testing包括让线程进入睡眠状态,大约在线程进入睡眠的同时启动一个手动定时器,然后(a)将时间提前一个小时,然后进行第二个testing,将时间移回到两个小时…在这两项testing中,睡眠时间都没有受到影响。 底线:使用Thread.Sleep,不需要担心会影响一天的时间的事件。 这里是琐碎的C#代码: Int32 secondsToSleep; String seconds; Boolean inputOkay; Console.WriteLine("How many seconds?"); seconds = Console.ReadLine(); inputOkay = Int32.TryParse(seconds, out secondsToSleep); if (inputOkay) { Console.WriteLine("sleeping for {0} second(s)", secondsToSleep); Thread.Sleep(secondsToSleep * 1000); Console.WriteLine("i am awake!"); } else […]

Linux USB编程

我是Linux内核编程的新手。 我希望开发一个程序来读取USB驱动器信息,如制造商名称,容量等。我知道描述符及其属性。 但我不明白如何枚举连接到系统的USB驱动器。 我正在寻找启动内核和USB端口之间连接的function。 这怎么可能?

系统调用:sys_exit(),SYS_exit和exit()之间的区别

SYS_exit,sys_exit()和exit()有什么区别? 我明白: Linux内核提供了系统调用,这些man 2 syscalls在man 2 syscalls中列出。 glibc提供的系统调用的封装函数与系统调用的名称大多相似。 我的问题:在man 2 syscalls ,没有提及SYS_exit和sys_exit()。 他们是什么? 注意:这里的系统调用exit只是一个例子。 我的问题确实是:什么是SYS_xxx和sys_xxx()?

Linux CFS计划代码在哪里?

我有完整的Linux版本3.13的源代码。 我试图findCFS调度程序的源代码,根据stream行的书籍应该驻留在/kernel/sched.c中的基本调度程序代码和/kernel/sched_fair.c专门为CFS代码。 我只是在我的3.13 linux代码里面的这两个文件做了一个代码全局search,结果没有任何结果。 我还单独search了/linux-3.13/kernel文件夹和/linux-3.13/kernel/sched文件夹。 仍然没有运气。 我想让别人知道CFS在新的linux内核代码域(linux-3.13。*)中的位置。 请原谅,如果我在这里失去了一些东西。 我是一个初学linux内核的人。

未注册端口重组错误的nf_conntrack_helper_register

我有以下代码来注销和注册sip conntrack从内核3.18 static void __nf_conntrack_sip_fini(void) { int i, j; for (i = 0; i < ports_c; i++) { for (j = 0; j < ARRAY_SIZE(sip[i]); j++) { if (sip[i][j].me == NULL) continue; nf_conntrack_helper_unregister(&sip[i][j]); } } memset(sip, 0, sizeof(sip)); } static int __nf_conntrack_sip_init(void) { int i, j, ret; if (ports_c == 0) ports[ports_c++] = SIP_PORT; for […]