首页 > 代码库 > disk磁盘管理与Linux驱动编写
disk磁盘管理与Linux驱动编写
磁盘管理
一.关于硬盘接口
安装linux red hat系统,到分区时发现硬盘驱动器设备
/dev/sda #sata接口设备名
/dev/sda1 #sda对应的物理分区
/dev/sda2
/dev/sda3
而又的安装时硬盘驱动设备名为
/dev/hda #IDE接口设备目录
/dev/hda1
sda和hda有什么区别那?
HDA是使用了ide接口的硬盘的名称.SDA是sata接口的硬盘的名称.在最新的2.6.19内核里,所有的硬盘都叫SDA了.
GERUB里填SDA.
硬盘接口分为:
ide (integrated drive electronics) 把盘体和控制器集成在一起
scsi (small computer system interface)
光纤通道 fibre channel
sata (serial ATA(advanced technology attachment))
二.我司硬盘分区及挂载命令:
parted -s /dev/sda mklabel gpt
parted -s /dev/sda mkpart sashdisk ext3 0 100%
echo "y" | /sbin/mkreiserfs /dev/sda1
三.disk硬盘访问的准备步骤:
1.硬盘分区,需要2次分区:需要一次物理分区和一次逻辑分区 (fdisk or parted)
2.将硬盘格式化:即给硬盘格式化合适的文件系统(格式化只能是逻辑分区) (fdisk or parted)
3.将硬盘设备/dev/sda挂载到Linux系统的某个文件目录下/opt/nsfocus/sda1 (mount)
四.硬盘在Linux中映射时的命名规则:
硬盘设备命名为,sas接口为sda/sdb/sdc/...,ide接口为hda/hdb/hdc/...,
针对某一个设备的逻辑分区命名为sda1/sda2/...,或/hda1/hda2/... :表示sda或hda设备的多个分区
fdisk -l 查看当前的物理设备及逻辑和物理分区
df 查看已经挂载的物理设备所挂载在操作系统文件系统下的目录
Linux驱动及内核编译
一、编译Linux内核
1.当前运行系统的Linux版本必须同待编译系统的Linux版本一致
查看内核版本,以及主要和次要版本:
#uname -r
3.5.0-19-generic
要打印系统的体系架构类型,即的机器是32位还是64位,使用:
#uname -p
i686
2.下载与当前系统相同的Linux源码
下载各个版本linux源码https://www.kernel.org/
如机器3.5.0版本源码下载地址为:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.tar.bz2
下载完后,找一个路径解压,如我解压到/linux-3.5/
3.设置源码的次版本号
进入linux源码目录/linux-3.5/,编辑Makefile,将EXTRAVERSION = 修改为EXTRAVERSION= -19-generic,与编译系统的次版本号相同。
这些都是要配置源码的版本号与系统版本号,如果源码版本号和系统版本号不一致,在加载模块的时候会出现如下错误:insmod: error inserting ‘hello.ko‘: -1 Invalid module format。原因很明确:编译时用的hello.ko的kenerl 不是我的pc的kenerl版本。
4.编译Linux内核
执行命令cp /boot/config-3.5.0-19-generic ./config,覆盖原有配置文件。
进入linux源码目录,执行make menuconfig配置内核,执行make编译内核。
二、编译Linux驱动
驱动源码如下:hello.c
/*======================================================================
Asimple kernel module: "hello world"
======================================================================*/
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("zeroboundaryBSD/GPL");
static int hello_init(void){
printk(KERN_INFO"Hello World enter\n");
return0;
}
static void hello_exit(void){
printk(KERN_INFO"Hello World exit\n ");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("zeroboundary");
MODULE_DESCRIPTION("A simple HelloWorld Module");
MODULE_ALIAS("a simplestmodule");
Makefile对源码进行编译
KERN_DIR = /linux-3.5
all:
make-C $(KERN_DIR) M=`pwd` modules
clean:
make-C $(KERN_DIR) M=`pwd` clean
obj-m += hello.o #模块名
module-objs := hello.o [file1.o file2.o] #所有的.o文件
1.编译内核将得到hello.ko,将hello.ko拷贝到目标系统,执行
>insmod hello.ko #需要root权限,将插入模块,此时在内核日志中会有打印输出
>dmesg|tail #查看内核日志
>rmmod hello.ko #可以卸载该驱动
>lsmod #查看已经插入的驱动
>modinfo file
>cat /proc/modules 能够显示驱动模块大小、在内核空间中的地址
>cat /proc/devices 只显示驱动的主设备号,且是分类显示
2.mknod
insmod插入驱动后,查看/dev目录下是否存在对应的节点,如果没有需要创建一个,这样应用程序才能引用
>mknod /dev/hello c 123 0 #创建nod
3.prink的输出(到终端)
# cat /proc/sys/kernel/printk
6 4 1 7
第一个6表示级别高于(小于)6的消息才会被输出到控制台,第二个4表示如果调用printk时没有指定消息级别(宏)则消息的级别为4,第三个1表示接受的最高(最小)级别是1,第四个7表示系统启动时第一个6原来的初值是7。
因此,如果你发现在控制台上看不到你程序中某些printk的输出,请使用echo 8 > /proc/sys/kernel/printk来解决。
4.SAS Linux内核中驱动存放位置 drivers/scsi/
5.硬盘状态查看
lspci -vvv
fdisk -l
6.将驱动编译进内核的方法
a.找到驱动要添加的目录,比如scsi总线驱动 ?/drivers/scsi/
在该目录下新建驱动目录,比如megaraid1
b.将所有与该驱动相关的源文件放在该目录下,比如?/drivers/scsi/megaraid1
并在该目录下添加Makefile和Kconfig 2个文件
c.在Makefile种添加所有的.o文件及模块名,如
obj-$(CONFIG_MEGARAID1_SAS) += megaraid1_sas.o
megaraid1_sas-objs := megaraid1_sas_base.o megaraid1_sas_fusion.o megaraid1_sas_fp.o
很简单。在Kconf下配置该驱动是否需要编译进内核的菜单选项
config MEGARAID1_SAS
tristate "LSI Logic MegaRAID1 SAS RAID1 Module"
depends on PCI && SCSI
help
Module for LSI Logic‘s SAS based RAID1 controllers.
To compile this driver as a module, choose ‘m‘ here.
Module will be called megaraid1_sas
也很简单。该tristate是三态选项:y编译进内核,m手动添加,n不编译
d.回到?/drivers/scsi目录,配置该目录下的Makefile和Kconfig
在Makefile中需要添加megaraid1中的Makefile文件路径
obj-$(CONFIG_MEGARAID1_SAS) += megaraid1/
在Kconfig中需要添加megaraid1中的Kconfig文件路径
source "drivers/scsi/megaraid1/Kconfig"
e.ok啦,回到?/目录进行make,此时会提示配置需要编译的模块,按提示配置即可,
也可以在文件?/include/config/auto.conf中手动配置
本文出自 “tech记录” 博客,谢绝转载!
disk磁盘管理与Linux驱动编写