linux内核识别硬盘顺序,在linux内核中硬盘读写操作--读取硬盘序列号

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值