❶ 如何查看linux內核中printk列印的信息
printk() 和 printf() 幾乎沒有什麼兩樣, 唯一的差別是 printk() 會把輸出的結果,送到內核的環緩沖區回 (ring buffer)裡面。這個緩沖區是系答統所有信息集中的地方,就像開機時所看到的信息,都可以在這個環緩沖區找到。 任何時候, 我們都可以用 dmseg 命令查看環緩沖區的內容, 或是直接檢驗 /proc/kmsg 這個文件。
❷ linux如何保護共享資源
主要有一下幾種:中斷屏蔽、 原子操作、自旋鎖、信號量、環形緩沖區。在本文中對於這些機制的具體的實現函數,以及原理不再做任何的表述。本 一、原子變數 假設我們所需要保護的共享資源只是一個整數值,此時我們可以採用的機制有自旋鎖,信號量,和原子變數,當然中斷屏蔽也是可以的。但是如果選擇最優的機制,我們應該選擇原子變數。原因:1.對一個整數值的操作是很簡單的,也就是說此對全局變數形成的臨界區是很小的.如果我們採用其他的機制,例如鎖的機制,信號量等就顯得有些浪費.也就是說,你的鎖機制的代碼量可能比臨界區的代碼量還要多.2. 對一個缺乏經驗的程序員來講,由於思維缺乏邏輯,使用鎖機制會存在很多潛在的風險.例如: 死鎖.等問題;而採用原子變數的方法,可以避免鎖機制產生的弊端. 二、自旋鎖自旋鎖機制和信號量機制都可以對資源進行互斥訪問,但是從性能上講,自旋鎖的性能優於信號量。但是自旋鎖機制本身在不停的自旋(也就是查詢鎖是否可用),導致此機制有一些缺點:1。假定我們的驅動程序獲得了一個自旋鎖,在臨界區開始了他的工作期間,驅動程序丟掉了處理器。也許他調用了一個函數,這個函數使進程休眠。也許發生了內核的搶占。但是我們的代碼擁有這個自旋鎖,如果其他的進程想要獲得此自旋鎖,需要等很長時間,甚至造成死鎖。所以我們應用自旋鎖時應遵循:任何擁有自旋鎖的代碼必須是原子的。所以他不能休眠,所以不能調用能夠引起休眠的函數。例如:_to_user,_from_user,kmalloc等。也不能因為任何原因放棄處理器,除了中斷以外(有時中斷也不行,可以採用禁止中斷的自旋鎖函數操作)。 三、信號量擁有信號量的進程是可以休眠的。這也正是他對於自旋鎖的優勢。 其他的暫不論述。
❸ 求助求助 red hat linux操作系統實現electron模塊載入的指令
內核模塊的程序結構
模塊載入函數(必須)
當通過insmod或modprobe命令載入內核模塊時,模塊會自動被內核執行,完成模塊的相關初始化工作。
一般以 __init標識聲名函數,並且用「mole_init(初始化函數名)」來初始化
模塊卸載函數
模塊許可證聲名
模塊參數
模塊導出符號
模塊作者等信息聲名
獨立編譯Makefile
#makefile for kernel mole
MODNAME=helloworld
ifeq ($(PLATFORM), PC)
KERNELDIR?=/lib/moles/$(shell uname -r)/build
else
KERNELDIR?=你的linux源碼編譯路徑
endif
obj-m := $(MODNAME).o
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles
clean:
@rm -rf *.o *.ko *.mod.* *.tmp* mole* Mole*
123456789101112131415
注意ifeq 後面要有個空格
模塊測試源碼
#include <linux/init.h>
#include <linux/mole.h>
static int __init helloworld_init(void)
{
printk(KERN_DEBUG "My first hello world kernel mole!\n");
return 0;
}
static void __exit helloworld_exit(void)
{
printk(KERN_DEBUG "Bye,cruel world !\n");
}
mole_init(helloworld_init);
mole_exit(helloworld_exit);
1234567891011121314151617
編譯
初始化變數 export PLATFORM=PC
編譯: make
執行make後得到對應的.ko文件
模塊載入及卸載
insmod helloworld.ko
rmmod helloworld
執行載入命令時我們希望列印 My first hello world kernel mole!
卸載時我們希望能列印 Bye,cruel world !
然而實際上什麼都沒列印,lsmod查看helloworld.ko有成功載入
printk輸出
在Linux中,內核列印語句printk()會將內核信息輸出到內核信息緩沖區中,內核緩沖區是在
kernel/printk.c中通過如下語句靜態定義的:
static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
1
內核信息緩沖區是一個環形緩沖區(Ring Buffer),因此,如果塞入的消息過多,則就會將之前的消
息沖刷掉。
printk()定義了8個消息級別,分為級別0~7,級別越低(數值越大),消息越不重要,第0級是緊急
事件級,第7級是調試級
通過/proc/sys/kernel/printk文件可以調節printk()的輸出等級,該文件有4個數字值:
控制台(一般是串口)日誌級別:當前的列印級別,優先順序高於該值的消息將被列印至控制台。
默認的消息日誌級別:將用該優先順序來列印沒有優先順序前綴的消息,也就是在直接寫printk(「xxx」)而不帶列印級別的情況下,會使用該列印級別。
最低的控制台日誌級別:控制台日誌級別可被設置的最小值(一般都是1)。
默認的控制台日誌級別:控制台日誌級別的默認值。
用戶可以通過dmesg命令查看內核列印緩沖區,而如果使用sudo dmesg -c命令,則不僅會顯示__log_buf,還會清除該緩沖區的內容。
————————————————
版權聲明:本文為CSDN博主「linyplhm」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43777852/java/article/details/101852495
❹ 獲取Arch Linux上存儲設備信息的一些記錄
2019-06-04 遇到的一點小問題
需要獲取在Arch Linux設備上的USB存儲設備的信息,並按格式展示在web端。
同事讓先了解幾個命令,試了試:
在 ArchWiki 上有專門的 fdisk介紹 。
fdisk -l 獲取的設備型號被截斷了,而且信息有點亂,篩選麻煩。
lsscsi應用 ,這篇 說明 挺詳細的。
lsscsi -s 以表格信息獲取設備型名、大小,可惜型號會被截斷。
usbutils應用 ,這篇 List USB Devices Linux 有提到一些。
lsusb 、 lsusb -v 、 usb-devices 、、、列出了不少ID,不過沒打算用這個,先不管。
hdparm應用 ,隨便 搜索 時,剛好看到的。
hdparm -i /dev/sdb 這個主要是獲取或設置硬碟參數的,獲取的信息挺全的,也符合預期,可惜不支持讀取USB上的設備信息。
同事推薦的這篇文章, 16 commands to check hardware information on Linux ,列出了很多檢查Linux上的硬體信息的命令。試了試:
lshw應用 ; lshw介紹 。
lshw 默認輸出太多了。
lshw -class disk -json 還好這個可以篩選需要的,而且還能以json格式輸出。可惜輸出的多條信息中間需要自己加逗號 , ,兩頭加方括弧 [] 。
hwinfo應用 ;沒有在 Arch manual pages 搜索到命令說明書,鏈接是別的網站的。
hwinfo 默認輸出太多了,還好可以加上 --short 。
hwinfo --short --usb 可以只輸出縮略信息,同時支持篩選,比如只顯示usb相關,具體可以看 說明令 。
lsblk 默認輸出 可以獲取完整大小、分區大小,也有一項 MOUNTPOINT 可以看到掛載的位置,也可惜顯示的大小數據不是想要的。
lsblk -b 可以按bytes格式獲取大小後再計算。
lsblk -p 可以完整顯示路徑名稱。
lsblk -S 可以獲取完整的品牌型號名,沒有被截斷;而且名字中間的分割符也不是空格 ,是下劃線 _ ,能很方便地使用 awk 獲取。
翻了翻 說明文件 ,發現 lsblk 功能還是很多的,可以使用 -n 去表頭;可以使用 -o +SIZE 來增加輸出的信息列;可以使用 -o NAME,MODEL,SIZE 限定只輸出哪些信息列;可以使用 -d /dev /sda 來限定只輸出某個設備的信息行;可以使用 -J 以json格式輸出信息。
dmesg命令 :
介紹是 dmesg - print or control the kernel ring buffer , 檢查和控制內核的環形緩沖區 。在搜索的時候也有看到用這個命令來 查看 剛插入的usb信息,當然 dmesg 主要不是做這個的。記錄一下。
還試了些其他命令,懶得整理了。
目前先不安裝其他應用,先使用 lsblk -p -S -b -o NAME,MODEL,SIZE -n 去掉表頭,然後只顯示完整的路徑,完整的型號名稱,以及按照bytes格式獲取存儲設備的大小;已使用的容量大小就等 mount U盤後使用 df 來獲取。
❺ linux iio子系統adc支持多高的采樣率
最近由於工作的需要,接觸了Linux iio子系統,對於這個目錄其實以前是很少接觸,接下了對 Linux iio 子系統進行分析。
1、首先 iio子系統在內核樹中位置:drivers/staging/iio
詳細的iio子系統說明文檔位置:drivers/staging/iio/Documentation(文檔是個好東西,詳細閱讀文檔,有利於更深層次的理解iio子系統)
2、簡介:
iiO子系統全稱是 Instrial I/O subsystem(工業 I/O 子系統),此子系統的目的在於填補那些分類時處在hwmon(硬體監視器)和輸入子系統之間的設備類型。在某些情況下,iio和hwmon、Input之間的相當大的重疊。
3、iio目錄結構架構:
[plain] view plain
iio
├── accel
├── adc
├── addac
├── cdc
├── dac
├── dds
├── Documentation
│ └── dac
├── gyro
├── impedance-analyzer
├── imu
│ └── mpu
│ └── inv_test
├── light
├── magnetometer
├── meter
├── pressure
├── resolver
└── trigger
4、iio 目錄結構說明:
進入相應目錄,裡面都有相關IC的驅動,網上查閱資料,對iio子系統做如下簡要的說明:
accel :
該文件夾下是一些加速度感測器,例如:adis16201、kxsd9、lis3l02dq、sca3000等
adc :
該文件夾下是一些模數轉換器,將模擬信號轉換成數字信號,例如:ad7192、adt7310(數字溫度感測器)等
addac :
Temperature Sensor 溫度感測器,例如:adt7316
cdc :
電容數字轉換,例如:ad7150
dac :
一些數模轉換器,將數字信號轉換成模擬信號,例如:ad5064、ad5791(單通道、20位、無緩沖電壓輸出DAC)等
dds :
頻率掃描儀,頻率合成器,例如:ad5930、ad9951等
Documentation :
iio子系統相關文檔說明,相關說明比較詳細,說明文檔是個好東西……
gyro:
陀螺儀,例如:adis16060(角速度陀螺儀)、adis16260(數字陀螺儀)、adxrs450(角速率陀螺儀)等
impedance-analyzer :
阻抗測量晶元,只有一個晶元ad5933
imu:
慣性陀螺儀、磁力計、加速度計,例如:adis16400,其中的mpu子目錄有些重要的感測器(目前工作中正在使用)
imu
└── mpu:有MPU3050(三軸)、MPU6050(六軸)、MPU9150(整合了MPU6050及AK8975電子羅盤)、MPU6515等
light :
光學感測器,例如:isl29018、tsl2563等
magnetometer :
地磁感測器、磁力計感測器,例如:hmc5843、ak8975
meter :
有功功率和電能計量,例如:ade7759(電能計量數據轉換器)、ade7753等
pressure :
壓力感測器,例如:bmp182
resolver :
旋轉變壓器/數字轉換器,例如:ad2s1200(旋轉變壓器輸出的模擬信號轉化為數字信號)等
trigger:
觸發器
5、iio子系統架構圖:
6、iio子系統功能:
(1)、設備注冊和處理
(2)、通過虛擬文件系統(VFS)輪訓訪問設備
(3)、chrdevs事件
chrdevs事件包括閾值檢測器,自由下落檢測器和更復雜的動作檢測。chrdevs事件的輸入,iio為底層硬體觸發與用戶空間通行提供了通道,chrdevs事件本身已經不僅僅是一個事件的代碼和一個時間戳,與chrdevs事件相關聯的任何數據必須通過輪詢訪問。
(4)、硬體環緩沖支持
現在很多感測器晶元上本身就包括 fifo / ring 緩沖,通過sensor自帶 fifo / ring 緩沖,可以大大的減少主晶元處理器的負擔。
(6)、觸發和軟體緩沖區(kfifo)支持
在許多數據分析中,觸發和軟體緩沖區(kfifo)支持就顯得非常有用,能夠更加高效的捕捉到外部信號數據。這些觸發包括(數據准備信號、GPIO線連接到外部系統、處理器周期中斷、用戶空間訪問sysfs中的特定文件等),都會產生觸發。
7、iio子系統的內核介面
為各種sensor提供了內核介面
8、iio子系統環形緩沖區(如下圖)
iio子系統採用環形緩沖區,環形緩沖區本質是一個數據結構(單一,固定大小,可調並首尾相連),這種結構非常適合緩沖數據流。這些緩沖區通常用來解決生產者消費者問題,在一些應用中,它被設計成生產者會(例如一個ADC)覆蓋消費者(例如一個用戶空間應用程序)無法暫時處理的過期數據。但是通常這種緩沖會被設置為適當的大小,以使這種情況不會發生。