侵权投诉

linux中block驱动的编写详解

39度创意研究所 2020-11-21 10:56 次阅读

引言

像IIC、LED、KEY等都属于字符设备,这些设备的驱动是所有驱动类型中最为简单的。块设备是另外一种不同于字符设备的类型,这两类设备在linux的驱动结构中有很大差异。总体来说,块设备驱动比字符设备驱动复杂的多,在IO操作上也表现出很大的不同。缓冲、IO的调度、请求队列等都是和块设备驱动相关的概念。

本章从驱动小白(指本人)的切身实际出发,先不去了解那些深奥的XXX,只从一个最简单的例子开始,对块设备驱动的结构有一个大体的了解。路漫漫其修远兮,驱动是一个大坑,够你用10年来填。慢慢学吧。

1. 块设备结构

块设备就是指磁盘、CD-ROM等硬件存储介质,块设备驱动连接了块设备和用户空间,实现用户空间对磁盘的大块数据访问。整个子系统如下图所示,包含虚拟文件系统,块IO调度层,块设备驱动以及具体的块设备。块设备不同于字符设备,它是以块为单位接收输入和返回输出,而字符设备是以字节为单位。块设备支持随机访问,而且其读写速度都快于字符设备,因此驱动的表现也至关重要。这也是为什么块设备驱动的结构和字符设备的驱动结构被分开来写。块是最小的读写单位,不同的文件系统有不同大小的块尺寸,但是它必须是2的指数,同时不能超过页大小。通常使用的大小有512字节,1K字节,4K字节等。

虚拟文件系统(VFS):隐藏了各种硬件的具体细节,为用户操作不同的硬件提供了一个统一的接口。其基于不同的文件系统格式,比如EXT,FAT等。用户程序对设备的操作都通过VFS来完成,在VFS上面就是诸如open、close、write和read的函数API。

映射层(mapping layer):这一层主要用于确定文件系统的block size,然后计算所请求的数据包含多少个block。同时调用具体文件系统函数来访问文件的inode,确定所请求的数据在磁盘上面的逻辑地址。

IO调度器:这部分是linux块系统中非常关键的部分,其涉及到如何接收用户请求并能最高效去访问硬件磁盘中的数据。

Block driver:完成和块设备的具体交互。

 

 

2. 驱动程序详解

通过编写一个vmem_disk驱动来了解block驱动的结构,vmem_disk是一种模拟磁盘,其数据实际上存储在RAM中。它通过vmalloc()分配出来的内存空间来模拟出一个磁盘,以块设备方式来访问这片内存。现在来看其主要结构。

2.1 block_device_operations

Block_device_operations类似于字符设备驱动中的file_operations结构,它是对块设备各种操作的集合,定义代码如下:

struct block_device_operations {
    int (*open) (struct block_device *, fmode_t);
    int (*release) (struct gendisk *, fmode_t);
    int (*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
    int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
    int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
    int (*direct_access) (struct block_device *, sector_t,void **, unsigned long *);
    int (*media_changed) (struct gendisk *);
    int (*revalidate_disk) (struct gendisk *);
    int (*getgeo)(struct block_device *, struct hd_geometry *);
    struct module *owner;
};

1) 打开和释放

int (*open)(struct inode *inode ,struct file *filp);

int (*release)(struct inode *inode ,struct file *filp);

这个和字符设备驱动类似,当设备被打开和关闭时将调用它们。

2) IO控制

int (*ioctl)(struct inode *inode,struct file *filp uusignwd intcmd,unsigned long arg)

这个和字符设备驱动中的ioctrl类似,也是用于系统调用。块设备包含大量的标准请求,这些标准请求由linux通用块设备层处理,因此大部分ioctrl函数相当短。

3) 介质改变

int (*check_media_change) (kdev_t);

int (*revalidate) (kdev_t);

像磁盘、CD-ROM等块设备是可插拔的,因此需要有个函数来检测设备是否存在。当介质发生改变,使用revalidate_disk来响应,给驱动一个机会进行必要的工作来使介质准备好。

4) 获得驱动信息

int (*getgeo)(struct block_device   *,struct hd_geometry *);

该函数根据驱动器的几何信息填充一个hd_geometry结构体,hd_geometry包含磁头、扇区、柱面等信息。

所以我们要填充这个结构体信息,并定义其对应函数。填充如下:

static struct block_device_operations vmem_fops={
         .owner=THIS_MODULE,
         .getgeo=vmem_getgeo,
         .ioctl=vmem_ioctl,
         .open=vmem_open,
         .release=vmem_release,
};

我们只定义了open、release、ioctrl、getgeo函数。为了简化这个驱动,我们把open、release、ioctrl函数的具体内容也都省略了,只是给出一个定义,没有任何有效内容。但是hd_geometry的信息需要填充,所以getgeo函数定义如下:

static int vmem_getgeo(struct block_device *bdev, struct hd_geometry *geo)
{
         geo->cylinders=1;
         geo->heads=1;
         geo->sectors=BLK_SIZE/SECTOR_SIZE;
         return 0;
}

定义了使用的块设备的柱面、磁头和扇区个数。

2.2 gendisk结构体

在linux内核中,用gendisk结构体来表示一个独立的磁盘设备。就像字符设备驱动中使用cdev结构体一样,它也包含主次设备号,需要分配内存,释放结构体和初始化操作。

1) 分配gendisk

分配函数为:

struct gendisk *alloc_disk(int minors);

2) 增加gendisk

这个是用于注册磁盘设备,函数为:

void add_disk(struct gendisk *gd);

3) 释放gendisk

当不再需要使用磁盘时候,需要释放这个结构体,也即释放其分配的内存。

void del_gendisk(struct gendisk *gd);

以上这些函数在快设备初始化和关闭驱动中调用。

2.3 请求处理

每个块设备驱动的核心是它的请求函数,实际的工作,至少如设备的启动,都是在这个函数里完成的。块设备驱动程序的request函数有以下原型:

void request(request_queue_t *queue);

当内核需要驱动程序处理读取、写入以及其它对设备的操作时,就会调用该函数。在其返回前,request函数不必完成所有队列中的请求。事实上,对大多数真实设备而言,它可能没有完成任何请求。

每个设备都有一个请求队列,这是因为对磁盘数据实际传入和传出发生的时间,与内核请求的时间相差很大,因此内核需要有一定灵活性,以安排在适当时刻(比如把影响相邻磁盘扇区的请求分成一组)进行传输。

我们用一个简单的request函数:

static void vmem_request(struct request_queue *q){
         struct request *req;
         uint64_t pos=0;
         ssize_t size=0;
         struct bio_vec bvec;
         int rv=0;
         struct req_iterator iter;
         void *kaddr=NULL;
         while((req=blk_fetch_request(q)) != NULL){
                   spin_unlock_irq(q->queue_lock);
                   pos=blk_rq_pos(req)*SECTOR_SIZE;
                   size=blk_rq_bytes(req);
                   if(pos+size>vdev->size){
                            printk(KERN_WARNING "beyond addr/n");
                            rv=-EIO;
                            goto skip;
                   }
                   rq_for_each_segment(bvec, req, iter){
                            kaddr=kmap(bvec.bv_page);
                            rv=vmem_transfer(vdev, pos, bvec.bv_len, kaddr+bvec.bv_offset, rq_data_dir(req));
                            if(rv<0)
                                     goto skip;
                   pos+=bvec.bv_len;
                   kunmap(bvec.bv_page);
                   }
         skip:
                   blk_end_request_all(req, rv);
                   spin_lock_irq(q->queue_lock);
         }
}

Blk_fetch_request从请求队列中获取一个请求,当没有请求需要时,返回NULL。然后while中的程序开始处理这个请求。当请求队列创建的时候,request函数绑定了它,并且提供了一个自旋锁。当调用request函数时,该锁由内核控制。因此request函数是一个原子上下文中运行的。因此在获得request时,需要通过spin_unlock_irq函数来解锁。

然后通过blk_rq_pos和blk_rq_bytes来获得请求中的位置和大小。rq_for_each_segment是一个宏定义,其遍历一个请求中的所有bio。这里插入一下对bio的介绍:

从本质上讲,一个request结构是作为一个bio结构的链表实现的。Bio结构是在底层对部分块设备IO请求的描述。Bio结构体定义如下:


	

与bio对应的数据每次存放的内存不一定是连续的,bio_vec结构体用于描述与这个bio对应的所有内存,它并不总是在一个页面里,因此需要一个向量。IO调度算法将连续的bio合并成一个request,然后可以改善读写磁盘的性能。

 

 

遍历bio的时候,就可以定义一个transfer函数来完成bio的数据转移了。Rq_data_dir获得从request中得到数据传输方向,返回值0表示从设备读数据,非0表示写数据。Transfer中就可以通过简单的memcpy来完成数据拷贝:

static int vmem_transfer(struct vmem_device *vdev, uint64_t pos, ssize_t size, void *buffer, int write)
{
         if(write)
                   memcpy(vdev->buf+pos, buffer, size);
         else
                   memcpy(buffer, vdev->buf+pos, size);
         return 0;
}

如果一个请求不是文件系统请求,就将请求传递给end_request。当处理非文件系统请求时,传递0表示不能成功完成该请求。

2.4 设备初始化

在块设备初始化阶段,与字符设备类似。基本过程如下:

1) 注册块设备

vmem_major=register_blkdev(0, "VMEM");

第一个参数0表示由内核自动分配主设备号,如果成功注册就返回这个主设备号,如果注册失败就返回负值。

2) 定义设备结构体

这个设备结构体是自己定义的,一般包含gendisk、设备号、请求队列等。

struct vmem_device {
         struct gendisk *disk;
         struct request_queue *que;
         void *buf;
         spinlock_t lock;
         ssize_t size;
};

3) vmem_dev结构体分配和buf分配

         vdev=kzalloc(sizeof(struct vmem_device), GFP_KERNEL);
         if(!vdev){
                   printk(KERN_WARNING "vmem_device: unable to allocate mem/n");
                   goto out;
         }
         vdev->size=BLK_SIZE;
         vdev->buf=vmalloc(vdev->size);
         if(vdev->buf==NULL){
                   printk(KERN_WARNING "failed to vmalloc vdev->buf/n");
                   goto out_dev;
         }

Buf就是一个虚拟的磁盘。

4) 初始化请求队列

vdev->que=blk_init_queue(vmem_request, &vdev->lock);

5) 分配磁盘

disk=alloc_disk(1);

6) 填充vmem_dev结构体中的信息。

         vdev->disk=disk;
         disk->major=vmem_major;
         disk->first_minor=1;
         disk->fops=&vmem_fops;
         disk->queue=vdev->que;
         disk->private_data=vdev;
         sprintf(disk->disk_name, "VMEM");

7)注册磁盘

         set_capacity(disk, BLK_SIZE/SECTOR_SIZE);

         add_disk(disk);

3.实验

我们注册驱动,并看到在dev下面有VMEM设备,这个就是我们的虚拟磁盘设备文件。

 

 

然后将其格式化为ext2文件系统:

 

 

接下来我们就可以将其挂载并创建文件了。

 

 

总结

最后总结一下linux中block驱动的编写过程:

1) 填充request函数,这个函数在请求队列初始化中将喝队列绑定;

2) 定义vdev结构体,其中包含gendisk、request_queue等结构;

3) 定义设备初始化函数,并完成对disk的分配,注册,请求队列初始化工作;

4) 填充block_device_operations结构体;

5) 定义设备退出函数,主要是释放结构体;

编辑:hfy


收藏 人收藏
分享:

评论

相关推荐

Linux内核部分显示驱动部分的详细介绍

DirectFB是图形API存在于Frame Buffer层之上与高级图形管理层如GTK+等之下的。....
发表于 12-04 16:46 18次 阅读
Linux内核部分显示驱动部分的详细介绍

【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】visual studio code编写;Linux编译与Hiburn烧录(三)

烧录的话,我用visual studio code一直报错,后来就了解到一个新的方法,用Hitool烧录。但是现在百度上的Hitool里面的芯片匹配...
发表于 12-04 11:25 67次 阅读
【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】visual studio code编写;Linux编译与Hiburn烧录(三)

在RK3399开发板香橙派Orange Pi 4B上使用docker

(1)直接运行执行docker search arm64v8 搜到arm64v8/nginx    例如 执行 docker search ubuntu 找到eclipse/ubu...
发表于 12-03 18:06 66次 阅读
在RK3399开发板香橙派Orange Pi 4B上使用docker

Linux内核设计与实现的课程实验指导书

对于大多数人来说,几乎还没接触过 Linux及 Linux下的用户层编程,就开始学习《 Linux内....
发表于 12-03 16:48 20次 阅读
Linux内核设计与实现的课程实验指导书

国产系统哪个系统最好_国产系统安装方法

Deepin是一个基于Linux的操作系统,Deepin原名Linux Deepin,在2014年4....
发表于 12-02 15:05 1428次 阅读
国产系统哪个系统最好_国产系统安装方法

瑞萨电子RA产品家族新增超低功耗RA2L1 MCU产品群

基于32位Arm Cortex-M23的MCU,通过灵活的电源配置,提供同类产品中一流的低功耗,可在....
发表于 12-02 11:05 197次 阅读
瑞萨电子RA产品家族新增超低功耗RA2L1 MCU产品群

基于MySQL数据库应用开发实现嵌入式数控系统的设计

由于本课题开发的人机界面是利用GTK+图形库,因此系统中采用的基于MySQL数据库应用开发,需要解决....
的头像 电子设计 发表于 12-02 10:07 1081次 阅读
基于MySQL数据库应用开发实现嵌入式数控系统的设计

单片机通过定时器来实现多任务,充分利用定时器资源来实现异步处理

在单片机系统中,有许多情况下需要等待某个事件的发生,来继续下一步操作,如果有一个任务还好说,单片机可以无限等待事件的发...
发表于 12-02 09:43 384次 阅读
单片机通过定时器来实现多任务,充分利用定时器资源来实现异步处理

虎跃让Linux代码里面写上了“酷派”的名字?

12月1日,酷派宣布,为表彰员工虎跃同学向Linux社区提交的数条高质量补丁,公司决定授予其十万股期....
的头像 lhl545545 发表于 12-02 09:42 1193次 阅读
虎跃让Linux代码里面写上了“酷派”的名字?

深度理解Linux下网络包的接收过程

因为要对百万、千万、甚至是过亿的用户提供各种网络服务,所以在一线互联网企业里面试和晋升后端开发同学的....
的头像 璟琰乀 发表于 12-01 17:51 172次 阅读
深度理解Linux下网络包的接收过程

Linux内核高端内存分析

 x86 CPU 采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正....
发表于 12-01 17:47 49次 阅读
Linux内核高端内存分析

嵌入式Linux驱动开发4412-实验01内核开发基础

实验 01 内核开发基础-基于迅为4412开发板 1.1 本章导读 本实验将带您学习一遍 Linux 的框架和源码目录结构。 从任何地方拿到...
发表于 12-01 11:21 101次 阅读
嵌入式Linux驱动开发4412-实验01内核开发基础

开发者将把Linux移植到苹果M1 Mac上

12 月 1 日消息 开发者赫克托 - 马丁 (Hector Martin)自称是一个很喜欢把 Li....
的头像 电子魔法师 发表于 12-01 09:55 226次 阅读
开发者将把Linux移植到苹果M1 Mac上

开发者计划Linux移植到苹果M1 Mac,要求每月获得4000美元资助

知名开发者要把 Linux 移植到苹果 M1 Mac 上,要求网友每月资助其 4000 美元 开发者....
的头像 璟琰乀 发表于 12-01 09:26 186次 阅读
开发者计划Linux移植到苹果M1 Mac,要求每月获得4000美元资助

当分布式数据库遇上开放服务器LinuxONE,轻松应对各种问题挑战

解决分布式架构落地的难题,有一种很好的选择,就是将分布式系统与 IBM LinuxONE 相结合,后....
的头像 牵手一起梦 发表于 11-30 15:30 224次 阅读
当分布式数据库遇上开放服务器LinuxONE,轻松应对各种问题挑战

迅为IMX6ULL开发板Linux下电容触摸屏实验-实验程序编写

54.2  硬件原理图 在本实验中使用迅为的 7 寸屏为例,使用的是 FT5426 触摸芯片。 从原理图中得知,7 寸屏使用 ...
发表于 11-30 10:22 202次 阅读
迅为IMX6ULL开发板Linux下电容触摸屏实验-实验程序编写

Linux之父表示移植M1 Mac的困难主要在于苹果不开放GPU

日前在出席Real World Technologies论坛时,Linux之父Linus Torva....
的头像 工程师邓生 发表于 11-30 10:05 279次 阅读
Linux之父表示移植M1 Mac的困难主要在于苹果不开放GPU

基于Linux的嵌入式GUI实现微波信号发生器人机界面设计

嵌入式系统的出现至今已有30多年的历史,嵌入式技术也经历了三个发展阶段。早期的嵌入式系统因资源极其有....
的头像 电子设计 发表于 11-30 10:01 776次 阅读
基于Linux的嵌入式GUI实现微波信号发生器人机界面设计

ARM主板RK3288/RK3399主板中安卓系统与LINUX系统的相同点与不同点

安卓,是一个系统,用于移动终端,智能手机、平板之类,如今也可以用于桌面工作站或电视机顶盒、智能电视等。它的内核基于linux内...
发表于 11-30 09:53 303次 阅读
ARM主板RK3288/RK3399主板中安卓系统与LINUX系统的相同点与不同点

浅谈M1 Mac移植Linux的问题

日前在出席Real World Technologies论坛时,Linux之父Linus Torva....
的头像 lhl545545 发表于 11-30 09:12 203次 阅读
浅谈M1 Mac移植Linux的问题

浅谈内核的Makefile、Kconfig和.config文件

表示该项是否编进内核、编成模块。显示为< > , 假如选择编译成内核模块,则会在.config中生成....
的头像 strongerHuang 发表于 11-29 10:40 178次 阅读
浅谈内核的Makefile、Kconfig和.config文件

Linux的进程

内核通过轻量级进程 (lightweight process) 来支持多线程。1个轻量级进程就对应1....
的头像 strongerHuang 发表于 11-29 09:51 156次 阅读
Linux的进程

微软重磅更新Windows 10系统并启用对Linux内核的支持

由于西方新年缘故,今年微软已经不会推出Windows 10的大更新了,不过该系统会在明年迎来一项重磅....
的头像 lhl545545 发表于 11-28 10:13 579次 阅读
微软重磅更新Windows 10系统并启用对Linux内核的支持

零基础可以学习大数据开发吗?学什么内容?

什么人适合学习大数据开发?学大数据难吗?有不少应届大学毕业生和0基础人群选择学大数据,但是要选择零基....
的头像 如意 发表于 11-27 15:23 407次 阅读
零基础可以学习大数据开发吗?学什么内容?

基于IAR EW编译工具实现Linux系统上自动化构建

业界知名嵌入式开发软件工具IAR Embedded Workbench的编译工具现已支持在Linux系统运行,IAR编译工具提供高质量代码、高...
发表于 11-27 13:41 303次 阅读
基于IAR EW编译工具实现Linux系统上自动化构建

DevEco studio有出linux的计划么 ?

linux作为一款pc端虽然普及程度不高,但是在编程界的地位还是举足轻重的。关键是linux上安装的window虚拟机没有办法跑DevEco s...
发表于 11-27 10:40 108次 阅读
DevEco studio有出linux的计划么 ?

迅为IMX6ULL开发板Linux下电容触摸屏实验-驱动框架

如今触摸屏的使用越来越广泛,从手机、平板到蜂巢取货等场合,都是用了触摸屏,触摸屏的使用非常便捷高效。在本章就来学习一下如...
发表于 11-27 10:13 202次 阅读
迅为IMX6ULL开发板Linux下电容触摸屏实验-驱动框架

如何学习单片机

使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序...
发表于 11-27 09:48 884次 阅读
如何学习单片机

动手编译Linux内核的教程免费下载

本文档的主要内容详细介绍的是动手编译Linux内核的教程免费下载。
发表于 11-26 17:01 37次 阅读
动手编译Linux内核的教程免费下载

Linux文件系统与持久性内存

1、Linux 虚拟文件系统介绍 在 Linux 系统中一切皆文件,除了通常所说的狭义的文件以外,目....
的头像 嵌入式ARM 发表于 11-26 14:34 348次 阅读
Linux文件系统与持久性内存

嵌入式Linux系统CPU控制常见办法测试

01 测试环境 Xilinx ZCU106 单板 Xilinx VCU TRD2020.1 02 介....
的头像 FPGA开发圈 发表于 11-26 14:17 1729次 阅读
嵌入式Linux系统CPU控制常见办法测试

Linux之父谈论新款MacBook :除了操作系统,几乎完美

关注到苹果新出的M1处理器MacBook这款产品的,还有Linux之父Linus Torvalds。....
的头像 工程师邓生 发表于 11-25 18:07 376次 阅读
Linux之父谈论新款MacBook :除了操作系统,几乎完美

shell调试教程之如何在MM32 MCU上使用shell来辅助开发

对于做linux开发的研发人员来说,大家都喜欢通过输入指令符来执行一些命令操作,如果在MCU编程过程....
发表于 11-25 14:30 403次 阅读
shell调试教程之如何在MM32 MCU上使用shell来辅助开发

FreeBSD和Linux有什么相似处和区别

发表于 11-25 10:48 44次 阅读
FreeBSD和Linux有什么相似处和区别

Linux内核开发框架的学习资料说明

包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux 支持的体系结构, 例如....
发表于 11-24 18:08 63次 阅读
Linux内核开发框架的学习资料说明

Linux之父希望苹果M1设备能运行Linux

今年早些时候,Linux 操作系统的采用率迎来了巨大的增长。其中一个原因是年迈的 Windows 7....
的头像 如意 发表于 11-24 12:02 680次 阅读
Linux之父希望苹果M1设备能运行Linux

Linus Torvalds希望苹果设备能够运行Linux操作系统

今年早些时候,Linux 操作系统的采用率迎来了巨大的增长。其中一个原因是年迈的 Windows 7....
的头像 璟琰乀 发表于 11-24 10:39 383次 阅读
Linus Torvalds希望苹果设备能够运行Linux操作系统

HarmonyOS与Linux的融合 在Linux系统设置共享文件夹

由于目前HarmonyOS源码只支持在Linux系统中进行编译,所以需要Linux环境下的工程目录映....
发表于 11-23 16:37 368次 阅读
HarmonyOS与Linux的融合  在Linux系统设置共享文件夹

Linux电源管理系统结构的详细介绍

任何系统的运转都需要能量。计算机系统依靠电能运行。而能量的获取是有成本的,因此如果能在保证系统运转的....
发表于 11-23 14:48 45次 阅读
Linux电源管理系统结构的详细介绍

国产Linux操作系统应用软件兼容列表高达189款

近日,麒麟软件公布了首批适配的信创应用软件列表,共计189款,都能在麒麟操作系统上安全稳定运行,涵盖....
的头像 如意 发表于 11-23 14:29 284次 阅读
国产Linux操作系统应用软件兼容列表高达189款

麒麟软件近日公布首批适配的信创应用软件列表

近日,麒麟软件公布了首批适配的信创应用软件列表,共计189款,都能在麒麟操作系统上安全稳定运行,涵盖....
的头像 lhl545545 发表于 11-23 10:04 434次 阅读
麒麟软件近日公布首批适配的信创应用软件列表

Linux Fedora31即将停止支持

外媒Neowin报道,Fedora项目 宣布,Fedora 31将于2020年11月24日寿终正寝。....
的头像 璟琰乀 发表于 11-23 09:42 221次 阅读
Linux Fedora31即将停止支持

Linux运维经常使用的40个命令总结

本文档的主要内容详细介绍的是Linux运维经常使用的40个命令总结
的头像 Wildesbeast 发表于 11-22 11:14 359次 阅读
Linux运维经常使用的40个命令总结

为什么说大数据、AI是风口

这一部分让你对Hadoop生态体系有了系统的了解,由浅入深,结合理论和实践,全方位地介绍Hadoop....
的头像 人工智能与大数据技术 发表于 11-20 17:30 860次 阅读
为什么说大数据、AI是风口

微软为Linux服务器添加端点检测和响应功能

微软基于服务器的 Linux 保护计划的公开预览现在提供了改进的端点检测和响应功能。
的头像 如意 发表于 11-20 15:05 684次 阅读
微软为Linux服务器添加端点检测和响应功能

如何在 Vitis 中使用 UIO 驱动框架创建简单的 Linux 用户应用

Linux嵌入式设计中最基本的任务之一是创建用户应用程序。 在本篇博文中,我们将探讨如何在 Viti....
的头像 电子发烧友网工程师 发表于 11-20 14:05 391次 阅读
如何在 Vitis 中使用 UIO 驱动框架创建简单的 Linux 用户应用

基于OPenWrt的移动机器人设计

OpenWrt可以被描述为一个嵌入式的 Linux 发行版,(主流路由器固件有 dd-wrt,tom....
的头像 新机器视觉 发表于 11-19 14:24 345次 阅读
基于OPenWrt的移动机器人设计

Linux C编程一站式学习的电子教程免费下载

用Windows还真的是学不好C语言。C语言是一种面向底层的编程语言,要写好C程序,必须对操作系统的....
发表于 11-19 08:00 56次 阅读
Linux C编程一站式学习的电子教程免费下载

了解Linux on IBM Z的重大里程碑

如今,IBM Z 拥抱 Linux 和开源已超过 20年,成为企业迈向混合云平台的核心。让我们一起跟....
的头像 IBM中国 发表于 11-18 11:41 358次 阅读
了解Linux on IBM Z的重大里程碑

10个LINUX命令 超好用

下面可能是你不曾用过后十个Linux的命令。相当的有用。 1)pgrep pgrep名字前有个p,我....
的头像 Linux爱好者 发表于 11-17 18:19 329次 阅读
10个LINUX命令 超好用

strace是什么 怎样使用它

什么是strace? strace是一个非常简单的工具,它可以跟踪系统调用的执行。最简单的方式,它可....
的头像 Linux爱好者 发表于 11-17 18:16 384次 阅读
strace是什么 怎样使用它

LINUX内核有那几种锁详细介绍

Mutex 是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用....
发表于 11-17 18:07 80次 阅读
LINUX内核有那几种锁详细介绍

英特尔正筹备为Linux提供Protected Xe Path支持

英特尔的开源 Linux 图形驱动开发团队已着手推进此前尚未公开讨论过的新功能--英特尔 PXP (....
的头像 璟琰乀 发表于 11-16 17:56 308次 阅读
英特尔正筹备为Linux提供Protected Xe Path支持

16GB容量!全新操作系统正式发布,离线也能用

网上有这么多基于Linux内核的免费OS系统,Endless OS不算太出名,但它有可能是最特殊的一....
发表于 11-15 10:02 322次 阅读
16GB容量!全新操作系统正式发布,离线也能用

Linux电源管理系统的结构详细说明

任何系统的运转都需要能量。计算机系统依靠电能运行。而能量的获取是有成本的,因此如果能在保证系统运转的....
发表于 11-14 10:31 168次 阅读
Linux电源管理系统的结构详细说明

新EndlessOS系统发布:安装文件比Win10大3倍

网上有这么多基于Linux内核的免费OS系统,Endless OS不算太出名,但它有可能是最特殊的一....
的头像 璟琰乀 发表于 11-14 09:49 266次 阅读
新EndlessOS系统发布:安装文件比Win10大3倍

Endless OS发布基于最新的Debian 10.6及Linux 5.8稳定内核

网上有这么多基于Linux内核的免费OS系统,Endless OS不算太出名,但它有可能是最特殊的一....
的头像 lhl545545 发表于 11-14 09:45 381次 阅读
Endless OS发布基于最新的Debian 10.6及Linux 5.8稳定内核

GNU/Linux 与开源文化发展大致的脉络

本文只梳理大致的脉络,不做详尽的叙述。 一、计算机的发明 世上本无路,走的人多了,就有了路。世上本无....
的头像 OpenFPGA 发表于 11-13 18:07 487次 阅读
GNU/Linux 与开源文化发展大致的脉络

周立功嵌入式Linux开发教程上册PDF电子书免费下载

本篇主要讲述进行嵌入式Linux 开发所必备的基础知识, 以实用和够用为标准进行介绍,与嵌入式Lin....
发表于 11-13 17:28 126次 阅读
周立功嵌入式Linux开发教程上册PDF电子书免费下载

将Linux引入IBM Z,大型机拥抱开源世界

20年前,IBM 看到 Linux 的巨大潜力,将其引入 IBM Z,二者的强强联合,满足了企业在互....
的头像 IBM中国 发表于 11-13 09:21 371次 阅读
将Linux引入IBM Z,大型机拥抱开源世界

SN74ALS1034 六路同向驱动器

这些设备包含六个独立的同相驱动程序。它们执行布尔函数Y = A. SN54ALS1034和SN54AS1034A的特点是在-55°C至125°C的整个军用温度范围内工作。 SN74ALS1034和SN74AS1034A的工作温度范围为0°C至70°C。 特性 'AS1034A提供高电容驱动能力 同相驱动器 封装选项包括塑料小 - 外形(D)封装,陶瓷芯片载体(FK),标准塑料(N)和陶瓷(J)300密耳DIP 参数 与其它产品相比 同向缓冲器/驱动器   Technology Family VCC (Min) (V) VCC (Max) (V) Bits (#) Voltage (Nom) (V) F @ Nom Voltage (Max) (Mhz) ICC @ Nom Voltage (Max) (mA) tpd @ Nom Voltage (Max) (ns) IOL...
发表于 10-15 16:06 64次 阅读
SN74ALS1034 六路同向驱动器

AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)

TI AM437x高性能处理器基于ARM Cortex-A9内核。 这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。 这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。 这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。 处理器子系统基于ARM Cortex-A9内核,PowerVR SGX™图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。 可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等...
发表于 09-25 11:51 182次 阅读
AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)
博评网