嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第五天-ARM Linux编程之设备节点 (物联技术666)-程序员宅基地

技术标签: 嵌入式培训课程笔记  笔记  arm开发  linux  

链接:https://pan.baidu.com/s/1hOBKyRom-4EZMBpFn1H9kQ?pwd=1688
提取码:1688

 Linux设备节点

设备管理是linux中比较基础的东西,但是由于Linux智能程度的越来越高,Udev的使用越来越广泛,使得越来越多的Linux新用户对 /dev 目录下的东西变得不再熟悉。有时候遇见问题就会变得抓狂

本文是我在写作《DIY 一个基于LFS的实用 Mini-LAPP 服务器》过程中整理的资料,拿出来与大家共享

Linux 中的设备有2种类型:字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。每个字符设备和块设备都必须有主、次设备号,主设备号相同的设备是同类设备(使用同一个驱动程序)。这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备")。每个设备在 /dev 目录下都有一个对应的文件(节点)。可以通过 cat /proc/devices 命令查看当前已经加载的设备驱动程序的主设备号。内核能够识别的所有设备都记录在原码树下的 Documentation/devices.txt 文件中。在 /dev 目录下除了字符设备和块设备节点之外还通常还会存在:FIFO管道、Socket、软/硬连接、目录。这些东西没有主/次设备号。

Linux内核所能识别的所有设备都记录在/dev/下

而内核原码树中的 Documentation/devices.txt 可能不是最新版本。

了解这些设备的最基本要求就是对 每个设备文件的含义了如指掌,下面就医列表的形式列出常见的设备文件以及相应的含义(比较偏僻的就省略了):

----------------------------------------------------------------------

主设备号 设备类型

次设备号=文件名 简要说明

----------------------------------------------------------------------

0 未命名设备(例如:挂载的非设备)

0 = 未空设备号保留

1 char 内存设备

1 = /dev/mem 直接存取物理内存

2 = /dev/kmem 存取经过内核虚拟之后的内存

3 = /dev/null 空设备。任何写入都将被直接丢弃,任何读取都将得到EOF。

4 = /dev/port 存取 I/O 端口

5 = /dev/zero 零字节源,只能读取到无限多的零字节。

7 = /dev/full 满设备。任何写入都将失败,并把errno设为ENOSPC以表示没有剩余空间。

8 = /dev/random 随机数发生器。完全由用户的输入来产生随机数。

如果用户停止所有动作,则停止产生新的随机数。

9 = /dev/urandom 更快,但是不够安全的随机数发生器。尽可能由用户的输入来产生随机数,

如果用户停止所有动作,则把已经产生的随机数做为种子来产生新的随机数。

10 = /dev/aio 异步 I/O 通知接口

11 = /dev/kmsg 任何对该文件的写入都将作为 printk 的输出

1 block RAM disk

0 = /dev/ram0 第1个 RAM disk (initrd只能使用ram0)

1 = /dev/ram1 第2个 RAM disk

...

200 = /dev/ram200 第200个 RAM disk

4 char TTY(终端)设备

0 = /dev/tty0 当前虚拟控制台

1 = /dev/tty1 第1个虚拟控制台

...

63 = /dev/tty63 第63个虚拟控制台

4 block 如果根文件系统以是以只读方式挂载的,那么就不可能创建真正的设备节点,

此时就使用该设备作为动态分配的主(major)设备的别名

0 = /dev/root

5 char 其他 TTY 设备

0 = /dev/tty 当前 TTY 设备

1 = /dev/console 系统控制台

2 = /dev/ptmx 所有 PTY master 的复用器

7 char 虚拟控制台捕捉设备(这些设备既允许读也允许写)

0 = /dev/vcs 当前虚拟控制台(vc)的文本内容

1 = /dev/vcs1 tty1 的文本内容

...

63 = /dev/vcs63 tty63 的文本内容

128 = /dev/vcsa 当前虚拟控制台(vc)的文本/属性内容

129 = /dev/vcsa1 tty1 的文本/属性内容

...

191 = /dev/vcsa63 tty63 的文本/属性内容

7 block 回环设备(用一个普通的磁盘文件来模拟一个块设备)

对回环设备的绑定由 mount(8) 或 losetup(8) 处理

0 = /dev/loop0 第1个回环设备

1 = /dev/loop1 第2个回环设备

...

8 block SCSI 磁盘(0-15)

0 = /dev/sda 第1个 SCSI 磁盘(整个磁盘)

16 = /dev/sdb 第2个 SCSI 磁盘(整个磁盘)

32 = /dev/sdc 第3个 SCSI 磁盘(整个磁盘)

...

240 = /dev/sdp 第16个 SCSI 磁盘(整个磁盘)

分区表示方法如下(以第3个 SCSI 磁盘为例)

33 = /dev/sdc1 第1个分区

34 = /dev/sdc2 第2个分区

...

47 = /dev/sdc15 第15个分区

对于Linux/i386来说,分区1-4是主分区,5-15是逻辑分区。

9 block Metadisk(RAID)设备

0 = /dev/md0 第1组 metadisk

1 = /dev/md1 第2组 metadisk

...

metadisk 驱动用于将同一个文件系统分割到多个物理磁盘上。

10 char 非串口鼠标,各种杂项设备和特性

1 = /dev/psaux PS/2鼠标

131 = /dev/temperature 机器内部温度

134 = /dev/apm_bios APM(高级电源管理) BIOS

135 = /dev/rtc 实时时钟(Real Time Clock)

144 = /dev/nvram 非易失配置 RAM

162 = /dev/smbus 系统管理总线(System Management Bus)

164 = /dev/ipmo Intel的智能平台管理(Intelligent Platform Management)接口

173 = /dev/ipmikcs 智能平台管理(Intelligent Platform Management)接口

175 = /dev/agpgart AGP图形地址重映射表(Graphics Address Remapping Table)

182 = /dev/perfctr 性能监视计数器

183 = /dev/hwrng 通用硬件随机数发生器

184 = /dev/cpu/microcode CPU微代码更新接口

186 = /dev/atomicps 进程状态数据的原子快照

188 = /dev/smbusbios SMBus(系统管理总线) BIOS

200 = /dev/net/tun TAP/TUN 网络设备(TAP/TUN以软件的方式实现了网络设备)

TAP模拟了以太网帧(第二层),TUN模拟了IP包(第三层)。

202 = /dev/emd/ctl 增强型 Metadisk RAID (EMD) 控制器

220 = /dev/mptctl Message passing technology (MPT) control

223 = /dev/input/uinput 用户层输入设备驱动支持

227 = /dev/mcelog X86_64 Machine Check Exception driver

228 = /dev/hpet HPET driver

229 = /dev/fuse Fuse(用户空间的虚拟文件系统)

231 = /dev/snapshot 系统内存快照

232 = /dev/kvm 基于内核的虚构机(基于AMD SVM和Intel VT硬件虚拟技术)

11 block SCSI CD-ROM 设备

0 = /dev/scd0 第1个 SCSI CD-ROM

1 = /dev/scd1 第2个 SCSI CD-ROM

...

13 char 核心输入设备

32 = /dev/input/mouse0 第1个鼠标

33 = /dev/input/mouse1 第2个鼠标

...

62 = /dev/input/mouse30 第31个鼠标

63 = /dev/input/mice 所有鼠标的统一

64 = /dev/input/event0 第1个事件队列

65 = /dev/input/event1 第2个事件队列

...

95 = /dev/input/event1 第32个事件队列

21 char 通用 SCSI 设备(通常是SCSI光驱)

0 = /dev/sg0 第1个通用 SCSI 设备

1 = /dev/sg1 第2个通用 SCSI 设备

...

29 char 通用帧缓冲(frame buffer)设备

0 = /dev/fb0 第1个帧缓冲设备

1 = /dev/fb1 第2个帧缓冲设备

...

31 = /dev/fb31 第32个帧缓冲设备

30 char iBCS-2 兼容设备

0 = /dev/socksys 套接字访问接口

1 = /dev/spx SVR3 本地 X 接口

32 = /dev/inet/ip 网络访问接口

33 = /dev/inet/icmp

34 = /dev/inet/ggp

35 = /dev/inet/ipip

36 = /dev/inet/tcp

37 = /dev/inet/egp

38 = /dev/inet/pup

39 = /dev/inet/udp

40 = /dev/inet/idp

41 = /dev/inet/rawip

此外,iBCS-2 还需要下面的连接必须存在

/dev/ip -> /dev/inet/ip

/dev/icmp -> /dev/inet/icmp

/dev/ggp -> /dev/inet/ggp

/dev/ipip -> /dev/inet/ipip

/dev/tcp -> /dev/inet/tcp

/dev/egp -> /dev/inet/egp

/dev/pup -> /dev/inet/pup

/dev/udp -> /dev/inet/udp

/dev/idp -> /dev/inet/idp

/dev/rawip -> /dev/inet/rawip

/dev/inet/arp -> /dev/inet/udp

/dev/inet/rip -> /dev/inet/udp

/dev/nfsd -> /dev/socksys

/dev/X0R -> /dev/null

36 char Netlink 支持

0 = /dev/route 路由, 设备更新, kernel to user

3 = /dev/fwmonitor Firewall packet 复制

59 char sf 防火墙模块

0 = /dev/firewall 与 sf 内核模块通信

65 block SCSI 磁盘(16-31)

0 = /dev/sdq 第17个 SCSI 磁盘(整个磁盘)

16 = /dev/sdr 第18个 SCSI 磁盘(整个磁盘)

32 = /dev/sds 第19个 SCSI 磁盘(整个磁盘)

...

240 = /dev/sdaf 第32个 SCSI 磁盘(整个磁盘)

66 block SCSI 磁盘(32-47)

0 = /dev/sdag 第33个 SCSI 磁盘(整个磁盘)

16 = /dev/sdah 第34个 SCSI 磁盘(整个磁盘)

32 = /dev/sdai 第35个 SCSI 磁盘(整个磁盘)

...

240 = /dev/sdav 第48个 SCSI 磁盘(整个磁盘)

89 char I2C 总线接口

0 = /dev/i2c-0 第1个 I2C 适配器

1 = /dev/i2c-1 第2个 I2C 适配器

...

98 block 用户模式下的虚拟块设备(分区处理方式与 SCSI 磁盘相同)

0 = /dev/ubda 第1个用户模式块设备

16 = /dev/udbb 第2个用户模式块设备

...

103 block 审计(Audit)设备

0 = /dev/audit 审计(Audit)设备

128-135 char Unix98 PTY master

这些设备不应当存在设备节点,而应当通过 /dev/ptmx 接口访问。

136-143 char Unix98 PTY slave

这些设备节点是自动生成的(伴有适当的权限和模式),不能手动创建。

方法是通过使用适当的 mount 选项(通常是:mode=0620,gid=<"tty"组的gid>)

将 devpts 文件系统挂载到 /dev/pts 目录即可。

0 = /dev/pts/0 第1个 Unix98 PTY slave

1 = /dev/pts/1 第2个 Unix98 PTY slave

...

153 block Enhanced Metadisk RAID (EMD) 存储单元(分区处理方式与 SCSI 磁盘相同)

0 = /dev/emd/0 第1个存储单元

1 = /dev/emd/0p1 第1个存储单元的第1个分区

2 = /dev/emd/0p2 第1个存储单元的第2个分区

...

15 = /dev/emd/0p15 第1个存储单元的第15个分区

16 = /dev/emd/1 第2个存储单元

32 = /dev/emd/2 第3个存储单元

...

240 = /dev/emd/15 第16个存储单元

180 char USB 字符设备

96 = /dev/usb/hiddev0 第1个USB人机界面设备(鼠标/键盘/游戏杆/手写版等人操作计算机的设备)

...

111 = /dev/usb/hiddev15 第16个USB人机界面设备

180 block USB 块设备(U盘之类)

0 = /dev/uba 第1个USB 块设备

8 = /dev/ubb 第2个USB 块设备

16 = /dev/ubc 第3个USB 块设备

...

192 char 内核 profiling 接口

0 = /dev/profile Profiling 控制设备

1 = /dev/profile0 CPU 0 的 Profiling 设备

2 = /dev/profile1 CPU 1 的 Profiling 设备

...

193 char 内核事件跟踪接口

0 = /dev/trace 跟踪控制设备

1 = /dev/trace0 CPU 0 的跟踪设备

2 = /dev/trace1 CPU 1 的跟踪设备

...

195 char Nvidia 图形设备(比如显卡)

0 = /dev/nvidia0 第1个 Nvidia 卡

1 = /dev/nvidia1 第2个 Nvidia 卡

...

255 = /dev/nvidiactl Nvidia 卡控制设备

202 char 特定于CPU模式的寄存器(model-specific register,MSR)

0 = /dev/cpu/0/msr CPU 0 的 MSRs

1 = /dev/cpu/1/msr CPU 1 的 MSRs

...

203 char CPU CPUID 信息

0 = /dev/cpu/0/cpuid CPU 0 的 CPUID

1 = /dev/cpu/1/cpuid CPU 1 的 CPUID

...

===================================================================

这部分详细说明一些应该或可能存在于 /dev 目录之外的文件。

链接最好使用与这里完全相同的格式(绝对路径或相对路径)。

究竟是使用硬链接(hard)还是软连接(symbolic)取决于不同的设备。

必须的链接

必须在所有的系统上都存在这些连接:

链接 目标 链接类型 简要说明

/dev/fd /proc/self/fd symbolic 文件描述府

/dev/stdin fd/0 symbolic 标准输入文件描述府

/dev/stdout fd/1 symbolic 标准输出文件描述符

/dev/stderr fd/2 symbolic 标准错误文件描述符

/dev/nfsd socksys symbolic 仅为 iBCS-2 所必须

/dev/X0R null symbolic 仅为 iBCS-2 所必须

[注意] /dev/X0R 是 <字母 X>-<数字 0>-<字母 R>

推荐的链接

推荐在所有的系统上都存在这些连接:

链接 目标 链接类型 简要说明

/dev/core /proc/kcore symbolic 为了向后兼容

/dev/ramdisk ram0 symbolic 为了向后兼容

/dev/ftape qft0 symbolic 为了向后兼容

/dev/bttv0 video0 symbolic 为了向后兼容

/dev/radio radio0 symbolic 为了向后兼容

/dev/i2o* /dev/i2o/* symbolic 为了向后兼容

/dev/scd? sr? hard 代替 SCSI CD-ROM 的名字

本地定义的链接

下面的链接很可能需要根据机器的实际硬件配置创建其中的一部分甚至全部。

这些链接仅仅是为了迎合习惯用法,它们既非必须也非推荐。

链接 目标 链接类型 简要说明

/dev/mouse mouse port symbolic 当前鼠标

/dev/tape tape device symbolic 当前磁带

/dev/cdrom CD-ROM device symbolic 当前CD-ROM

/dev/cdwriter CD-writer symbolic 当前CD-writer

/dev/scanner scanner symbolic 当前扫描仪

/dev/modem modem port symbolic 当前调制解调器

/dev/root root device symbolic 当前根文件系统所在设备

/dev/swap swap device symbolic 当前swap所在设备

/dev/modem 不应当用于能够同时支持呼入和呼出的modem,因为往往会导致锁文件问题。

如果存在 /dev/modem ,那么它应当指向一个恰当的主 TTY 设备。

对于SCSI设备,

/dev/tape 和 /dev/cdrom 应该分别指向"cooked"设备 /dev/st* 和 /dev/sr* ;

而 /dev/cdwriter 和 /dev/scanner 应当分别指向恰当的 /dev/sg* 。

/dev/mouse 可以指向一个主串行 TTY 设备、一个硬件鼠标、

或者一个对应鼠标驱动程序的套接字(例如 /dev/gpmdata)。

套接字和管道

持久套接字和命名管道可以存在于 /dev 中。常见的有:

/dev/printer socket lpd 本地套接字

/dev/log socket syslog 本地套接字

/dev/gpmdata socket gpm 鼠标多路复用器(multiplexer)

/dev/gpmctl socket (LFS-LiveCD中出现)

/dev/initctl fifo pipe init 监听它并从中获取信息(用户与 init 进程交互的通道)

挂载点

以下名称被保留用于挂载特殊的文件系统。

这些特殊的文件系统只提供内核界面而不提供标准的设备节点。

/dev/pts devpts PTY slave 文件系统

/dev/shm tmpfs 提供对 POSIX 共享内存的直接访问

===================================================================

终端(或TTY)设备是一种特殊的字符设备。终端设备是可以在会话中扮演控制终端角色的任何设备,

包括:虚拟控制台、串行接口(已废弃)、伪终端(PTY)。

所有的终端设备共享一个通用的功能集合:line discipline,

它既包含通用的终端 line discipline 也包含SLIP和PPP模式。

所有的终端设备的命名都很相似。这部分内容将解释命名规则和各种类型的TTY(终端)的使用。

需要注意的是这些命名习惯包含了几个历史遗留包袱。

其中的一些是Linux所特有的,另一些则是继承自其他系统,

还有一些反映了Linux在成长过程中抛弃了原来借用自其它系统的一些习惯。

井号(#)在设备名里表示一个无前导零的十进制数。

虚拟控制台(Virtual console)和控制台设备(console device)

虚拟控制台是在系统视频监视器上全屏显示的终端。

虚拟控制台被命名为编号从 /dev/tty1 开始的 /dev/tty# 。

/dev/tty0 是当前虚拟控制台。

/dev/tty0 用于在不能使用帧缓冲设备(/dev/fb*)的机器上存取系统视频卡,

注意,不要将 /dev/console 用于此目的。

/dev/console 由内核管理,系统消息将被发送到这里。

单用户模式下必须允许 login 使用 /dev/console 。

串行接口(已废弃)

这里所说的"串行接口"是指 RS-232 串行接口和任何模拟这种接口的设备,

不管是在硬件(例如调制解调器)还是在软件(例如ISDN驱动)中模拟。

在linux中的每一个串行接口都有两个设备名:

主设备或呼入(callin)设备、交替设备或呼出(callout)设备。

设备类型之间使用字母的大小写进行区分。

比如,对于任意字母X,"tty"设备名为 /dev/ttyX# ,而"cu"设备名则为 /dev/cux# 。

由于历史原因,/dev/ttyS# 和 /dev/ttyC# 分别等价于 /dev/cua# 和 /dev/cub# 。

名称 /dev/ttyQ# 和 /dev/cuq# 被保留为本地使用。

伪终端(PTY)

伪终端用于创建登陆会话或提供其它功能,

比如通过 TTY line discipline (包括SLIP或者PPP功能)来处理任意的数据生成。

每一个 PTY 都有一个master端和一个slave端。按照 System V/Unix98 的 PTY 命名方案,

所有master端共享同一个 /dev/ptmx 设备节点(打开它内核将自动给出一个未分配的PTY),

所有slave端都位于 /dev/pts 目录下,名为 /dev/pts/# (内核会根据需要自动生成和删除它们)。

一旦master端被打开,相应的slave设备就可以按照与 TTY 设备完全相同的方式使用。

master设备与slave设备之间通过内核进行连接,等价于拥有 TTY 功能的双向管道(pipe)。

===============================

你可能会很奇怪,为什么没有 /dev/hda 这样的设备,难道不常用么?

原因在于从 2.6.19 开始,内核引入了新的ATA驱动,将SATA/IDE硬盘同意使用 /dev/sd? 来表示了,所以 /dev/hd? 就没有存在的必要了

自动节点的添加:

自学驱动以来,一直都是在加载模块后采用手动创建节点,虽然这个过程比较简单,毕竟还是有点麻烦,尤其是在调试模块的时候。

#insmod module_name.ko

#mknod /dev/module_name c MAJOR MINOR

#

在2.4里设备文件采用的是devfs,在2.6里已经用udev取代devfs,为解决上面那样手动创建节点的麻烦,我们可以在程序里加上创建节点这项,如下:

以字符设备char_dev为例,在驱动初始化的代码里调用class_create为该设备创建一个class,再为每个设备调用 class_device_create创建对应的设备,这样的module被加载时,undev daemon就会自动在/dev下创建char_dev设备文件。大概方法如下:

struct class *myclass = class_create(THIS_MODULE, “char_dev”);

class_device_create(myclass, NULL, MKDEV(major_num, 0), NULL, “char_dev”);

当然,在exit函数中要把创建的class移除:

class_destory(&xxx_dev->cdev);

class_device_desotry(my_class,MKDEV(major_num,0));

下面介绍下函数class_creat和class_device_creat的原型:

class_create()

-------------------------------------------------

linux-2.6.22/include/linux/device.h

struct class *class_create(struct module *owner, const char *name)

    class_create - create a struct class structure

    @owner: pointer to the module that is to "own" this struct class

    @name: pointer to a string for the name of this class.

在/sys/class/下创建类目录

class_device_create()

-------------------------------------------------

linux-2.6.22/include/linux/device.h

struct class_device *class_device_creat(struct class        *cls,

                                         struct class_device *parent,

                                         dev_t               devt,

                                         struct device       *device,

                                         const char          *fmt, ...)

    class_device_create - creates a class device and registers it with sysfs

    @cls: pointer to the struct class that this device should be registered to.

    @parent: pointer to the parent struct class_device of this new device, if any.

    @devt: the dev_t for the char device to be added.

    @device: a pointer to a struct device that is assiociated with this class device.

    @fmt: string for the class device's name

void class_destroy(struct class *cls);/*销毁/sys/class下的类   */

void class_device_destroy(struct class *cls, dev_t devt);   /*销毁一个类设备*/

参数含义同上

补充:

在Linux2.6中,针对上面的这个问题不同的版本有些修改,使用前要先查看下/.../include/linux/device.h里的函数声明,如我用的是Linux2.6.29,里面就没有class_device_create函数,而直接使用device_create就可以了,而在之前的版本如Linux2.6.15,里面就要用class_device_create函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/vx349014857/article/details/136141865

智能推荐

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

分布式系统_分布式系统运维工具-程序员宅基地

文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具

用Exce分析l数据极简入门_exce l趋势分析数据量-程序员宅基地

文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线

推荐文章

热门文章

相关标签