Linux设备驱动程序学习(1) 字符设备驱动程序
Linux设备驱动程序学习(1)
-字符设备驱动程序
今天进入
《Linux设备驱动程序(第3版)》第三章字符设备驱动程序的学习。
这一章主要通过介绍字符设备
scull(Simple Character Utility for Loading Localities,区域装载的简单字符工具)的
驱动程序编写,来学习Linux设备驱动的基
本知识。scull可以为真正的设备驱动程序提供样板。
一、主设备号和此设备号
主设备号表示设备对应的驱动程序;次设备号由内核使用,用于正确确定
设备文件所指的设备。
内核用dev_t类型(<linux/types.h>
)来保存设备编号,dev_t是一个32位的数,12位表示主设备号,20为表
示次设备号。
在实际使用中,是通过<linux/kdev_t.h>
中
定义的宏来转换格式。
(dev_t)-->主设备号、次设备号
MAJOR(dev_t dev)
MINOR(dev_t dev)
主设备号、次设备号-->(dev_t)
MKDEV(int major,int minor)
建立一个字符设备之前,驱动程序首先要做的事情就是获得设备编号。其这主要函数在<linux/fs.h>
中声明:
int
register_chrdev_region(
dev_t
first,
unsigned
int
count
,
char
*
name)
;
//指定设备编号
int
alloc_chrdev_region(
dev_t *
dev,
unsigned
int
firstminor,
unsigned
int
count
,
char
*
name)
; //动态生成设备编号
void
unregister_chrdev_region(
dev_t first,
unsigned
int
count
)
; //释放设备编号
分配之设备号的最佳方式是:默认采用动态分配,同时保留在加载甚至是编译时指定主设备号的余地。
以下是在scull.c中用来获取主设备好的代码:
if
(
scull_major)
{
dev =
MKDEV(
scull_major,
scull_minor)
;
result =
register_chrdev_region(
dev,
scull_nr_devs,
"scull"
)
;
}
else
{
result =
alloc_chrdev_region(
&
dev,
scull_minor,
scull_nr_devs,
"scull"
);
scull_major = MAJOR(
dev);
}
if (
result < 0) {
printk(
KERN_WARNING "scull: can't get major %d\n"
, scull_major);
return result;
}
在这部分中,比较重要
相关文档:
gnome: 点右键---new Launcher,输入快捷方式的名称,并选择执行的程序即可。
kde: 右键单击桌面的空白处,在弹出的对话框中选“新建-应用程序链接”。再在弹出的窗口中点“执行”,在命令栏中点后面的浏览键,找到相应的程序。再点“常规”,进行取名、更改图标等操作,最后点确定,这样 ......
简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址.
一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包 ......
1.linux 系统调用的基本原理
linux的系统调用形式与POSIX兼容,也是一套C语言函数名的集合。然而,linux系统调用的内部实现方式却与DOC的INT 21H相似,它是经过INT 0X80H软中断进入后,再根据系统调用号分门别类地服务。
从系统分析的角度,linux的系统调用涉及4个方面的问题。
(1)与系统调用有关的 ......
Linux开机过程
1. BIOS:开机主动执行的韧体,会认识第一个可开机的装置;
2. MBR:第一个可开机装置的第一个扇区内的主要启动记录区块,内含开机
管理程序;
3. 开机管理程序(boot loader):一个可读取核心文件来执行的软件;
4. 核心文 ......