原创 踩內存:總的來說,是訪問了不應該訪問的內存地址。尤其在C指針中。可以訪問不合法的內存。

現象:掛死,程序跑的異常,數據被串改大致原因:數組越界,字符串操作越界,棧指針操作越界,操作了釋放掉了的指針,多線程時序對資源保護控制不當,內存管理異常,使用了其他地方的內存定位方法:1. 類似內存泄漏的問題,先定界,後定位,

原创 Linux存儲IO棧(4)-- SCSI子系統之概述

概述 Linux SCSI子系統的分層架構: 低層:代表與SCSI的物理接口的實際驅動器,例如各個廠商爲其特定的主機適配器(Host Bus Adapter, HBA)開發的驅動,低層驅動主要作用是發現連接到主機適

原创 LDD:字符設備驅動程序

1.主設備號和次設備號 對字符設備的訪問是通過文件系統內的設備名稱進行的。通常位於/dev/目錄下。 對於設備文件,ls -l命令可以看到兩個數,就是相應設備的主設備號和次設備號。 主設備號標識設備對應的驅動程序(driver)。次設備號

原创 LDD:內存映射和DMA

地址類型 用戶虛擬地址 物理地址 總線地址 內核邏輯地址 內核虛擬地址   用戶虛擬地址 用戶空間程序所看到的常規地址。用戶地址是32位或者64位的,這取決於硬件的體系結構。每個進程都有自己的虛擬地址空間。   物理地址 該地址在處理器和

原创 LDD:中斷處理

1. Linux處理中斷的方式很大程度上與它在用戶空間處理信號時一樣的。 2. 從本質上講,中斷處理例程和其他代碼併發運行。會不可避免引起併發問題,並競爭數據結構和硬件。 3.請求中斷信號線 int request_irq(unsigne

原创 Linux之Input子系統——基於5.4內核

一.Input子系統組成 輸入子系統由驅動層(Drivers),輸入子系統核心層(Input Core),和事件處理層(Event Handler)三部分組成。一個輸入事件,如鼠標移動,鍵盤按下等都是通過Driver -> Input C

原创 LDD:與硬件通信

I/O端口和I/O內存 每種外設都通過讀寫寄存器進行控制。大部分外設都有幾個寄存器,不管是在內存地址空間還是在I/O地址空間,這些寄存器的訪問地址時連續的。 在硬件層,內存區域和I/O區域沒有概念上的區別:它們都通過向地址總線和控制總線發

原创 LDD:時間、延遲及延緩操作

現實中的設備驅動程序除了實現必需的操作外還要做更多的工作,如定時、內存管理,硬件訪問等。

原创 12.Linux之輸入子系統分析(詳解)

12.Linux之輸入子系統分析(詳解) </h1> <div class="clear"></div> <div class="postBody"> 在此節之前,我們學的都

原创 LDD:高級字符驅動程序操作

ioctl系統調用:用於設備控制的公共接口,通過設備驅動程序執行各種類型的硬件控制。 系統調用原型:int ioctl(int fd, unsigned long cmd, ......) 驅動程序的ioctl方法原型:int (*ioc

原创 LDD:併發和競態

併發的來源: 1.正在運行的多個用戶空間進程可能以一種令人驚訝的組合方式訪問我們的代碼。 2.SMP系統甚至可在不同的處理器上同時執行我們的代碼。 3.內核是可搶佔的,驅動程序代碼可能在任何時候丟失對處理器的獨佔 4.設備中斷時異步事件,

原创 內存泄漏

參看資料:https://www.cnblogs.com/mfrbuaa/p/3851742.html 1. 什麼是內存泄漏(memory leak)?        指因爲疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。內

原创 內存管理:mmap內存映射

Linux驅動mmap內存映射 </h1> <div class="clear"></div> <div class="postBody"> mmap在linux哪裏?

原创 筆記:內存管理

進程使用對應內存區域的5個數據區: 代碼段:代碼指令,不可寫 數據段:存放初始化的全局變量和靜態變量(static) BSS:存放未初始化的全局變量和靜態變量(static) 堆:存放運行中動態分配的內存 棧:存放臨時局部變量、函數參數、

原创 筆記:進程和線程的關係

1. 進程是運行時程序的封裝,是系統進行資源分配和調度的基本單位。 2. 線程是進程的子任務,是CPU進行調度和分配的基本單位,是比線程更小的能獨立運行的基本單位。 進程與線程的關係 1. 一個線程只能屬於一個進程,而一個進程可以有多個線