加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2010-10-12 15:11:11)
标签:

杂谈

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<linux/errno.h>
#include<linux/mm.h>
#include<linux/string.h>
#include<linux/kernel.h>
#include<linux/major.h>
#include<linux/fs.h>
#include<linux/proc_fs.h>
#include<linux/nfs_fs.h>
#include<linux/nfs_fs_sb.h>
#include<linux/nfs_mount.h>
#include<linux/genhd.h>
#include<linux/netdevice.h>
#include<linux/if_arp.h>
#include<linux/mc146818rtc.h>
#include<linux/smp_lock.h>

#include "ide.h"

#ifdef MODULE

#include<linux/module.h>
#endif

#include<asm/processor.h>
#include<asm/page.h>
#include<asm/smp.h>
#include<asm/param.h>
#include<asm/fcntl.h>
#include<asm/uaccess.h>


ide_drive_t *topsec_get_info_ptr(kdev_t i_rdev)
{
    int major=MAJOR(i_rdev);
    unsigned int h ;
   
    for(h=0;h<MAX_HWIFS;++h)
    {
        ide_hwif_t*hwif=&ide_hwifs[h];
        if(hwif->present&&major==hwif->major)
        {
            unsigned unit=DEVICE_NR(i_rdev);
            if(unit<MAX_DRIVES)
            {
                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<len;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

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有