linux学习之0414


一般来说,无论是C, C++还是pas,首先要把源文件编译成中间代码文件,
在windows下也就是 .obj文件,UNIX下是.o文件,即Objuct File,这个动作
叫做编译(compile)。


设备驱动充当了硬件和应用软件之间的纽带,它使得应用软件只需要调用系统
软件的应用编程接口(API)就可以让硬件去完成要求的工作。


在没有操作系统的情况下,工程师可以自己定义接口。


在有操作系统的情况下,设备驱动的架构则有相应的操作系统定义,驱动工程师
必须按照相应的架构设计设备驱动,这样,设备驱动才能良好地整合到操作系统的
内核中。


应用程序通过write()、read()等函数读写文件就可以访问各种字符设备和块设备,
而不用管设备的具体类型和工作方式。


Linux将存储器和外设分为3个基础大类:
字符设备
块设备
网络设备


字符设备:
指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。


块设备:
可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。


字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。
但是,字符设备和块设备并没有明显的界限,如flash设备符合块设备的特点,
但是我们仍然可以把它作为一个字符设备来访问。






除网络设备外,字符设备与块设备都被映射到Linux 文件系统的
文件和目录,通过文件系统的系统调用接口open()、write()、read()、close()等函数即
可访问字符设备和块设备


应用程序可以使用Linux的系统调用接口编程,也可以使用C库函数,出于代码
可移植性的考虑,后者更值得推荐。C库函数本身也通过系统调用接口而实现,如C
库函数中的fopen()、fwrite()、fread()、fclose()分别会调用操作系统API的open()、write()、
read()、close()函数。


Linux 系统下的LED驱动


light_init() light_on() light_off()
这些函数将被LED驱动中独立于设备的针对内核的接口进行调用。


struct light_dev
{
struct cdev cdev;
unsigned char value;
}


struct light_dev *light_devp;


int light_open(struct inode *inode, struct file *filp)


int light_release(struct inode *inode, struct file *filp)


ssize_t light_read(struct file *filp, char _ _user *buf, size_t count, loff_t*f_pos)


ssize_t light_write(struct file *filp, const char _ _user *buf, size_t count, loff_t *f_pos)


int light_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)


struct file_operations light_fops =
{
 .owner = THIS_MODULE,
 .read = light_read,
 .write = light_write,
 .ioctl = light_ioctl,
 .open = light_open,
 .release = light_release,
};


static void light_setup_cdev(struct light_dev *dev, int index)
/*设备字符设备cdev结构体*/
static void light_setup_cdev(struct light_dev *dev, int index)
/*模块加载函数*/
int light_init(void)
/* 分配设备结构体的内存*/
light_devp = kmalloc(sizeof(struct light_dev), GFP_KERNEL);
/*模块卸载函数*/
void light_cleanup(void)




中央处理器的体系架构可以分为两类,一类为冯.诺依曼结构,一类为哈弗结构。
冯.诺依曼结构:
也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。
程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。


哈弗结构将程序指令和数据分开存储,指令和数据可以有不同的数据宽度。
此外,哈弗结构还采用了独立的程序总线和数据总线,分别作为CPU与每个存储器之间的专用通信路径,
具有较高的指令效率。


中央处理器也可以分为两类,即RISC(精简指令集计算机)和CISC(复杂指令集计算机)。
CSIC 强调增强指令的能力、减少目标代码的数量,但是指令复杂,指令周期长
而RISC强调尽可能减少指令集、指令单周期执行,
但是目标代码会更大。ARM、MIPS、PowerPC等CPU内核都采用了RISC指令集。
目前,RISC和CSIC的融合非常明显。


以太网接口由MAC(以太网媒体接入控制器)和PHY(物理接口收发器)组成。
MAC和PHY之间采用MII(媒体独立接口)连接,

































猜你喜欢

转载自blog.csdn.net/baiyibin0530/article/details/79956204