原创 const成員函數

const成員函數 const只能放在函數聲明的尾部,大概是因爲其它地方都已經被佔用了。這個聲明表示任這個函數不會修改類中的數據成員。如果在編寫const成員函數時,不慎修改了數據成員,或者調用了其它非const成員函數,編譯器將指出

原创 c++智能指針

靜態內存和棧內存。靜態內存用來保存局部的static對象、類的static數據成員以及定義在任何函數之外的變量。棧內存用來保存定義在函數內的非static的對象。分配在靜態或者棧內存中的對象由編譯器自動創建和銷燬。 對於棧對象,僅在其

原创 linux gcc鏈接選項詳解

-I(大寫i) -L(大寫L) -l(小寫l) (1)-l -I(大寫i)

原创 程序編譯過程分析

1.概述 一個C語言程序從源代碼文件變成最後的可執行程序文件,需要經歷預處理、編譯、彙編、鏈接四個過程。 預處理:條件編譯、頭文件包含、宏替換,生成.i文件 編譯:將預處理後的文件轉換成彙編語言,生成.s文件 彙編:彙編變爲目標代碼

原创 C語言判斷大小端存儲

用C語言寫程序時需要知道是大端模式還是小端模式。 所謂的大端模式,是指數據的低位保存在內存的高地址中,而數據的高位,保存在內存的低地址中; 所謂的小端模式,是指數據的低位保存在內存的低地址中,而數據的高位保存在內存的高地址中。 爲什

原创 GNU/Linux下的/proc/[pid]目錄下的文件分析

一、相關文件目錄 /proc/[pid]/auxv /proc/[pid]/cmdline /proc/[pid]/comm /proc/[pid]/cwd /proc/[pid]/environ /proc/[pid]/exe /pro

原创 C++基礎複習

C++ 引用 int add(int &b) { b=b+1; return b; } int main() { int a=99; printf("%d\n",add(a)); } 構造函數 #include<iostream> usi

原创 cpu如何通過MMU訪問到物理地址

cpu的MMU開啓後,cpu的尋址過程如下:CPU任何時候發出的地址都是虛擬地址,這個虛擬地址發給MMU後,MMU通過頁表在頁表裏面查出這個虛擬地址對應的物理地址是什麼,從而去訪問外面的內存條。MMU裏面的頁表地址寄存器,記錄了頁表本身存

原创 C語言之指針的初始化和賦值

1.指針的初始化 指針初始化時,“=”的右操作數必須爲內存中數據的地址,不可以是變量,也不可以用整型的地址值(但是int *p=0;除外,該語句表示指針爲空)此時,*p=只是表示定義的是個指針變量,並沒有間接取值的意思。 Example

原创 linux no space left on device

尋找原因 從字面上理解,這個問題是說磁盤上沒有多餘的空間。 那麼到底是什麼地方將空間? 先用df命令查看當前計算器磁盤空閒情況 df -a 我這邊執行完後可以看到/dev/sda3被完全佔用 從根目錄下開始使用du命令查找出空間佔用最

原创 linux驅動之DMA驅動

DMA是一種無需CPU的參加就可以讓外設與系統內存之間進行雙向數據傳輸的硬件機制。它可以使系統CPU從實際的I/O數據傳輸過程中擺脫出來,大大提高系統的吞吐率,並且在傳輸期間,CPU還可以併發執行其他任務。 #include<linux/

原创 cached和buffer

有資料認爲:free命令裏面的buffers是爲了寫而產生,而cached是爲了讀而產生。 真實情況下,cached和buffers與讀寫沒有半毛錢關係,它們都是緩存,唯一的區別是,如果你cat /dev/sda1 > /dev/nul

原创 塊設備驅動再次剖析

假設對flash:1.寫扇區0,2.寫扇區1 1. 讀出整塊到buffer, 修改buffer裏扇區0 擦除整塊 燒寫整塊 2.讀出整塊到buffer 修改buffer裏扇區1 擦除整塊 燒寫整塊 框架: app:o

原创 指針加常數的計算結果

#include <stdio.h> struct BBB { long num; char *name; short int data; char ha; short

原创 c語言之強制類型轉換

C語言中,任何一個變量必須有一個地址,而這個地址空間內的0-1代碼就是這個變量的值。不同的數據類型佔用的空間代碼不一樣,但是他們都必須有個地址,而這個地址就是硬件訪問的依據,而名字只是提供給程序員的一種記住這個地址的方便一點的方法。但是,