Tag: 内核

是否有用于Windows驱动程序开发的开源C库(不是c ++)?

是否有用于Windows驱动程序开发的开源C库(不是c ++)? 我正在开发一个网络设备驱动程序,需要一些function,如RegEx,字符串操作,面向对象的C和XML等等…… 谢谢。

如何发送大小超过64 KB的UDP数据包

我无法发送大小超过64 KB的IP multicast datagrams (对于我的实验,我需要这样做)。 我正在通过10 Gigabit ethernet链路直接连接的计算机之间传输数据包(中间没有任何跳跃,由traceroute确认)。 所有计算机都安装了Ubuntu 12.04。 我通过在/etc/sysctl.conf添加以下行来更改读写缓冲区的限制: net.core.rmem_max=12582912 net.core.wmem_max=12582912 net.core.rmem_default=12582912 net.core.wmem_default=12582912 并使用sysctl -avalidation了更改(运行sysctl -p之后)。 我是否需要重新启动才能看到更改? (我正在共享机器,所以不总是可以重启)。 用于发送和接收的接口的MTU在所有计算机中都是9000字节。 我已成功发送大小约为60 KB的数据包,对于100 KB数据包,使用tcpdump捕获显示数据包甚至没有被发送并且可能被内核丢弃(我没有在tcpdump跟踪中看到它们)。 为了能够传输大数据包(最好是100 MB的大小),我还需要做些什么?

未对齐的内存访问

我正在玩C中的内存地址,并想知道这个名为未对齐内存访问的主题。 我目前使用的是带有Linux内核的x86英特尔,但是本着主题和操作系统不可知论的精神来讨论这个主题 – 尽管以下是Linux和HW特定的: 当我从/向未对齐的地址读取/写入简单类型时,我没有错。 日志或任何内容中没有消息。 我也尝试过: perf top -e alignment-faults # And with PID perf top -p NNN -e alignment-faults 但没有命中。 通过以下方式启用对齐检查 __asm__(“pushf\norl $0x40000,(%esp)\npopf”); 给出“通缉”结果: Bus error (core dumped) (但仍然没有消息) 我的问题是硬件+操作系统如何处理这个问题以及什么是最佳的。 我的想法和问题到处都是,但我会试着说出一些具体的观点: CPU是否默认启用了对齐检查,但是内核检测到支持off并指示它不检查 ? 作为内核,至少我在其他硬件上经历过这种情况,由于某些驱动程序试图访问未对齐的内存,可以获得oops:内核是否运行在对齐检查 -mode? 或者它可能只是代码的某些部分呢? 由于未对齐内存的访问需要更多资源; 在软件的测试阶段,启用对齐检查是一个好主意,例如在assembly线之上? 这会使它更便携吗? 我对此有很多疑问,但现在就把它留在这里。

无法insmod或使用内核间模块

我在内核驱动程序1(KD1.ko)中有一个函数: static void test (void); EXPORT_SYMBOL(test); static void test() { printk(“<<>>.\n”); } 在内核驱动程序2(KD2.ko)中: extern static void test (void); 我试着称之为。 我设法insmod KD1.ko,但我无法insmod KD2.ko. 我错过了什么吗?

GCC内联汇编’Nd’约束

我正在用C开发一个小玩具内核。我需要从键盘获取用户输入。 到目前为止,我已使用以下代码实现了inb : static inline uint8_t inb(uint16_t port) { uint8_t ret; asm volatile(“inb %1, %0” : “=a”(ret) : “Nd”(port)); return ret; } 我知道”=a”约束意味着al/ax/eax将被复制到ret作为输出,但我仍然对”Nd”约束感到困惑。 任何人都能提供一些有关为什么需要这种约束的见解? 或者为什么我不能只使用像”r”或”b”这样的通用寄存器约束? 任何帮助,将不胜感激。

linux / init.h:没有这样的文件或目录

我正在尝试为我的一类构建一个内核模块,并且我遇到了一堵错误,但是在所述墙的顶部是臭名昭着的“没有这样的文件或目录”错误。 这似乎是问题的根源。 这不仅影响init.h,还影响module.h和kernel.h。 该计划的前三行如下: #include #include #include 在浏览类似的问题时,我环顾四周并尝试了其他路径,这些文件应该是什么,但到目前为止还没有任何工作。 最奇怪的是我已经使用过这个模块; 我提供了顶级的初学者代码(我没有改变任何东西),它没有给我那个错误。 虽然,显然后面的代码是不同的,但这似乎是目前最大的问题。 完整代码如下: #include #include #include /* This function is called when the module is loaded. */ int simple_init(void) { printk(KERN_INFO “Loading Module\n”); static LIST_HEAD(birthday_list) struct birthday{ int day; int month; int year; struct list_head list; }; struct birthday *ptr, *next; struct birthday *bob; struct birthday […]

实模式内核的16位C代码

我不知道如何为16位实模式编译我的C内核。 我试过各种编译器但没有运气。 我的引导加载程序只是从软盘(我的内核就在磁盘上的第一个扇区之后)加载原始扇区到物理内存地址1000h:0000h然后跳转到它。 如何编译我的C内核以16位实模式工作? 我的基本内核: void OSmain() { unsigned char *videoram = (unsigned char *) 0xb8000; videoram[0] = 65; /* character ‘A’ */ videoram[1] = 0x07; /* forground, background color. */ while( 0 ) { } } 我尝试过的编译器是GCC,tinyCC和DMC。 我的目标是得到一个平坦的二进制文件,我可以跳转到开始执行。

unit testing内核模块代码是否可行?

如果是这样,我应该使用什么技术? 我正在考虑使用hippomock,因为它们可以用来模拟“C”方法。 有没有更好的方法? 如果是这样,任何人都可以给出建议,或者您认为内核的unit testing是否有点过分?

在编写内核时可以使用stdio吗?

我需要构建一个操作系统,一个非常小的基本操作系统,实际上function最少,用C编码。 可能是一个CUI操作系统,它做一些内存管理,至少有一个文本编辑器和一个计算器,它只是一个关于如何制作一个完全和直接控制你的硬件的代码的实验。 我仍然需要一个接口,需要输入/输出function,如printf(&args),scanf(&args)。 现在我的基本问题是我应该使用现有的标题还是从头开始编码,为什么会这样? 我非常感谢你们的帮助和帮助。

什么是相当于memset函数的Linux内核?

我正在编写一个驱动程序,要求我清除分配给零的所有内存。 memset是一个用户空间函数,但我想知道内核是否提供了一个可以帮助我做到这一点的宏。