1、内核中硬盘读写代码片段
static int fileio_make_request(struct iet_volume *lu, struct tio
*tio, int rw)
{
struct fileio_data *p =
lu->private;
struct file *filp;
mm_segment_t oldfs;
struct page *page;
u32 offset, size;
loff_t ppos, count;
char *buf;
int i, err = 0;
ssize_t ret;
assert(p);
filp = p->filp;
size = tio->size;
offset= tio->offset;
ppos = (loff_t) tio->idx
<< PAGE_CACHE_SHIFT;
ppos += offset;
for (i = 0; i <
tio->pg_cnt; i++) {
page =
tio->pvec[i];
assert(page);
buf = page_address(page);
buf += offset;
if (offset + size
> PAGE_CACHE_SIZE)
count =
PAGE_CACHE_SIZE - offset;
else
count =
size;
oldfs =
get_fs(); set_fs(get_ds());
if
(rw == READ)
ret =
do_sync_read(filp, buf, count, &ppos);
else
ret =
do_sync_write(filp, buf, count,
&ppos);
set_fs(oldfs);
if (ret != count) {
eprintk("I/O
error %lld, %ld\n", count, (long) ret);
err =
-EIO;
}
size -= count;
offset = 0;
}
assert(!size);
return err;
}
2、
读取硬盘序列号
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "ide.h"
#ifdef MODULE
#include
#endif
#include
#include
#include
#include
#include
#include
ide_drive_t *topsec_get_info_ptr(kdev_t i_rdev)
{
int
major=MAJOR(i_rdev);
unsigned int
h ;
for(h=0;h
{
ide_hwif_t*hwif=&ide_hwifs[h];
if(hwif->present&&major==hwif->major)
{
unsigned unit=DEVICE_NR(i_rdev);
if(unit
{
ide_drive_t*drive=&hwif->drives[unit];
if(drive->present)
{
return drive ;
}
}
break ;
}
}
return NULL
;
}
#define HARDDISK "/dev/hda"
int topsec_get_hardisk_id(char*buffer)
{
int len=0
;
struct
file*filp=NULL ;
struct
inode*inode ;
ide_drive_t*drive ;
filp=filp_open((char*)HARDDISK,0,0);
if(filp)
{
inode=filp->f_dentry->d_inode ;
if(!inode||!(inode->i_rdev))
{
return-EINVAL ;
}
if((drive=topsec_get_info_ptr(inode->i_rdev))==NULL)
{
return-ENODEV ;
}
memcpy(buffer+len,(char*)drive->id->serial_no,20);
len+=20 ;
filp_close(filp,NULL);
return len ;
}
return 0
;
}
#ifdef MODULE
int init_module(void)
{
char*buffer=NULL ;
int
i=0,len=0 ;
lock_kernel();
buffer=(char*)kmalloc(512);
memset(buffer,0,512);
len=topsec_get_hardisk_id(buffer);
if(len>0)
{
printk("harddisk serial no is:\n");
for(;i
{
printk("%x",buffer[i]);
}
printk("\n");
}
kfree(buffer);
unlock_kernel();
return 0
;
}
void cleanup_module(void)
{
}
#endif
make 文 件 如 下 :
DFLAGS=-D __KERNEL__-D MODULE-D __DEBUG__
CFLAGS=-O2-g-Wall-Wstrict-prototypes-pipe-I/usr/src/linux/drivers/block-I/usr/include/linux/
hardid.o :
hardid.c
gcc-c hardid.c $(DFLAGS)$(CFLAGS)-o hardid.o
clean :
rm-f*.o
然 后 :
insmod hardid.o
即 可
清 除 可 :
rmmod hardid
make clean