侵权投诉

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之父表示移植M1 Mac的困难主要在于苹果不开放GPU

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

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

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

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

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

浅谈M1 Mac移植Linux的问题

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

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

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

Linux的进程

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

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

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

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

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

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

业界知名嵌入式开发软件工具IAR Embedded Workbench的编译工具现已支持在Linux系统运行,IAR编译工具提供高质量代码、高...
发表于 11-27 13:41 101次 阅读
基于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 101次 阅读
迅为IMX6ULL开发板Linux下电容触摸屏实验-驱动框架

如何学习单片机

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

Linux 5.10已为基于EFI引导的RISC-V硬件提供了初步支持

持续数月的努力,由西部数据(WD)工程师领导的 RISC-V UEFI 工作组,终于让 Linux 5.10 为 RISC-V 硬件提供了...
发表于 11-26 21:18 0次 阅读
Linux 5.10已为基于EFI引导的RISC-V硬件提供了初步支持

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

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

香橙派Orange Pi Zero2开发板使用USB摄像头的方法(Linux镜像)

前面给大家介绍过香橙派Zero2开发板在安卓系统下连接USB摄像头的操作步骤,本篇接着说明下在Linux下使用USB摄像头的方法...
发表于 11-26 16:10 0次 阅读
香橙派Orange Pi Zero2开发板使用USB摄像头的方法(Linux镜像)

Linux文件系统与持久性内存

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

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

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

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

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

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

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

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

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

STM32F1和STM32F4 的区别

u F1采用Crotex M3内核,F4采用Crotex M4内核。 u F1最高主频 72MHz, F4最高主频168MHz。 u F4具有单精度浮点运...
发表于 11-25 09:42 202次 阅读
STM32F1和STM32F4 的区别

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

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

嵌入式过时了吗?会不会被淘汰?

[table] [tr][td]嵌入式过时了吗?会不会被淘汰? 每一个想学习嵌入式的人肯定都考虑过这个问题。对于很多想入行的嵌入式开发...
发表于 11-24 17:00 202次 阅读
嵌入式过时了吗?会不会被淘汰?

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

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

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

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

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

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

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

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

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

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

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

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

Linux Fedora31即将停止支持

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

STM32从菜鸟到牛人的学习方法

1.首先我们先看看与STM32相关的文档                 我们假...
发表于 11-23 09:25 470次 阅读
STM32从菜鸟到牛人的学习方法

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

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

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

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

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

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

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

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

基于OPenWrt的移动机器人设计

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

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

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

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

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

10个LINUX命令 超好用

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

strace是什么 怎样使用它

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Linux的基础学习笔记资料总结

本文档的主要内容详细介绍的是Linux的基础学习笔记资料总结包括了:一、 常用命令,二、 磁盘管理,....
发表于 11-13 08:00 50次 阅读
Linux的基础学习笔记资料总结

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

本篇主要讲述嵌入式 Linux 产品开发过程中的内核/驱动开发部分相关内容,包括 Linux 内核裁....
发表于 11-13 08:00 71次 阅读
周立功嵌入式Linux开发教程下册PDF电子书免费下载

Linux查看资源使用情况和性能调优常用的命令

目录 前言 top命令 htop命令 ps命令 free命令 vmstat命令 iosat命令 ne....
的头像 嵌入式ARM 发表于 11-12 17:54 254次 阅读
Linux查看资源使用情况和性能调优常用的命令

以32位系统为例介绍内核空间和用户空间

本文以 32 位系统为例介绍内核空间(kernel space)和用户空间(user space)。....
的头像 嵌入式ARM 发表于 11-12 17:41 267次 阅读
以32位系统为例介绍内核空间和用户空间

怎样编写嵌入式Linux设备驱动程序呢

一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备....
的头像 嵌入式ARM 发表于 11-12 17:35 257次 阅读
怎样编写嵌入式Linux设备驱动程序呢

微软宣布11月18日举办Azure开放日活动

微软刚刚宣布了要在 11 月 18 日举办Azure 开放日线上活动的消息,主题将围绕开发者们颇为关....
的头像 璟琰乀 发表于 11-12 16:33 319次 阅读
微软宣布11月18日举办Azure开放日活动

Linux网络状态工具ss命令使用详解

很多流行的Linux发行版都支持ss以及很多监控工具使用ss命令.熟悉这个工具有助于您更好的发现与解....
的头像 Linux爱好者 发表于 11-12 15:43 235次 阅读
Linux网络状态工具ss命令使用详解

Windows下实现端口映射

通常服务器会有许多块网卡,因此也可能会连接到不同的网络,在隔离的网络中,某些服务可能会需要进行通信,....
的头像 Linux爱好者 发表于 11-12 15:40 342次 阅读
Windows下实现端口映射

为什么建链接要3次握手,断链接需要4次挥手?

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"....
的头像 Linux爱好者 发表于 11-12 15:36 248次 阅读
为什么建链接要3次握手,断链接需要4次挥手?

英特尔发布基于Xe-LP微架构的数据中心服务器GPU

英特尔发布了他们基于Xe-LP微架构的数据中心服务器GPU,初期主要针对高密度、低延迟的Androi....
的头像 璟琰乀 发表于 11-12 10:39 735次 阅读
英特尔发布基于Xe-LP微架构的数据中心服务器GPU

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 180次 阅读
AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)