UNIX下设备驱动程序的基本结构

Linux·设备驱动 阅读详情
在UNIX系统里,对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说是把设备映射为一个特殊的设备文件,用户程序可以象对其它文件一样对此设备文件进行操作。UNIX对硬件设备支持两个标准接口:块特别设备文件和字符特别设备文件,通过块(字符)特别设备文件存取的设备称为块(字符)设备或具有块(字符)设备接口。块设备接口仅支持面向块的I/O操作,所有I/O操作都通过在内核地址空间中的I/O缓冲区进行,它可以支持几乎任意长度和任意位置上的I/O请求,即提供随机存取的功能。

  字符设备接口支持面向字符的I/O操作,它不经过系统的快速缓存,所以它们负责管理自己的缓冲区结构。字符设备接口只支持顺序存取的功能,一般不能进行任意长度的I/O请求,而是限制I/O请求的长度必须是设备要求的基本块长的倍数。显然,本程序所驱动的串行卡只能提供顺序存取的功能,属于是字符设备,因此后面的讨论在两种设备有所区别时都只涉及字符型设备接口。设备由一个主设备号和一个次设备号标识。主设备号唯一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱动程序解释,一般用于识别在若干可能的硬件设备中,I/O请求所涉及到的那个设备。

  设备驱动程序可以分为三个主要组成部分:

(1) 自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和是否能正常工作。如果该设备正常,则对这个设备及其相关的、设备驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化的时候被调用一次。
(2) 服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分是由于系统调用的结果。这部分程序在执行的时候,系统仍认为是和进行调用的进程属于同一个进程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因此可以在其中调用sleep()等与进程运行环境有关的函数。
(3) 中断服务子程序,又称为驱动程序的下半部分。在UNIX系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由UNIX系统来接收硬件中断,再由系统调用中断服务子程序。中断可以产生在任何一个进程运行的时候,因此在中断服务程序被调用的时候,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序的时候,都带有一个或多个参数,以唯一标识请求服务的设备。
  在系统内部,I/O设备的存取通过一组固定的入口点来进行,这组入口点是由每个设备的设备驱动程序提供的。一般来说,字符型设备驱动程序能够提供如下几个入口点:
(1) open入口点。打开设备准备I/O操作。对字符特别设备文件进行打开操作,都会调用设备的open入口点。open子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备处于忙状态。
(2) close入口点。关闭一个设备。当最后一次使用设备终结后,调用close子程序。独占设备必须标记设备可再次使用。
(3) read入口点。从设备上读数据。对于有缓冲区的I/O操作,一般是从缓冲区里读数据。对字符特别设备文件进行读操作将调用read子程序。
(4) write入口点。往设备上写数据。对于有缓冲区的I/O操作,一般是把数据写入缓冲区里。对字符特别设备文件进行写操作将调用write子程序。
(5) ioctl入口点。执行读、写之外的操作。
(6) select入口点。检查设备,看数据是否可读或设备是否可用于写数据。select系统调用在检查与设备特别文件相关的文件描述符时使用select入口点。如果设备驱动程序没有提供上述入口点中的某一个,系统会用缺省的子程序来代替。对于不同的系统,也还有一些其它的入口点。

3.2、LINUX系统下的设备驱动程序

  具体到LINUX系统里,设备驱动程序所提供的这组入口点由一个结构来向系统进行说明,此结构定义为:
#include <linux/fs.h>
struct file_operations {
int (*lseek)(struct inode *inode,struct file *filp,
off_t off,int pos);
int (*read)(struct inode *inode,struct file *filp,
char *buf, int count);
int (*write)(struct inode *inode,struct file *filp,
char *buf,int count);
int (*readdir)(struct inode *inode,struct file *filp,
struct dirent *dirent,int count);
int (*select)(struct inode *inode,struct file *filp,
int sel_type,select_table *wait);
int (*ioctl) (struct inode *inode,struct file *filp,
unsigned int cmd,unsigned int arg);
int (*mmap) (void);

int (*open) (struct inode *inode, struct file *filp);
void (*release) (struct inode *inode, struct file *filp);
int (*fsync) (struct inode *inode, struct file *filp);
};
其中,struct inode提供了关于特别设备文件/dev/driver(假设此设备名为driver)的信息,它的定义为:
#include <linux/fs.h>
struct inode {
dev_t i_dev;
unsigned long i_ino; /* Inode number */
umode_t i_mode; /* Mode of the file */
nlink_t i_nlink;
uid_t i_uid;
gid_t i_gid;
dev_t i_rdev; /* Device major and minor numbers*/
off_t i_size;
time_t i_atime;
time_t i_mtime;
time_t i_ctime;
unsigned long i_blksize;
unsigned long i_blocks;
struct inode_operations * i_op;
struct super_block * i_sb;
struct wait_queue * i_wait;
struct file_lock * i_flock;
struct vm_area_struct * i_mmap;
struct inode * i_next, * i_prev;
struct inode * i_hash_next, * i_hash_prev;
struct inode * i_bound_to, * i_bound_by;
unsigned short i_count;
unsigned short i_flags; /* Mount flags (see fs.h) */
unsigned char i_lock;
unsigned char i_dirt;
unsigned char i_pipe;
unsigned char i_mount;
unsigned char i_seek;
unsigned char i_update;
union {
struct pipe_inode_info pipe_i;
struct minix_inode_info minix_i;
struct ext_inode_info ext_i;
struct msdos_inode_info msdos_i;
struct iso_inode_info isofs_i;
struct nfs_inode_info nfs_i;
} u;
};

struct file主要用于与文件系统对应的设备驱动程序使用。当然,其它设 备驱动程序也可以使用它。它提供关于被打开的文件的信息,定义为:
#include <linux/fs.h>
struct file {
mode_t f_mode;
dev_t f_rdev; /* needed for /dev/tty */
off_t f_pos; /* Curr. posn in file */
unsigned short f_flags; /* The flags arg passed to open */
unsigned short f_count; /* Number of opens on this file */
unsigned short f_reada;
struct inode *f_inode; /* pointer to the inode struct */
struct file_operations *f_op;/* pointer to the fops struct*/
};

  在结构file_operations里,指出了设备驱动程序所提供的入口点位置,分别是:
(1) lseek,移动文件指针的位置,显然只能用于可以随机存取的设备。
(2) read,进行读操作,参数buf为存放读取结果的缓冲区,count为所要读取的数据长度。返回值为负表示读取操作发生错误,否则返回实际读取 的字节数。对于字符型,要求读取的字节数和返回的实际读取字节数都必 须是inode->i_blksize的的倍数。
(3) write,进行写操作,与read类似。
(4) readdir,取得下一个目录入口点,只有与文件系统相关的设备驱动程序 才使用。
(5) selec,进行选择操作,如果驱动程序没有提供select入口,select操作将会认为设备已经准备好进行任何的I/O操作。
(6) ioctl,进行读、写以外的其它操作,参数cmd为自定义的的命令。
(7) mmap,用于把设备的内容映射到地址空间,一般只有块设备驱动程序使用。
( open,打开设备准备进行I/O操作。返回0表示打开成功,返回负数表 示失败。如果驱动程序没有提供open入口,则只要/dev/driver文件存在就认为打开成功。
(9) release,即close操作。设备驱动程序所提供的入口点,在设备驱动程序初始化的时候向系统进行登 记,以便系统在适当的时候调用。LINUX系统里,通过调用register_chrdev 向系统注册字符型设备驱动程序。register_chrdev定义为:
#include <linux/fs.h>
#include <linux/errno.h>
int register_chrdev(unsigned int major, const char *name,
struct file_operations *fops);
  其中,major是为设备驱动程序向系统申请的主设备号,如果为0则系统为此 驱动程序动态地分配一个主设备号。name是设备名。fops就是前面所说的对各个 调用的入口点的说明。此函数返回0表示成功。返回-EINVAL表示申请的主设备号 非法,一般来说是主设备号大于系统所允许的最大设备号。返回-EBUSY表示所申 请的主设备号正在被其它设备驱动程序使用。如果是动态分配主设备号成功,此函数将返回所分配的主设备号。如果register_chrdev操作成功,设备名就会出现在/proc/devices文件里。
  初始化部分一般还负责给设备驱动程序申请系统资源,包括内存、中断、时 钟、I/O端口等,这些资源也可以在open子程序或别的地方申请。在这些资源不 用的时候,应该释放它们,以利于资源的共享。 在UNIX系统里,对中断的处理是属于系统核心的部分,因此如果设备与系
统之间以中断方式进行数据交换的话,就必须把该设备的驱动程序作为系统核心的一部分。设备驱动程序通过调用request_irq函数来申请中断,通过free_irq 来释放中断。它们的定义为:
#include <linux/sched.h>
int request_irq(unsigned int irq,
void (*handler)(int irq,void dev_id,struct pt_regs *regs),
unsigned long flags,
const char *device,
void *dev_id);
void free_irq(unsigned int irq, void *dev_id);

参数说明:

  参数irq表示所要申请的硬件中断号。handler为向系统登记的中断处理子程序,中断产生时由系统来调用,调用时所带参数irq为中断号,dev_id为申 请时告诉系统的设备标识,regs为中断发生时寄存器内容。device为设备名, 将会出现在/proc/interrupts文件里。flag是申请时的选项,它决定中断处理 程序的一些特性,其中最重要的是中断处理程序是快速处理程序(flag里设置了SA_INTERRUPT)还是慢速处理程序(不设置SA_INTERRUPT),快速处理程序 运行时,所有中断都被屏蔽,而慢速处理程序运行时,除了正在处理的中断外, 其它中断都没有被屏蔽。在LINUX系统中,中断可以被不同的中断处理程序共享, 这要求每一个共享此中断的处理程序在申请中断时在flags里设置SA_SHIRQ, 这些处理程序之间以dev_id来区分。如果中断由某个处理程序独占,则dev_id 可以为NULL。request_irq返回0表示成功,返回-INVAL表示irq>15或 handler==NULL,返回-EBUSY表示中断已经被占用且不能共享。作为系统核心的一部分,设备驱动程序在申请和释放内存时不是调用malloc 和free,而代之以调用kmalloc和kfree,它们被定义为:
#include <linux/kernel.h>
void * kmalloc(unsigned int len, int priority);
void kfree(void * obj);
  参数len为希望申请的字节数,obj为要释放的内存指针。priority为分配内存操 作的优先级,即在没有足够空闲内存时如何操作,一般用GFP_KERNEL。与中断和内存不同,使用一个没有申请的I/O端口不会使CPU产生异常,也 就不会导致诸如“segmentation fault"一类的错误发生。任何进程都可以访问任何一个I/O端口。此时系统无法保证对I/O端口的操作不会发生冲突,甚至会 因此而使系统崩溃。因此,在使用I/O端口前,也应该检查此I/O端口是否已有别的程序在使用,若没有,再把此端口标记为正在使用,在使用完以后释放它。
这样需要用到如下几个函数:
int check_region(unsigned int from, unsigned int extent);
void request_region(unsigned int from, unsigned int extent,
const char *name);
void release_region(unsigned int from, unsigned int extent);
  调用这些函数时的参数为:from表示所申请的I/O端口的起始地址;extent为所要申请的从from开始的端口数;name为设备名,将会出现在/proc/ioports文件里。check_region返回0表示I/O端口空闲,否则为正在被使用。在申请了I/O端口之后,就可以如下几个函数来访问I/O端口:
#include <asm/io.h>
inline unsigned int inb(unsigned short port);
inline unsigned int inb_p(unsigned short port);
inline void outb(char value, unsigned short port);
inline void outb_p(char value, unsigned short port);
  其中inb_p和outb_p插入了一定的延时以适应某些慢的I/O端口。 在设备驱动程序里,一般都需要用到计时机制。在LINUX系统中,时钟是由系统接管,设备驱动程序可以向系统申请时钟。与时钟有关的系统调用有:
#include <asm/param.h>
#include <linux/timer.h>
void add_timer(struct timer_list * timer);
int del_timer(struct timer_list * timer);
inline void init_timer(struct timer_list * timer);
struct timer_list的定义为:
struct timer_list {
struct timer_list *next;
struct timer_list *prev;
unsigned long expires;
unsigned long data;
void (*function)(unsigned long d);
};
  其中expires是要执行function的时间。系统核心有一个全局变量JIFFIES 表示当前时间,一般在调用add_timerjiffies=JIFFIES+num,表示在num个 系统最小时间间隔后执行function。系统最小时间间隔与所用的硬件平台有关, 在核心里定义了常数HZ表示一秒内最小时间间隔的数目,则num*HZ表示num 秒。系统计时到预定时间就调用function,并把此子程序从定时队列里删除, 因此如果想要每隔一定时间间隔执行一次的话,就必须在function里再一次调 用add_timer。function的参数d即为timer里面的data项。
  在设备驱动程序里,还可能会用到如下的一些系统函数:
#include <asm/system.h>
#define cli() __asm__ __volatile__ ("cli":)
#define sti() __asm__ __volatile__ ("sti":)
这两个函数负责打开和关闭中断允许。
#include <asm/segment.h>
void memcpy_fromfs(void * to,const void * from,unsigned long n);
void memcpy_tofs(void * to,const void * from,unsigned long n);
  在用户程序调用read 、write时,因为进程的运行状态由用户态变为核心态,地址空间也变为核心地址空间。而read、write中参数buf是指向用户程序的私有地址空间的,所以不能直接访问,必须通过上述两个系统函数来访问用户程序的私有地址空间。memcpy_fromfs由用户程序地址空间往核心地址空间复制,memcpy_tofs则反之。参数to为复制的目的指针,from为源指针,n 为要复制的字节数。
  在设备驱动程序里,可以调用printk来打印一些调试信息,用法与printf 类似。printk打印的信息不仅出现在屏幕上,同时还记录在文件syslog里。

3.3、LINUX系统下的具体实现
  在LINUX里,除了直接修改系统核心的源代码,把设备驱动程序加进核心里 以外,还可以把设备驱动程序作为可加载的模块,由系统管理员动态地加载它, 使之成为核心地一部分。也可以由系统管理员把已加载地模块动态地卸载下来。 LINUX中,模块可以用C语言编写,用gcc编译成目标文件(不进行链接,作 为*.o文件存在),为此需要在gcc命令行里加上-c的参数。在编译时,还应该在 gcc的命令行里加上这样的参数:-D__KERNEL__ -DMODULE。由于在不链接时, gcc只允许一个输入文件,因此一个模块的所有部分都必须在一个文件里实现。编译好的模块*.o放在/lib/modules/xxxx/misc下(xxxx表示核心版本,如 在核心版本为2.0.30时应该为/lib/modules/2.0.30/misc),然后用depmod -a 使此模块成为可加载模块。模块用insmod命令加载,用rmmod命令来卸载,并可 以用lsmod命令来查看所有已加载的模块的状态。
  编写模块程序的时候,必须提供两个函数,一个是int init_module(void), 供insmod在加载此模块的时候自动调用,负责进行设备驱动程序的初始化工作。 init_module返回0以表示初始化成功,返回负数表示失败。另一个函数是void cleanup_module (void),在模块被卸载时调用,负责进行设备驱动程序的清除 工作。
  在成功的向系统注册了设备驱动程序后(调用register_chrdev成功后), 就可以用mknod命令来把设备映射为一个特别文件,其它程序使用这个设备的时候,只要对此特别文件进行操作就行了。

Dify工作流教程|以抓取网页并更新知识库为例详细讲解工作流编排过程(附DSL文件) {"name": "{新建的title变量}","text": "新建的content变量","indexing_technique": "high_quality","process_rule": {"mode": "automatic"}}有没有很痛苦,明明添加书签的网页,当你想阅读的时候,总是找不到或者好不容易找到了,发现网页404了。如果有个小工具,直接能把你输入的链接内容抓取下来,并且加入到你的知识库中,你说他香不香。无法获取授权的,也可以使用网页抓取工具,这个是免费的,抓取效果也可以。 阅读详情

相关推荐

《数学建模与数学实验》第5版 线性规划 习题3.4

1. 某鸡场有1000只鸡,用动物饲料和谷物混合喂养. 2. 某工厂用A1,A2两台机床加工B1,B2,B3三种不同零件. 3. 某工厂利用两种原料甲、乙生产$A_1、A_2、A_3$三种产品. 4. 每班的护士在值班开始时向病房报到,连续工作8个小时. 5. 某工厂生产 A1 、A2 两种型号的产品 6. 有两个煤厂A,B 7. 某工厂制造三种产品,生产这三种产品需要三种资源 8. 已知某工厂计划生产1,2,3三种产品,各产品需要在ABC设备加工。...

hexiaosi_的博客 2万+

蜕变成蝶~Linux设备驱动之字符设备驱动

一、linux系统将设备分为3类:字符设备、块设备、网络设备。使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。 块设备:是指可以从设备的任意位置读取一定长度数据的设备。块设备包括硬盘、磁盘、U盘和SD卡等。   每一个字符设备或...

weixin_34161064的博客 237

unity中简单全景搭建

全景场景能够直观的展现一部分区域的全貌,在全景场景中我们能360°观看周围的景象,仿佛自身就在这个场景中,在场景的外部,我们能发现场景就是一个密封的球体,我们是处在球体的内部观察周围,在球内部观察四周看到的都是球的内表面,所以我们看到的全景其实就是贴在密封球体内的一张全景图片。接下来要介绍的就是如何在unity中用一个球体来搭建全景场景。

qq_31791999的博客 3637

UNIX下设备驱动程序的基本结构[zz]

武汉白云黄鹤站∶精华区发信人: aol (色拉油), 信区: WinDrvProgram 标  题: UNIX下设备驱动程序的基本结构[zz] 发信站: 武汉白云黄鹤站 (2001年05月13日19:54:12 星期天), 转信  UNIX下设备驱动程序的基本结构 作者:rose 作者:rose 转自:Linux之家   在UNIX系统里,对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不

zheng80037的专栏 1548

别再乱装了!Win10下NVIDIA显卡驱动、CUDA 11.0和cuDNN 8.0.5保姆级配置指南(含版本匹配避坑)

本文提供Win10下NVIDIA显卡驱动、CUDA 11.0和cuDNN 8.0.5的保姆级配置指南,详细解析版本匹配逻辑与安装步骤。从驱动选择到环境变量配置,再到框架测试,手把手教你避开常见坑点,确保深度学习环境一次配置成功。特别强调版本匹配的重要性,帮助开发者高效搭建GPU开发环境。

weixin_30600197的博客 307

5G时代必知:LDPC与Polar码实战解析(附MATLAB仿真代码)

本文深入解析5G时代核心信道编码技术LDPC码与Polar码的原理差异及性能表现,通过MATLAB仿真代码展示其在实际通信系统中的应用。LDPC码适用于大数据块高速传输,而Polar码在小数据块低时延场景表现优异,帮助开发者优化5G系统设计。

sugar的博客 642

linux系统下的打印机驱动下载,用于UNIX&Linux系统的打印机驱动程序-Lexmark.PDF

用于UNIX用于 UNIX & Linux 系统的打印机驱动程序2008 年 9 月目录了解打印机驱动程序5在 UNIX 和 Linux 中使用打印机驱动程序5安装打印机驱动程序6在安装打印机驱动程序之前6支持的操作系统6系统要求7在 HP-UX 上安装7在 IBM AIX 上安装8在 Red Hat 、Red Flag、Linpus 或 SUSE Linux 上安装8在 Linspire...

weixin_39833469的博客 1057

一站式讲解Wireshark网络抓包分析的若干场景、过滤条件及分析方法

本文详细讲解常用的抓包工具、抓包分析的网络场景、分析抓包时的多种过滤条件以及如何结合常用的协议去分析排查问题,给大家提供一个借鉴或参考。

dvlinker的技术专栏 5万+

UNIX下设备驱动程序的基本结构(转)

UNIX下设备驱动程序的基本结构(转)[@more@]  在UNIX系统里,对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说是把设备映射为一个特殊的设备文件,用户程序可以象对其它文件一样...

179

基于simulink的BMS系统中电池单体故障隔离与恢复建模

本文介绍了使用Simulink构建BMS电池单体故障诊断与容错控制模型的方法。主要内容包括:1)搭建12串锂电池组模型;2)实现单体故障注入(过压、断线等);3)设计故障诊断与隔离模块(采用Stateflow状态机);4)开发恢复判断逻辑(需满足电压、温度等条件);5)系统监控与仿真设置。文章还提供了工程实践建议,如防环流设计、通信冗余等,并指出进阶方向(多故障处理、AI预警等)。该模型适用于新能源汽车、储能系统的BMS设计,可提高系统可靠性和安全性。

xiaoheshang_123的博客 140

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1220

LINUX下的设备驱动程序

<br /><br />(转)  <br />1、UNIX下设备驱动程序的基本结构<br />在UNIX系统里,对用户程序而言,设备驱动程序隐藏了设备的具体细节,<br />对各种不同设备提供了一致的接口,一般来说是把设备映射为一个特殊的设备文<br />件,用户程序可以象对其它文件一样对此设备文件进行操作。UNIX对硬件设备<br />支持两个标准接口:块特别设备文件和字符特别设备文件,通过块(字符)特别<br />设备文件存取的设备称为块(字符)设备或具有块(字符)设备接口。<br />块设备接口仅支

GEN216IUS的专栏 1172

YOLOv11改进策略【独家融合改进】| MobileNetV4+BiFPN,轻松实现降参涨点,适用专栏内所有的骨干替换

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 2361

学习linux/unix编程方法的建议

建议学习路径:  首先先学学编辑器,vim, emacs什么的都行。然后学make file文件,只要知道一点就行,这样就可以准备编程序了。   然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺...

cuannie5802的博客 113

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Unix操作系统设备驱动程序浅谈

【e良师益友网】在Unix操作系统内部,I/O设备的存取通过一组固定的入口点来进行,这组入口点是由每个设备的设备驱动程序提供的。一般来说,字符型设备驱动程序能够提供如下几个入口点: 1、open入口点。打开设备准备I/O操作。对字符特别设备文件进行打开操作,都会调用设备的open入口点。open子程序必须对将要进行的I/O操作做 好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只...

weixin_34235105的博客 193

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Linux笔记01: Linux简介

Linux内核最初是由李纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学读书时出于个人爱好而编写的。第一个版本于1991年9月发布,当时仅有10000行代码。李纳斯·托瓦兹公开了Linux源代码,并邀请他人一起完善Linux。与Windows及其他有专利权的操作系统不同,任何人都可以免费使用Linux。据估计,现在只有2%的Linux核心代码是由李纳斯·托瓦兹自己编写的,可以说现在大家所使用的Linux,是由李纳斯·托瓦兹和后续加入的众多Linux爱好者共同开发完成的。

LaytonWang的博客 334

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ioctl函数的用法

ioctl 是 Unix/Linux 系统中用于设备控制的‌核心系统调用‌

zhaominyong的专栏 1355

第一章--绪论

本文作为第一章--绪论,主要讲述: 1、操作系统基本概念。 2、Unix文件系统概述。 3、Unix内核概述。

辉辉308 1116

SCO UNIX 下设备驱动程序开发

SCO UNIX 下设备驱动程序开发 实达集团公司 李巧霞 一.相关概念---- 1设备号和设备驱动程序 ---- 设备号是一个数字,他是设备的标志。这些设备在系统上有对应的特殊文件存在。设备号由两部分组成,即主设备号和次设备号,高字节为主设备号和底字节为次设备号.主设备号标志设备的类型,它告诉核心有哪个驱动程序来处理该设备的请求,次设备号由相应的设备驱动程序解释,它标志着某个具体

Angus_Li的专栏 1447

设备驱动程序

什么是设备驱动程序? 设备驱动程序,顾名思义,就是直接驱动I/O设备进行输入或输出操作的软件。它属于与设备控制器直接联系的I/O软件部分。它与具体的I/O设备直接相关,并针对每个特定的I/O设备进行优化。设备控制程序通常由设备制造商提供,但归属于操作系统内核。正因为这一属性,设备驱动程序是操作系统安全的一个巨大隐患。 由于需要直接驱动设备的运行,设备驱动程序必须清楚设备的所有细节。例如,磁盘驱动程序必须清楚什么是扇面、磁道、磁柱、磁头、磁臂、电机和电机驱动等信息;鼠标驱动程序需要具备辨认按下哪个键的能力。

鸭梨的博客 2421

一文读懂如何在 Linux 中编写设备驱动程序

我现在将继续修改我刚刚创建的驱动程序,以开发一个真正在真实设备上执行操作的驱动程序。我将使用简单而无处不在的计算机并行端口,驱动程序将被称为 parlelport(并行端口)。译者:时至今日,并口已不常见,而非作者所说的那样“无处不在”,我本来想找替代方法的,比如串口的 DTR 或者 RTS 脚给它置高电平,但是转念一想,现在的电脑上串口也不常见了,大家真的要实验,可能只能去买一个 ARM 开发板,或者其它什么实验板来玩一玩了。并口(并行端口)实际上是一种用于数字信息输入输出的设备。...

found的专栏 3624

设备驱动程序的原理

这篇文章简单介绍了设备驱动程序的原理。

qq_45902301的博客 1663

程序员为什么选择linux,UNIX/Linux 基本结构,而我们为什么选择Linux?

... UNIX/Linux 基本结构图2-1绘出了UNIX 系统的高层次的体系结构。图中心的硬件部分向操作系统提供基本服务。操作系统直接与硬件交互,向程序提供公共服务,并使他们同硬件特性隔离。当我们把整个系统看成层的集合时,通常将操作系统成为系统内核,或简称内核,此时强调的是它同用户程序的隔离。因为程序是不依赖于其下面的硬件的,所以,如果程序对硬件没做什么假定的话,就容易把它们在不同硬件上运行...

weixin_28932441的博客 176

Solaris10基础:UNIX/Linux基本结构

1.1.5  UNIX  UNIX/Linux基本结构  图1-3绘出了UNIX系统的高层次的体系结构。图中心的硬件部分向操作系统提供基本服务。操作系统直接与硬件交互,向程序提供公共服务,并使它们同硬件特性隔离。当我们把整个系统看成层的集合时,通常将操作系统称为系统内核,或简称内核,此时强调的是它同用户程序的隔离。因为程序是不依赖于其下面的硬件的,所以,如果程序对硬件没做什么假

aluminiumfoil的专栏 505
上一篇: 对synapsys.c这个lkm的rootkit的代码分析
下一篇: pingbackdoor的隐藏
ender049
博客等级 码龄20年 7粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值