在我一头扎进C#之前......
我一直觉得C或者C++最适合在Windows上开发驱动程序.我不喜欢在.NET机器上开发驱动程序的想法.
但.NET似乎是MS推动应用程序开发的方式,所以我现在想知道:
我希望我的设备可以在C#中使用,如果C#中的驱动程序开发成熟,这显然是要走的路,但如果不推荐,我不想在那里花费很多精力.
-亚当
我正在开发一个Linux驱动程序可加载模块,我必须在我的驱动程序中使用另一个设备.(堆叠在另一个驱动程序上的驱动程序的种类)
如何在我的驱动程序中调用/使用其他驱动程序?我认为它们都在内核中,所以可能有一种方法可以直接使用另一个驱动程序.
当我运行以下代码时:
struct sockaddr_in sin;
int addrlen;
addrlen=sizeof(sin);
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr=inet_addr("123.456.789.112");
sin.sin_port=htons(0); // so that the kernel reserves a unique port for us
sd_server = socket(PF_INET, SOCK_STREAM, 0);
bind(sd_server, (struct sockaddr *) &sin, sizeof(sin));
getsockname(sd_server,(struct sockaddr*)&sin,&addrlen);
port=ntohs(sin.sin_port);
printf("port number = %d\n",port);
Run Code Online (Sandbox Code Playgroud)
根据套接字,我必须得到1024到5000之间的端口号,但是我的端口号大约是30,000.
我该怎么办?
在我的驱动程序的file_operations结构中,我有:
struct file_operations Fops = {
read: device_read,
write: device_write,
unlocked_ioctl: device_ioctl,
...
};
Run Code Online (Sandbox Code Playgroud)
即没有使用ioctl字段.这是否足以避免Big Kernel Lock并在没有任何同步的情况下进入device_ioctl()?或者我是否必须在代码的用户空间部分更改ioctl()调用?
在我作为一名软件工程专业的学生的时候,我已经习惯了足够多的时间来熟悉Linux,以便我对它的工作方式有所了解,但只知道一个操作系统对我来说是短视的.我很想了解Windows的工作方式,虽然我不希望看到它的代码,但我确信有一些文章/学术论文/技术手册至少有一些信息.
您是否了解我可以从中了解Windows内核的良好来源?
配置Linux内核时,我通常从我的发行版的内核配置文件开始.我经常想关闭一些条目,但它们有时是不可更改的,因为启用了依赖于它的其他CONFIG选项.
我可以手动查找依赖项,这些依赖项通常具有自己的依赖项.通过这些操作可能非常耗时,特别是如果您尝试关闭CONFIG_KALLSYMS之类的东西.
问题:有没有办法指定您想要的配置选项,并自动选择/分析所有依赖关系作为nessisary?我查看了所有make选项和scripts目录,但没有看到任何可用的内容.
更新:有人回答说make oldconfig应该从.config文件中删除(删除)所需的CONFIG选项后执行该工作,但这不起作用(他的答案消失了):
$ make oldconfig
scripts/kconfig/conf -o arch/x86/Kconfig
*
* Restart config...
*
*
* Configure standard kernel features (for small systems)
*
Configure standard kernel features (for small systems) (EMBEDDED) [N/y/?] n
Load all symbols for debugging/ksymoops (KALLSYMS) [Y/?] (NEW) y
Include all symbols in kallsyms (KALLSYMS_ALL) [Y/?] (NEW) y
Do an extra kallsyms pass (KALLSYMS_EXTRA_PASS) [N/y/?] (NEW)
Run Code Online (Sandbox Code Playgroud)
它会自动地说"y"两个前两个,我试图找到一种自动删除它们并让它们消失的方法.
在Linux内核编译的"make"步骤中,我遇到了很多这样的错误:
Building modules, stage 2.
MODPOST 2283 modules
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
Run Code Online (Sandbox Code Playgroud)
我知道我可以做一个make CONFIG_DEBUG_SECTION_MISMATCH=y并继续它,但我想知道是否有更好的方法来处理它.也许向别人报告或我如何解决这些问题,等等.
即使已经存在类似的话题,我也注意到它的历史可以追溯到两年前,因此我认为开一个新主题更合适......
我试图弄清楚如何从Linux内核(3.3.4)发送UDP数据包,以监控随机数生成器(/drivers/char/random.c)的行为.到目前为止,由于sock_create和sock_sendmsg函数,我设法监视了一些事情.您可以在此消息的末尾找到我使用的典型代码.(您可能还想在此处下载完整的修改后的random.c文件.)
通过在适当的random.c函数中插入此代码,我能够为每次访问/ dev/random和/ dev/urandom发送UDP数据包,并且随机数生成器使用的每个键盘/鼠标事件都可以收集熵.但是,当我尝试监视磁盘事件时,它根本不起作用:它在引导期间生成内核崩溃.
因此,这是我的主要问题:您是否知道为什么我的代码在插入磁盘事件函数时会导致如此多的麻烦?(add_disk_randomness)
或者,我已经读过netpoll API,它应该处理这种UDP-in-kernel问题.不幸的是我还没有发现任何相关的文件除了从2005年相当有趣,但过时的红帽介绍你觉得我应该相当使用这个API?如果有,你有什么例子吗?
任何帮助,将不胜感激.提前致谢.
PS:这是我的第一个问题,所以请不要犹豫,告诉我,如果我做错了什么,我会记住以后的问题:)
#include <linux/net.h>
#include <linux/in.h>
#include <linux/netpoll.h>
#define MESSAGE_SIZE 1024
#define INADDR_SEND ((unsigned long int)0x0a00020f) //10.0.2.15
static bool sock_init;
static struct socket *sock;
static struct sockaddr_in sin;
static struct msghdr msg;
static struct iovec iov;
[...]
int error, len;
mm_segment_t old_fs;
char message[MESSAGE_SIZE];
if (sock_init == false)
{
/* Creating socket */
error = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
if (error<0)
printk(KERN_DEBUG "Can't create socket. Error …Run Code Online (Sandbox Code Playgroud) Linux内核代码中的EXPORT_SYMBOL_GPL是什么?
下面是一段代码,其中包含EXPORT_SYMBOL_GPL
62 struct resource *platform_get_resource(struct platform_device *dev,
63 unsigned int type, unsigned int num)
64 {
65 int i;
66
67 for (i = 0; i < dev->num_resources; i++) {
68 struct resource *r = &dev->resource[i];
69
70 if (type == resource_type(r) && num-- == 0)
71 return r;
72 }
73 return NULL;
74 }
75 EXPORT_SYMBOL_GPL(platform_get_resource);
Run Code Online (Sandbox Code Playgroud)
该宏在内核代码中多次出现......
我看到内核代码中使用的u8 u16 u64 u64数据类型.我想知道为什么会出现需要使用u8或u16或u32或u64不unsigned int?