導航:首頁 > 編程系統 > 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內核特點相關的資料

熱點內容
kinco用什麼編程軟體 瀏覽:871
簡述文件夾的操作有哪些 瀏覽:766
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

友情鏈接