免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3257 | 回复: 8

硬盘扇区的读写函数及其调用路径 [复制链接]

论坛徽章:
0
发表于 2006-03-17 16:04 |显示全部楼层
硬盘扇区的读写函数及其调用

几种情况下的调用路径

1)
8044 "pdflush" c68be034 {   } | __ide_do_rw_disk | ide_do_rw_disk | start_request | ide_do_request | do_ide_request | __generic_unplug_device | __elv_add_request | __make_request | generic_make_request | submit_bio | mpage_bio_submit | __mpage_writepage | mpage_writepages | ext2_writepages | do_writepages | __sync_single_inode | __writeback_single_inode | generic_sync_sb_inodes | sync_sb_inodes | writeback_inodes | wb_kupdate | __pdflush | pdflush | kthread | kernel_thread_helper

2)
1288 "kjournald" de850034 {   } | __ide_do_rw_disk | ide_do_rw_disk | start_request | ide_do_request | do_ide_request | __generic_unplug_device | generic_unplug_device | blk_backing_dev_unplug | sync_buffer | __wait_on_bit | out_of_line_wait_on_bit | __wait_on_buffer | sync_dirty_buffer | journal_write_commit_record | journal_commit_transaction | kjournald | kernel_thread_helper

3)
4409 "syslog-ng" dccf6034 {   } | __ide_do_rw_disk | ide_do_rw_disk | start_request | ide_do_request | do_ide_request | __generic_unplug_device | cfq_start_queueing | cfq_crq_enqueued | cfq_enqueue | cfq_insert_request | __elv_add_request | __make_request | generic_make_request | submit_bio | submit_bh | __block_write_full_page | block_write_full_page | ext3_ordered_writepage | mpage_writepages | do_writepages | __filemap_fdatawrite_range | filemap_fdatawrite | do_fsync | sys_fsync | sysenter_past_esp

4)
448 "kblockd/0" dfe20034 {   } | __ide_do_rw_disk | ide_do_rw_disk | start_request | ide_do_request | do_ide_request | cfq_kick_queue | worker_thread | kthread | kernel_thread_helper

希望对分析DISK IO的关系有一点帮助。


  1. //in drivers/ide/ide-disk.c
  2. /*
  3. * __ide_do_rw_disk() issues READ and WRITE commands to a disk,
  4. * using LBA if supported, or CHS otherwise, to address sectors.
  5. */

  6. ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq, sector_t block)
  7. {
  8.         ide_hwif_t *hwif        = HWIF(drive);
  9.         unsigned int dma        = drive->using_dma;
  10.         u8 lba48                = (drive->addressing == 1) ? 1 : 0;
  11.         task_ioreg_t command    = WIN_NOP;
  12.         ata_nsector_t           nsectors;

  13.         nsectors.all            = (u16) rq->nr_sectors;


  14.         if (hwif->no_lba48_dma && lba48 && dma) {
  15.                 if (block + rq->nr_sectors > 1ULL << 28)
  16.                         dma = 0;
  17.                 else
  18.                         lba48 = 0;
  19.         }
  20.         ......................
  21. }

复制代码

论坛徽章:
0
发表于 2006-03-17 16:11 |显示全部楼层

回复 1楼 思一克 的帖子

思兄写详细一点呀, 这样些肯定很多人跟偶一样看不懂
象de850034是代表什么呢?

论坛徽章:
0
发表于 2006-03-17 16:14 |显示全部楼层
对不起。

那个是stack地址:
stk = &current_thread_info()->supervisor_stack[0];
没有什么大意义

我写东西是比较弱的,写文章也不行。

论坛徽章:
0
发表于 2006-03-17 16:22 |显示全部楼层
原帖由 思一克 于 2006-3-17 16:14 发表
对不起。

那个是stack地址:
stk = &current_thread_info()->supervisor_stack[0];
没有什么大意义

我写东西是比较弱的,写文章也不行。


目前觉得这几个kernel thread只是请求磁盘I/O的几种情况, 并非全部。 这么理解对吗? 好象mmap和generic_file_read/generic_file_write的调用路径也会最终导致磁盘I/O?

这个部分正在看ULK2, 看的脑袋疼

论坛徽章:
0
发表于 2006-03-17 16:22 |显示全部楼层
原帖由 思一克 于 2006-3-17 16:14 发表
我写东西是比较弱的,写文章也不行。


  很多高手都是这样的, 这叫去小道、存大道

论坛徽章:
0
发表于 2006-03-17 16:25 |显示全部楼层
是的。

generic_file_read 等,如果文件还没有在内存address_space的页中,会导致DISK IO。

论坛徽章:
0
发表于 2006-03-17 16:32 |显示全部楼层
to albcamus,

用户读写文件的情况好象是落入kblockd/0的情况了。

用户进程通过KERNEL发submit_bio, kblockd/0(/1)完成BIO。

论坛徽章:
0
发表于 2006-03-17 16:38 |显示全部楼层
TO ALBCAMUS,

sys_read() 发submit_bio的调用关系是这样的:

stack d62ca034 trace:  submit_bio | mpage_bio_submit | mpage_readpages | ext3_readpages | read_pages | __do_page_cache_readahead | blockable_page_cache_readahead | make_ahead_window | page_cache_readahead | do_generic_mapping_read | __generic_file_aio_read | generic_file_aio_read | do_sync_read | vfs_read | sys_read | sysenter_past_esp

论坛徽章:
0
发表于 2006-10-13 15:31 |显示全部楼层
好帖!!!
问一句楼句,这么深的调用层次,你是怎么跟出来的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP