linux2.6硬盘扇区直接读写程序
下面的程序可以在linux2.6内核直接读写硬盘的指定扇区,也是根据网上一个朋友的做法做了修改的;
有两个不是很明白的地方就是:1、bd_claim函数的使用,这个是个递归函数,像是匹配内存指针和设备,但是调用会返回错误;2、bdev = open_by_devnum(0x00800000, FMODE_READ | FMODE_WRITE); 中0x00800000数字的确认,不知从何而来:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/buffer_head.h>
#include <linux/blkdev.h>
#include <linux/msdos_fs.h>
#include <linux/fcntl.h>
#include <linux/delay.h>
static int set_size = 512;
static int nr = 0;
static char pages_addr[PAGE_SIZE];
static char pages_write_addr[PAGE_SIZE];
module_param(set_size,int,S_IRUGO);
MODULE_PARM_DESC(set_size,"how many bytes you want to read,not more than 4096");
module_param(nr,long,S_IRUGO);
MODULE_PARM_DESC(nr,"which sectors you want to read");
MODULE_LICENSE("GPL");
static struct block_device *bdev;
static char *usage = "You can change the value:set_size nr devn";
int bdev_write_one_page(struct block_device *bdev, unsigned long blocknr, void *page_addr)
{
int ret = -1;
struct buffer_head *bh;
if (!bdev || !page_addr)
{
printk("%s error ", __func__);
return -1;
}
bh = __getblk(bdev, blocknr, PAGE_SIZE);
if (!bh)
{
printk("get blk failed ");
return -1;
}
memcpy(bh->b_data, page_addr, PAGE_SIZE);
mark_buffer_dirty(bh);
ll_rw_block(WRITE, 1, &bh);
brelse(bh);
ret = 0;
return ret;
}
int bdev_read_one_page(struct block_device *bdev, unsigned long blocknr, void *page_addr)
{
int ret = -1;
struct buffer_head *bh;
if (!bdev || !page_addr)
{
printk("%s error ", __func__);
return -1;
}
bh = __getblk(bdev, blocknr, PAGE_SIZE);
if (!bh)
{
printk("get blk failed ");
return -1;
}
if (!buffer_uptodate(bh))
{
ll_rw_block(READ, 1, &bh);
wait_on_buffer(bh);
if (!buffer_uptodate(bh))
{
ret = -1;
goto out;
}
}
memcpy(page_addr, bh->b_data, PAGE_SIZE);
ret = 0;
out:
brelse(bh);
return ret;
}
void block_test(void)
{
struct block_device *bdev;
// void *pages_addr = (void *)kmalloc(2048,GFP_KERNEL);
void *holder = (void *)pages_addr;
int cnt, ret;
int blocknr;
//bdev = bdget(MKDEV(16, 0));
int i = 0;
printk("block_test:IN ---------2010-03-22\n");
//memset(pages_addr,0x00,sizeof(pages_addr));
printk("pages_addr:%x\n",pages_addr);
printk("holder:%x\n",holder);
#if 1
bdev = open_by_devnum(0x00800000, FMODE_READ | FMODE_WRITE);
// bdev=0x800;
if (IS_ERR(bdev))
{
printk("bdget error, bdev=%08lx \n", (unsigned long)bdev);
return;
}
printk("bdev:%x\n",bdev);
bdev->bd_holder = holder;
#if 0
if (bd_claim(bdev, holder))
{
printk("claim failed \n");
goto out_bdev;
}
printk("after bd_claim\n");
#endif
#if 0
// blocknr = *(unsigned long *)(pages_addr + 0x100000);
//for (cnt = 0; cnt < 10 * 1024; cnt++, blocknr++)
{
printk("nr=%d\n",nr);
memset(pages_addr,0xff,PAGE_SIZE);
ret = bdev_read_one_page(bdev,nr, (void *)pages_addr);
if (ret)
printk("blk read failed ");
}
printk("after bdev_read_one_page\n");
// printk("get data:%0x,%0x\n,",pages_addr[510],pages_addr[511]);
for( i = 0; i < 512; i++ )
{
printk( "%02x ",(unsigned char)pages_addr[ i ] );
if(( i % 16 ) == 15)
{
printk( " \n" );
}
}
printk( " \n" );
printk("nr=%d\n",nr);
memset(pages_write_addr,0xe7,PAGE_SIZE);
ret = bdev_write_one_page(bdev,nr, (void *)pages_write_addr);
if (ret)
printk("blk write failed ");
#endif
{
printk("nr=%d\n",nr);
ret = bdev_read_one_page(bdev,nr, (void *)pages_addr);
if (ret)
printk("blk read failed ");
}
printk("after bdev_read_one_page\n");
// printk("get data:%0x,%0x\n,",pages_addr[510],pages_addr[511]);
for( i = 0; i < 512; i++ )
{
printk( "%02x ",(unsigned char)pages_addr[ i ] );
if(( i % 16 ) == 15)
{
printk( " \n" );
}
}
printk( " \n" );
out_bdev:
// bd_release(bdev);
// blkdev_put(bdev,FMODE_READ | FMODE_WRITE);
blkdev_put(bdev);
#endif
return;
}
static int __init disk_rw_init(void)
{
// nr = 0;
// set_size = PAGE_SIZE;
block_test();
return 0;
}
static void __exit disk_rw_exit(void)
{
printk("disk_rw_exit\n");
}
module_init(disk_rw_init);
module_exit(disk_rw_exit);
Makefile:
ifneq ($(KERNELRELEASE),)
obj-m:=hw_disk_rw26.o
else
KDIR =/usr/src/linux-2.6.33
# KDIR = /usr/src/kernels/2.6.9-5.EL-i686
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
install:
insmod hw_disk_rw26.ko
uninstall:
rmmod hw_disk_rw26.ko
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
endif
linux2.6硬盘扇区直接读写程序的更多相关文章
- C语言编写的bmp读写程序
C语言编写的bmp读写程序 建议先把bmp的数据存储格式了解下 <span style="font-size:16px;">#include "Windows ...
- 获取硬盘序列号的Fortran程序
以前写了个获取硬盘序列号的fortran程序,但未经实证 program FortranDemo Use Kernel32 Implicit None Interface SUBROUTINE Get ...
- 分配粒度和内存页面大小(x86处理器平台的分配粒度是64K,内存页是4K,所以section都是0x1000对齐,硬盘扇区大小是512字节,所以PE文件默认文件对齐是0x200)
分配粒度和内存页面大小 x86处理器平台的分配粒度是64K,32位CPU的内存页面大小是4K,64位是8K,保留内存地址空间总是要和分配粒度对齐.一个分配粒度里包含16个内存页面. 这是个概念,具体不 ...
- WIN32和Kernel)直接读写硬盘扇区
第一篇写技术的文章哦,以前好少写文章,我的文字表达很差劲,大家不要笑哦.前几天仙剑4通关了,感觉好惆怅,什么都不想去做.今天看了一下书发现一篇比较好玩的文章,于是自己静静地实践一番.文章是<基于 ...
- MSP430的IO口模拟I2C总线对AT24C25进行读写程序
功能: 实现MSP430口线模拟I2C总线协议与24C04通信. ** 描述: 主系统工作时钟为12MHz,I2C工 ...
- 一个简单的mfc单页界面文件读写程序(MFC 程序入口和执行流程)
参考:MFC 程序入口和执行流程 http://www.cnblogs.com/liuweilinlin/archive/2012/08/16/2643272.html 程序MFCFlie ...
- How to fix 'sudo: no tty present and no askpass program'以及硬盘序列号的读写
在调用system命令读写硬盘序列号的过程中遇到问题,报错如下: sudo: no tty present and no askpass program 发现此问题是由于帐号并没有开启免密码导致的 . ...
- CPU卡读写程序
CPU卡也称智能卡,卡内的集成电路中带有微处理器CPU.存储单元(包括随机存储器RAM.程序存储器ROM以及芯片操作系统COS.装有COS的CPU卡相当于一台微型计算机,不仅具有数据存储功能,同时具有 ...
- Excel 读写程序 C#源代码下载
http://u.163.com/lNaJAjOz 提取码: E4ZHjnfD
随机推荐
- iOS-硬件授权检测【通讯录、相机、相册、日历、麦克风、定位授权】
总结下几个常用到的获取手机权限,从iOS8以后,获取手机某种权限需要在info.plist文件中添加权限的描述文件 <key>NSContactsUsageDescription</ ...
- iOS-NSPredicate正则验证【三种验证方法】
1.NSPredicate验证(谓词匹配) ///验证(string:验证的字符串) + (BOOL)stringValidate:(NSString *)string{ NSString *regu ...
- 《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识
从之前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),我们可以看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获 ...
- ZOJ 3557 & BZOJ 2982 combination[Lucas定理]
How Many Sets II Time Limit: 2 Seconds Memory Limit: 65536 KB Given a set S = {1, 2, ..., n}, n ...
- 浅析Numpy.genfromtxt及File I/O讲解
Python 并没有提供数组功能,虽然列表 (list) 可以完成基本的数组功能,但它并不是真正的数组,而且在数据量较大时,使用列表的速度就会慢的让人难受.为此,Numpy 提供了真正的数组功能,以及 ...
- 「POJ2505」A multiplication game [博弈论]
题目链接:http://poj.org/problem?id=2505 题目大意: 两个人轮流玩游戏,Stan先手,数字 p从1开始,Stan乘以一个2-9的数,然后Ollie再乘以一个2-9的数,直 ...
- WinSock IOCP 模型总结(附一个带缓存池的IOCP类)
前言 本文配套代码:https://github.com/TTGuoying/IOCPServer 由于篇幅原因,本文假设你已经熟悉了利用Socket进行TCP/IP编程的基本原理,并且也熟练的掌握了 ...
- iOS图片轮播
基于ScrollView的图片播放 ScrollView的方法 NSTime的循环 UIPageControl的运用 委托方法 基于iphone5 未做屏幕的适配 import "ViewC ...
- ps调整文字平滑
1. 选中文字 2. 调整字体样式,选择"平滑"
- HDU 3001(状态压缩dp)
状态压缩dp的第一题! 题意:Mr ACMer想要进行一次旅行,他决定访问n座城市.Mr ACMer 可以从任意城市出发,必须访问所有的城市至少一次,并且任何一个城市访问的次数不能超过2次.n座城市间 ...