- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我只想从硬盘读取一个扇区到内存中的特定页面,这个页面是保留的,没有映射到任何地址映射。我找到了 this solution但我不知道如何将文件转换为 block 设备和扇区。例如,在文件 mm/filemap.c
的函数 do_generic_file_read
中有这一行:
error = mapping->a_ops->readpage(filp, page);
由于目标页面没有任何映射,我不能使用相同的函数,但我需要将 filp 转换为设备和扇区才能生成我自己的 bio 请求。我该怎么做?
编辑 1
我试过这个作为一个可能的解决方案,通过添加这个,它首先计算扇区,然后直接调用 ext2_get_block
来获取设备,然后添加所需的页面位置并提交 bio 请求:
struct page *myPage;
int myRet;
struct buffer_head bh;
struct bio *bio = bio_alloc(GFP_NOIO,1);
myPage = pfn_to_page(Some_Location);
bio_init(bio);
bio->bi_sector = (sector_t)page_offset << (PAGE_CACHE_SHIFT - mapping->host->i_blkbits);
myRet = ext2_get_block(mapping->host, bio->bi_sector, &bh, 0);
bio->bi_bdev = bh.b_bdev;
bio->bi_next = NULL;
bio->bi_size = PAGE_SIZE;
bio_add_page(bio, myPage, PAGE_SIZE, 0);
submit_bio(READ, bio);
这使用函数中现有的地址映射来创建 bio 请求,因为所需的页面没有地址映射。它只有一个问题,submit_bio
行导致了这一点:
[ 4.792142] ------------[ cut here ]------------
[ 4.792892] WARNING: at arch/x86/kernel/pci-nommu.c:63 nommu_map_sg+0xd9/0x100()
[ 4.793674] Hardware name: Standard PC (i440FX + PIIX, 1996)
[ 4.794149] Modules linked in:
[ 4.794607] Pid: 153, comm: kblockd/0 Not tainted 2.6.32.65 #308
[ 4.795077] Call Trace:
[ 4.795545] [<ffffffff81056875>] ? warn_slowpath_common+0x65/0xa0
[ 4.796024] [<ffffffff810380a9>] ? nommu_map_sg+0xd9/0x100
[ 4.796446] [<ffffffff8121ef4a>] ? ide_dma_prepare+0xda/0x180
[ 4.796900] [<ffffffff81219923>] ? do_rw_taskfile+0x253/0x330
[ 4.797532] [<ffffffff8122311c>] ? ide_do_rw_disk+0x22c/0x320
[ 4.797983] [<ffffffff81215c3a>] ? do_ide_request+0x11a/0x600
[ 4.798416] [<ffffffff81051450>] ? __dequeue_entity+0x30/0x40
[ 4.798854] [<ffffffff810519a1>] ? finish_task_switch.constprop.110+0x31/0xc0
[ 4.799391] [<ffffffff8141fdd6>] ? thread_return+0x2a/0x1d4
[ 4.799816] [<ffffffff81052116>] ? check_preempt_wakeup+0x76/0xe0
[ 4.800279] [<ffffffff811a3be0>] ? blk_unplug_work+0x0/0x20
[ 4.800754] [<ffffffff811a5b2a>] ? generic_unplug_device+0x1a/0x30
[ 4.801218] [<ffffffff810661dc>] ? worker_thread+0x13c/0x210
[ 4.802710] [<ffffffff81069cb0>] ? autoremove_wake_function+0x0/0x30
[ 4.804130] [<ffffffff810660a0>] ? worker_thread+0x0/0x210
[ 4.805357] [<ffffffff810660a0>] ? worker_thread+0x0/0x210
[ 4.806356] [<ffffffff81069907>] ? kthread+0x77/0x80
[ 4.807302] [<ffffffff81033eaa>] ? child_rip+0xa/0x20
[ 4.808500] [<ffffffff81069890>] ? kthread+0x0/0x80
[ 4.809060] [<ffffffff81033ea0>] ? child_rip+0x0/0x20
[ 4.809620] ---[ end trace 61d7e1478dbb58eb ]---
后来导致了这个:
[ 4.871857] hda: task_pio_intr: status=0x58 { DriveReady SeekComplete DataRequest }
[ 4.872553] hda: possibly failed opcode: 0x29
[ 4.873346] hda: DMA disabled
[ 4.885478] Clocksource tsc unstable (delta = 115822911 ns)
[ 4.886364] Switching to clocksource jiffies
[ 4.919051] ide0: reset: success
还有这个:
[ 48.957807] hda: lost interrupt
我将此添加到 mm/readahead.c
中的函数 __do_page_cache_readahead
但它可以像 mm/filemap.c
或类似的方式添加功能。也许有人可以解决这个问题!
最佳答案
您计算扇区的方式似乎不错,但我认为您最终不会得到您想要的精确扇区。话虽如此,您完全错误地获取了 block 设备。不要调用 ext2_get_block
,因为它不仅是特定于文件系统的,而且您似乎并不真正理解它的作用,而且它比获取 block 设备的标准方法更令人困惑。相反,只需使用
bio.bi_bdev = I_BDEV(mapping->host);
另外,如果你想测试它并查看它的实际效果,那么只需将它编译成一个模块并设置一个 Hook ,这样当你打开某个 block 设备(你创建的)时它就会触发功能。您当前将其添加到现有函数中的方法可能会干扰内核当前正在做的任何事情,并且会弄乱您的测试。
关于c - 如何在 Linux 内核中使用 bio 请求读取一个扇区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29762313/
总的来说,我对 Linux 内核和操作系统非常感兴趣。我想知道的是,内核的文件类型或扩展名是什么?它显然没有 .exe 或 .out 扩展名,因为它们用于安装在操作系统上的应用程序。 内核只是一个二进
我需要为 Raspbian Linux 内核添加一个自己的系统调用。现在我在搜索了大约 2 天以找到解决方案后陷入困境。 要加一个系统调用,我基本上是按照大纲来的( http://elinux.org
对于一个学术项目,我希望将源文件 (myfile.c) 添加到 kernel/目录,与exit.c相同的目录和 fork.c .构建系统似乎不会自动获取新文件,因为我在 myfile.c 中定义的函数
浏览器排行榜 浏览器市占率排行榜全球榜 。 浏览器市占率排行榜中国榜 -快科技 。 如果按照浏览器内核来看, Chromium 内核的市场占有率无疑是最大的,一家独大
给定一个进程或线程的任务结构,迭代属于同一进程的所有其他线程的习惯用法是什么? 最佳答案 Linux 不区分进程(任务)和线程。库调用 fork() 和 pthread_create() 使用相同的系
我正在用c(不是linux。完全从头开始)从头开始制作一个内核,但我遇到了一些问题。我有这个代码: #include "timer.h" int ms = 0; void timer_handler(
我正在从头开始制作一个 C 内核,我实际上只是从网站上复制了这段代码,因为我的代码无法工作,所以我很困惑。 void kmain(void) { const char *str = "my f
我不确定,如果我完全理解上述差异,所以我想自己解释一下,你可以打断我,只要我有错:“内核是创建内核线程的初始代码段。内核线程是由内核管理的进程。用户线程是进程的一部分。如果你有一个单线程进程,那么整个
看一下struct file 定义from this code Linux 内核版本 2.6.18。 我正在尝试比较代码中的两个 struct file 变量,并确定它们是否指的是同一个文件。该结构中
我试图在 Linux 启动时使嵌入式设备中的 LED 闪烁。基本上,LED 闪烁表明 Linux 正在启动。为了使 LED 闪烁,我正在做以下事情 在 init/main.c 中创建了一个全局定时器(
我有一些在 FreeBSD 和 Linux 上运行的特定硬件。 我必须做一个用户空间应用程序,它将使用内核/用户空间应用程序之间的共享内存与驱动程序一起工作。我的应用程序对来自用户空间的共享内存进行忙
我在哪里可以找到 linux 内核中相应函数的解释,特别是对于 ICMPv4? 例如:icmp_reply、icmp_send等 感谢您的帮助。 最好的,阿里木 最佳答案 探索 Linux 内核中的
我在 Linux Kernel 3.4 上工作,我有以下代码: /* Proximity sensor calibration values */ unsigned int als_kadc;
我正在阅读“罗伯特·洛夫 (Robert Love) 撰写的 Linux 内核开发第 3 版”,以大致了解 Linux 内核的工作原理..(2.6.2.3) 我对等待队列的工作方式感到困惑,例如这段代
我之前也问过同样的问题,但是我的帖子不知为何被删除了。 无论如何,我正在尝试使用 C++ 并编写一个允许我直接访问内存并向其中写入内容的程序。我听说我需要对内核做一些事情,因为它是连接操作系统和应用程
在尝试了解 Ruby 执行方法时,我找到了这篇关于在 Ruby 中运行命令的五种方法的博文 http://mentalized.net/journal/2010/03/08/5_ways_to_run
是否有 Linux 发行版(Minix 除外)包含良好的源代码文档?或者,是否有一些好的文档来描述一般的 Linux 源代码? 我已经下载了内核源代码,但是(不出所料)我有点不知所措,我想知道是否有一
有谁知道 linux 中的哪个函数或文件包含查找用于 bind() 系统调用的随机端口的算法?我到处寻找,在 Linux 源代码中找不到包含此算法的方法。 谢谢! 最佳答案 这是一段又长又复杂的代码,
前言 首先,对于有科班背景的读者,可以跳过本系列文章。这些文章的主要目的是通过简单易懂的汇总,帮助非科班出身的读者理解底层知识,进一步了解为什么在面试中会涉及这些底层问题。否则,某些概念将始终
CentOS7.2与CentOS6区别及特点 Linux 操作系统的启动首先从 BIOS 开始,接下来进入 boot loader,由 bootloader 载入内核,进行内核初始化。内核初始化的
我是一名优秀的程序员,十分优秀!