Articles of 内核

编译我自己的内核(而不是从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 […]

dynamic并行 – 启动许多小内核是非常缓慢的

我正在尝试使用dynamic并行来改进我在CUDA中的algorithm。 在我原来的CUDA解决scheme中,每个线程计算每个块通用的编号。 我想要做的是首先启动一个粗略(或低分辨率)的内核,在这个线程中,线程只计算一次公共值(就像每个线程代表一个块一样)。 然后每个线程创build一个1个块(16×16线程)的小网格,并为其传递公共值启动一个子内核。 从理论上讲,它应该更快,因为它可以节省许多冗余操作。 但实际上,解决scheme的工作非常缓慢,我不知道为什么。 这是代码,非常简单,只是想法。 __global__ coarse_kernel( parameters ){ int common_val = compute_common_val(); dim3 dimblock(16, 16, 1); dim3 dimgrid(1, 1, 1); child_kernel <<< dimgrid, dimblock >>> (common_val, parameters); } __global__ child_kernel( int common_val, parameters ){ // use common value do_computations(common_val, parameters); } child_kernels的数量很多,每个线程一个,并且必须有大约400×400线程。 据我所知,GPU应该并行处理所有这些内核? 或者子内核按顺序处理? 我的结果显示,性能比我原来的解决scheme慢10倍以上。