如何创建自己的生物请求以从磁盘驱动器读取扇区?
我正在尝试以下但它冻结了系统.
static void read_bio()
{
struct bio *b;
struct page *p;
b = bio_alloc(GFP_KERNEL, 1);
if (!b) {
printk(KERN_INFO "bio allocation failed\n");
}
bio_init(b);
b->bi_sector = 10000;
b->bi_bdev = bd; /* "/dev/sda1" */
b->bi_end_io = bio_end_clone;
p = alloc_page(GFP_KERNEL);
if (!p) {
printk(KERN_INFO "page allocation failed\n");
}
bio_add_page(b, p, PAGE_SIZE, 0);
b->bi_private = p;
bio_get(b);
submit_bio(READ, b);
printk(KERN_DEBUG "submit read request\n");
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个内核模块,它应该从用户空间接收消息并通过套接字发回响应.
当程序和模块在同一台机器上并使用IP时127.0.0.1,一切正常.但是,当我在不同的机器上尝试并使用真实的网络IP时,类似的东西192.168.3.146只能以一种方式工作.
我从用户空间收到消息,但我无法从内核收到消息.我使用sock_sendmsg函数从内核发送消息,它不会返回任何错误.此外,我没有从防火墙收到任何来自内核模块的来自另一台机器的消息.
这里有类似的问题和例子,但它们对我来说不够用,或者使用了太旧的内核版本的示例.对于骨架我使用了这个,来自UDP套接字:http://people.ee.ethz.ch/~arkeller/ linux/multi/kernel_user_space_howto-3.html.有帮助吗?
用于发送的内核模块代码:
void send_data(unsigned char *data)
{
if(!IS_ERR_OR_NULL(data))
{
int ret;
mm_segment_t oldfs;
struct msghdr message;
struct iovec ioVector;
struct sockaddr_in sendAddr;
sendAddr.sin_family = AF_INET;
sendAddr.sin_addr.s_addr = INADDR_ANY;
//sendAddr.sin_addr.s_addr = in_aton("192.168.1.75");
//here I get port from sk_buff structure that I received.
sendAddr.sin_port = *((unsigned short*)skBuffer->data);
memset(&message, 0, sizeof(message));
message.msg_name = &sendAddr;
message.msg_namelen = sizeof(sendAddr);
/* send the message back */
ioVector.iov_base = data;
ioVector.iov_len = strlen(data); …Run Code Online (Sandbox Code Playgroud)