导航:首页 > 编程系统 > linux42内核特点

linux42内核特点

发布时间:2025-01-14 01:08:20

Ⅰ 使用/dev/random生成随机整数

很多库例程产生的“随机”数是准备用于仿真、游戏等等;它们在被用于密钥生成一类的安全函数时是不够随机的。其问题在于这些库例程使用的算法的未来值可以被攻击者轻易地推导出来(虽然看起来它们可能是随机的)。对于安全函数,需要的随机值应该是基于量子效应之类的确实无法预测的值。linux内核(1.3.30以上)包括了一个随机数发生器/dev/random,对于很多安全目的是足够的。

/dev/random 是如何创建随机数的呢?

Linux 操作系统提供本质上随机(或者至少具有强烈随机性的部件)的库数据。这些数据通常来自于设备驱动程序。例如,键盘驱动程序收集两个按键之间时间的信息,然后将这个环境噪声填入随机数发生器库。

随机数据存储在 熵池中,它在每次有新数据进入时进行“搅拌”。这种搅拌实际上是一种数学转换,帮助提高随机性。当数据添加到熵池中后,系统估计获得了多少真正随机位。

测定随机性的总量是很重要的。问题是某些量往往比起先考虑时看上去的随机性小。例如,添加表示自从上次按键盘以来秒数的 32 位数实际上并没有提供新的 32 位随机信息,因为大多数按键都是很接近的。

从 /dev/random 中读取字节后,熵池就使用 MD5 算法进行密码散列,该散列中的各个字节被转换成数字,然后返回。

如果在熵池中没有可用的随机性位, /dev/random 在池中有足够的随机性之前等待,不返回结果。这意味着如果使用 /dev/random 来产生许多随机数,就会发现它太慢了,不够实用。我们经常看到 /dev/random 生成几十字节的数据,然后在许多秒内都不产生结果。

幸运的是有熵池的另一个接口可以绕过这个限制:/dev/urandom。即使熵池中没有随机性可用,这个替代设备也总是返回随机数。如果您取出许多数而不给熵池足够的时间重新充满,就再也不能获得各种来源的合用熵的好处了;但您仍可以从熵池的 MD5 散列中获得非常好的随机数!这种方式的问题是,如果有任何人破解了 MD5 算法,并通过查看输出了解到有关散列输入的信息,那么您的数就会立刻变得完全可预料。大多数专家都认为这种分析从计算角度来讲是不可行的。然而,仍然认为 /dev/urandom 比 /dev/random 要“不安全一些”(并通常值得怀疑)。

应用中出现的问题:

在我们的服务器程序中,用户登陆的时候会读取/dev/random产生随机数,问题来了,当用户登陆比较密集,这时候read就会返回特别慢,并且返回的字节数也比要求的少,甚至不返回――阻塞。我们把用户登陆处理函数放在了线程池里,导致的问题就是线程池里所有线程都可能会阻塞,这就造成了拒绝服务攻击。导致其他用户登陆失败。

解决方案:

CODE:1 #include <stdio.h>

2 #include <string.h>

3 #include <sys/types.h>

4 #include <sys/stat.h>

5 #include <sys/file.h>

6 #include <sys/time.h>

7 #include <errno.h>

8 #include <unistd.h>

9 #include <stdlib.h>

10

11 static int get_random_fd (void)

12 {

13 static int fd = -2;

14

15 if (fd == -2)

16 {

17 fd = open ("/dev/random", O_RDONLY | O_NONBLOCK);

18 if (fd == -1)

19 fd = open ("/dev/urandom", O_RDONLY | O_NONBLOCK);

20 }

21

22 return fd;

23 }

24

25 /*

26 * Generate a series of random bytes. Use /dev/random if possible,

27 * and if not, use /dev/urandom.

28 */

29 void get_random_bytes(void* buf, int nbytes)

30 {

31 int i, fd = get_random_fd();

32 int lose_counter = 0;

33 char *cp = (char*)buf;

34 struct timeval tv;

35 static unsigned seed = 0;

36

37 if (fd >= 0)

38 {

39 while (nbytes > 0)

40 {

41 i = read (fd, cp, nbytes);

42 if ((i < 0) &&

43 ((errno == EINTR) || (errno == EAGAIN)))

44 continue;

45

46 if (i <= 0)

47 {

48 if (lose_counter++ == 8)

49 break;

50

51 continue;

52 }

53 nbytes -= i;

54 cp += i;

55 lose_counter = 0;

56 }

57 }

58

59 for (i = 0; i < nbytes; i++)

60 {

61 if (seed == 0)

62 {

63 gettimeofday(&tv, 0);

64 seed = (getpid() << 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec;

65 }

66 *cp++ = rand_r(&seed) & 0xFF;

67 }

68

69 return;

70 }

13行: 定义fd为静态变量,这样只打开一次设备。

17 – 19行: 无阻塞模式打开/dev/random设备。如果该设备打开失败尝试打开/dev/urandom。

29行: void get_random_bytes(void* buf, int nbytes)函数是提供给用户的接口,用户调用这个函数就可以得到随机数。

37-57行: read有可能返回的字节数小于请求的字节数。这时候就循环读直到读够了所请求的大小。这样最多重复8次。然后返回。

59-67行: 如果上面重复8次都没有读够所请求的字节数,则我们自己生成随机数来填充。

注意:打开的fd我们并没有关闭,请您根据自己需求在合适的地方关闭。

Ⅱ 如何查看linux服务器的cpu数量,内核数,和cpu线程数

lscpu命令,查看的是cpu的统计信息.
blue@blue-pc:~$ lscpu
Architecture: i686 #cpu架构
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian #小尾序
CPU(s): 4 #总共有4核
On-line CPU(s) list: 0-3
Thread(s) per core: 1 #每个cpu核,只能支持一个线程,即不支持超线程
Core(s) per socket: 4 #每个cpu,有4个核
Socket(s): 1 #总共有1一个cpu
Vendor ID: GenuineIntel #cpu产商 intel
CPU family: 6
Model: 42
Stepping: 7
CPU MHz: 1600.000
BogoMIPS: 5986.12
Virtualization: VT-x #支持cpu虚拟化技术
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 6144K

查看/proc/cpuinfo,可以知道每个cpu信息,如每个CPU的型号,主频等。
#cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 42
model name : Intel(R) Core(TM) i5-2320 CPU @ 3.00GHz
.....
上面输出的是第一个cpu部分信息,还有3个cpu信息省略了。

内存
概要查看内存情况
free -m
total used free shared buffers cached
Mem: 3926 3651 274 0 12 404
-/+ buffers/cache: 3235 691
Swap: 9536 31 9505
这里的单位是MB,总共的内存是3926MB。

查看内存详细使用
# cat /proc/meminfo
MemTotal: 4020868 kB
MemFree: 230884 kB
Buffers: 7600 kB
Cached: 454772 kB
SwapCached: 836 kB
.....

查看内存硬件信息
dmidecode -t memory
# dmidecode 2.11
SMBIOS 2.7 present.
Handle 0x0008, DMI type 16, 23 bytes
Physical Memory Array
Location: System Board Or Motherboard
....
Maximum Capacity: 32 GB
....
Handle 0x000A, DMI type 17, 34 bytes
....
Memory Device
Array Handle: 0x0008
Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Size: 4096 MB
.....
我的主板有4个槽位,只用了一个槽位,上面插了一条4096MB的内存。

磁盘
查看硬盘和分区分布
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465.8G 0 disk
├—sda1 8:1 0 1G 0 part /boot
├—sda2 8:2 0 9.3G 0 part [SWAP]
├—sda3 8:3 0 74.5G 0 part /
├—sda4 8:4 0 1K 0 part
├—sda5 8:5 0 111.8G 0 part /home
└—sda6 8:6 0 269.2G 0 part
显示很直观

如果要看硬盘和分区的详细信息
# fdisk -l
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00023728
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2148351 1073152 83 Linux
/dev/sda2 2148352 21680127 9765888 82 Linux swap / Solaris
/dev/sda3 21680128 177930239 78125056 83 Linux
/dev/sda4 177932286 976771071 399419393 5 Extended/dev/sda5 177932288 412305407 117186560 83 Linux
/dev/sda6 412307456 976771071 282231808 83 Linux

网卡
查看网卡硬件信息
# lspci | grep -i 'eth'
02:00.0 Ethernet controller: Realtek Semiconctor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06)

查看系统的所有网络接口
# ifconfig -a
eth0 Link encap:以太网 硬件地址 b8:97:5a:17:b3:8f
.....
lo Link encap:本地环回
.....
或者是
ip link show
1: lo: <LOOPBACK> mtu 16436 qdisc noqueue state DOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether b8:97:5a:17:b3:8f brd ff:ff:ff:ff:ff:ff

如果要查看某个网络接口的详细信息,例如eth0的详细参数和指标
# ethtool eth0
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full #支持千兆半双工,全双工模式
Supported pause frame use: No
Supports auto-negotiation: Yes #支持自适应模式,一般都支持
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes #默认使用自适应模式
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
.....
Speed: 100Mb/s #现在网卡的速度是100Mb,网卡使用自适应模式,所以推测路由是100Mb,导致网卡从支 持千兆,变成要支持百兆
Duplex: Full #全双工
.....
Link detected: yes #表示有网线连接,和路由是通的

其他
查看pci信息,即主板所有硬件槽信息。
lspci
00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09) #主板芯片
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09) #显卡
00:14.0 USB controller: Intel Corporation Panther Point USB xHCI Host Controller (rev 04) #usb控制器
00:16.0 Communication controller: Intel Corporation Panther Point MEI Controller #1 (rev 04)
00:1a.0 USB controller: Intel Corporation Panther Point USB Enhanced Host Controller #2 (rev 04)
00:1b.0 Audio device: Intel Corporation Panther Point High Definition Audio Controller (rev 04) #声卡
00:1c.0 PCI bridge: Intel Corporation Panther Point PCI Express Root Port 1 (rev c4) #pci 插槽
00:1c.2 PCI bridge: Intel Corporation Panther Point PCI Express Root Port 3 (rev c4)
00:1c.3 PCI bridge: Intel Corporation Panther Point PCI Express Root Port 4 (rev c4)
00:1d.0 USB controller: Intel Corporation Panther Point USB Enhanced Host Controller #1 (rev 04)
00:1f.0 ISA bridge: Intel Corporation Panther Point LPC Controller (rev 04)
00:1f.2 IDE interface: Intel Corporation Panther Point 4 port SATA Controller [IDE mode] (rev 04) #硬盘接口
00:1f.3 SMBus: Intel Corporation Panther Point SMBus Controller (rev 04)
00:1f.5 IDE interface: Intel Corporation Panther Point 2 port SATA Controller [IDE mode] (rev 04) #硬盘接口
02:00.0 Ethernet controller: Realtek Semiconctor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06) #网卡
03:00.0 PCI bridge: Integrated Technology Express, Inc. Device 8893 (rev 41)
如果要更详细的信息:lspci -v 或者 lspci -vv
如果要看设备树:lscpi -t

查看bios信息
# dmidecode -t bios
......
BIOS Information
Vendor: American Megatrends Inc.
Version: 4.6.5
Release Date: 04/25/2012
.......
BIOS Revision: 4.6
......
dmidecode以一种可读的方式mp出机器的DMI(Desktop Management Interface)信息。这些信息包括了硬件以及BIOS,既可以得到当前的配置,也可以得到系统支持的最大配置,比如说支持的最大内存数等。
如果要查看所有有用信息
dmidecode -q
以上是linux查看硬件信息的所有命令,可以查看CPU、硬盘、网卡、磁盘等硬件的信息。

Ⅲ Linux发行版和Linux内核的区别

首先解释一下什么是Linux发行版(英文名称是Linux Distribution)。Linux实际上是一种开放源代码的操作系统内核,通常我们说的Linux指的是基于Linux内核的操作系统。Linux操作系统包括Linux内核和Linux用户态程序,Linux内核和Linux用户态程序都是开放源代码的,绝大多数软件代码遵循GPL协议,任何人拿到这些代码都可以对这些代码进行修改和分发。由于Linux上代码的高度自由,很多公司和组织都推出了自己的Linux操作系统,这些Linux操作系统我们就叫做Linux发行版。

各种不同的Linux发行版的共同点就是都使用了Linux内核,不同的Linux发行版的内核可能有一些小的修改。

Ⅳ Linux为什么具有这么高的稳定性

人们会经常提及一个问题为什么Linux几乎不崩溃,Linux的稳定性是由于它没有象其它操作系统一样内核如此庞大、漏洞无穷。考察资料表明,Linux与其它Unix系统和大型操作系统如VMS、IBM大型机等一样具有相同的可靠性。原因并不难以得到,系统的稳定性主要取决于系统设计的结构。计算机硬件的结构自从1981设计开始就没有作特别大的改动,而连续向后兼容性使那些编程风格极差的应用软件勉强移植到Windows的最新版本,这种将就的软件开发模式极大地阻碍了系统稳定性的发展。另一种易于崩溃的系统Macintosh,它缺乏内存使用保护和缺乏抢占式多任务的缺点与它友好的使用界面一样闻名于世,令人惊奇的是Macintosh虽然具有如此重大的缺陷但并没有如人们想象的那样频繁死机。
Linux的稳定性并不是一个意外的例外,稳定性是所有大型计算机操作系统所具有的共性。仅仅Windows和苹果机有时会失常。Linux所共享的Unix设计体系是经过长期实践考验的,Linux吸取了Unix系统近1/4世纪发展的经验,Linux操作系统体现了最先现代化操作系统的设计理念和最经得住时间考验的设计方案。最令人注目的是Linux开发源代码的开发模式,这保证了任何系统的漏洞都能被及时发现和改正。
就如IBM在其网站上所说的一样,Linux是一个稳定的、功能强大的、值得使用的操作系统。

Ⅳ 介绍一下LINUX有哪些版本

1.5.1 Linux常见发行版本介绍

Linux常见发行商包括Redhat、Debian、Fedora、SUSE、CentOS、Ubuntu、麒麟……

其中,对于Linux运维来说,下面几个是重要的服务端发行版本。

1) Red Hat:Red Hat Linux9.0的内核为2.4.20。在版本9.0后,Red Hat不再遵循GPL协议,成为收费产品(但仍开源),发展的新版本依次为3.x、4.x、5.x、6.x、7.x、8.x。

2) Fedora:Red Hat的一个分支,仍遵循GPL协议,可以认为是Red Hat预发布版。

3) CentOS:Red Hat的另一个分支,以Red Hat发布的源代码重建符合GPL许可协议的Linux系统,即将其源代码的商标LOGO以及非自由软件部分去除后再编译而成的版本,目前CentOS已被Red Hat公司收购,但仍开源免费。

重点:CentOS、Redhat、Ubuntu(server版)是当下最重要的版本

Ⅵ 盘一盘Linux内核中ns级别的高精度计时方法

在Linux内核中,尽管系统本身和中断的存在限制了其提供ns级别的高精度计时,常规内核高精度计时器只能勉强达到us级别且误差较大。因此,在需要ns级别精确计时的场景下,需要借助其他方法。以下介绍两种针对不同处理器平台的精确计时方式:x86平台和ARM平台。

### x86平台下的精确计时

从Pentium开始,x86平台引入了时间戳计数器(TSC),这是一个用于记录自上电启动以来CPU执行周期数的64位寄存器。在每个时钟信号到来时,TSC自动加一。若CPU主频为2GHz,每条指令执行时间为0.5ns。通过读取TSC的当前值,可以计算出代码执行的时间。具体操作是在代码段的A点和B点分别读取TSC,两值相减并乘以指令周期,即可得到A点和B点间代码执行的耗时。

### ARM平台下的精确计时

对于ARM平台,虽然没有直接提供类似TSC的寄存器,但通过定时计数器实现精确计时是可行的。定时器能够提供计数和计数比较功能,计数频率由系统时钟经过分频决定,且不受系统软件影响,可以实现较高的精度。以24MHz计数频率为例,每秒计数24000000次,转换为us级别,每计数一次为42ns。通过驱动程序直接访问相关寄存器,可以实现精确的计时功能。

### ARM平台的计数器使用

在ARM架构的芯片上,定时器的使用涉及频率、控制、计数等关键寄存器。通过设置计数器频率控制器(CNTFRQ_EL0)和物理计数器控制寄存器(CNTP_CTL_EL0),可以启用计数器进行精确计时。计数器在使能后开始计数,即使被停止计数,仍会继续计数直到断电。驱动程序通过死循环轮询计数寄存器,可以验证计数器的精度,并实现精确的计时功能。

### 性能监控寄存器

ARM平台还提供性能监控寄存器(Performance Monitors registers),包括性能监控控制寄存器(PMCR_EL0)、计数使能寄存器(PMCNTENSET_EL0)和周期计数寄存器(PMCCNTR_EL0)。这些寄存器主要用于CPU性能监控,但同样提供了计数功能,可以用于精确计时。通过结合性能监控单元(PMU),可以实现高级的性能监控和计时。

通过上述方法,x86和ARM平台在特定场景下能够实现ns级别的精确计时,为开发者提供了灵活的计时解决方案。

阅读全文

与linux42内核特点相关的资料

热点内容
dnf90版本buff人偶 浏览:690
ps中pdf文件黑点怎么去除 浏览:927
n卡的临时文件在哪里 浏览:590
移动华为4x解锁工具 浏览:493
有时候微信的文件怎么发不出去 浏览:335
美版5s版本能不能升级系统升级 浏览:167
cad自动关闭怎么找回文件 浏览:289
小蚂蚁app怎么赚钱下载 浏览:178
项目部有哪些文件 浏览:119
nodejswindows升级 浏览:471
焊接工艺规程由哪些技术文件组成 浏览:993
无线网怎么改路由器密码忘了怎么办 浏览:408
拳皇安卓模拟器文件 浏览:537
win10桌面小键盘怎么关 浏览:884
word打印页边距 浏览:627
韩国个人网站模板 浏览:997
win10常用位置 浏览:746
游戏王gba版本怎么玩 浏览:962
xperiaz5安卓70 浏览:728
手机qq主题美化神器63 浏览:45

友情链接