---------------------------------------- Linux 基礎 --------------------------------
1.Linux的誕生
1.unix兩大分支:BSD和system V
2.GUN計劃:容許軟件自由複製更改移植
3.Linux發行版本:red_hat(red_hat) Debian(ubuntu) 系列
4.Linux 用戶界面
1.圖形界面
2.用戶界面
5.Linux操做系統的構建:
硬件--內核--系統調用(保護內核的軟件)--shell(命令解析器)--圖形界面(應用軟件)
6.文件系統:
定義:組織文件在磁盤中儲存
7.Linux的目錄結構
1."/"--根目錄
2."/boot"--用來保存系統啓動信息存放的目錄
3."/dev"--設備目錄(一切皆文件)
4."etc"--配置文件目錄
5."/home"--用戶主目錄
6."/usr"--用戶目錄
7."/bin"--經常使用的命令目錄
8."/lib"--庫目錄
9."/media"--媒體文件的存放目錄
10."/sbin"--管理員文件目錄
8.shell:
bash ksh csh sh
9.x window
KDE.gome
2.基本命令
1.[sram@locolhost~]$--[用戶]
2.命令的基本格式:命令 選項 參數
~表示一個用戶的主目錄
以"."開頭的全部文件,都是隱藏文件
隱藏文件中"."表示當前目錄硬鏈接 ".."表示上層目錄的硬鏈接
3.ls --表示顯示目錄下的全部文件和目錄(不包含隱藏的文件)
-a 顯示全部的文件和目錄
-l 顯示文件的詳細信息
-h 顯示文件的大小(K M G)
-i 顯示文件的inode節點
man ls
4.pwd--顯示當前的完整工做目錄
5.clear 清屏(跳屏)
alias c='clear'添加劇影
source.bashrc 掃描
6.vm工具包的安裝
1.解壓: tar-zxvf vm~
2.cd vm
3./vm ...pl
7.data
顯示系統時間,root用戶可以設置時間
8.man 查看命令或者是函數的幫助文檔
1.系統命令
2.函數調用
3.C語言函數
su - root(轉化爲最高權限用戶)
9.常見的快捷鍵
1.Tab 命令補全鍵
2.ctrl+C 結束當前進程
3.ctrl+D 關閉當前shell
4.ctrl+shift+t 添加一個shell
5.ctrl+z 將進程放在後臺運行
10.linux系統中有三個標準設備
0--標準輸入設備--鍵盤
1--標準輸出設備--屏幕
2--標準錯誤設備--屏幕
〈 表示輸入重定向
〉表示輸出重定向
2〉錯誤重定向前端
----------------------------------day----------------------------------node
1.cd命令--表示切換目錄能夠是絕對路徑也能夠是相對路徑
以"/"開頭的路徑是絕對路徑
不然系統會限制環境變量(CDPATH)中指定的目錄的查找,如失敗,則在當前目錄下查找;
2.mkdir--建立一個空目錄,系統會默認爲該目錄添加一個"."和".."目錄
3.rmdir--刪除一個空目錄
4.drwx------ 3 LH LH 4.OK 11-11 00:42.thumbnails
文件類型 屬主 屬組 其餘用戶 硬鏈接數 最後修改日期
5.touch命令--表示建立一個空檔文件;
6.chmod--修改文件屬性
1.普通方式
格式 chmod 對象(+或-) 權限 文件名
對象 u--user g--group o--other
+ 增長 -減去
權限r/w/x
2.八進制的方式
使用三位八進制數表示三組權限
7.cp--文件的複製
1.-f 強制複製
2.-r 遞歸複製
3.-i 覆蓋以前進行提示
8.mv--文件的剪切或者重命名
1.-f 強制
2.-i 覆蓋以前進行提示
9.rm--刪除文件
-f 強制刪除
-i 刪除前詢問
-r 遞歸的刪除文件
10.in--建立硬鏈接指令
軟鏈接:指對文件建立一個快捷方式;-s
硬鏈接:對文件起一個別名
11.vim編譯器
是由VI發展過來的
vim編譯器有三種模式
1.命令模式
2.插入模式
3.末行模式
在打開文件的時候,首先是命令模式
命令模式--〉插入模式
a/i/o或是A/I/O
a--在光標的下一位置插入
i--在光標的當前位置插入
0--在光標的下一行進行插入
A--在本行末插入
I--在本行的行首插入
0--在光標的上一行插入
插入模式--〉命令模式
"ESC"
命令模式--〉末行模式
":"
末行模式--〉命令模式
"ESC"
插入模式--末行模式不能互相進行轉換
1.命令模式下的指令
1.光標定位
h-左移一個光標
l-右移一個光標
z-下移一個光標
k-上移一個光標
$-光標移至行尾
O-光標移至行尾
H-頁的首部
M-頁的中間
L-頁的尾部
ctrl+b 向上翻頁
ctrl+f 向下翻頁
shift+9 最前端
shift+0 最尾端
gg--光標定義到第一行
G--將光標定義到末行
nG--將光標定位到第n行
2.刪除指令
x--刪除字符
nx--刪除n個字符
dw--刪除一個單詞
ndw--刪除n個單詞
dG--刪除到文件尾部
D--刪除到行尾
3.複製和粘貼
yy--複製一行
nyy--複製n行
nyw--複製n個單詞linux
p--粘貼
4.剪切
dd--剪切一行
ndd--剪切n行
2.末行模式命令
1.光標定位
set nu--設置行號
set nonu--取消行號
:行號--將光標定位在制定的行中
2.刪除文件內容指令
: n1 n2d 表示將文件從n1行刪除到n2行
3.保存和退出
: q--退出
: w--寫入文件
: wq! --保存強制退出
4.file--查看文件的類型
5. cat--在終端上顯示文件的內容
-n 添加行號
-b 添加行號 空白行不添加
6.head、tail顯示文件的頭幾行或者末尾幾行內容
-n 選項表示顯示的行數
如不添加該選項則默認顯示10行內容
7.more--分頁顯示文件的內容
-n--每頁顯示的文件行數
+n--從第幾行開始顯示
8.wc--用來統計文件的內容(行數 字數 字節數)
-c--只顯示字節數
-w--只顯示字數
-l--只顯示行數
9.find--用來查找符合條件的文件;
find 目錄名 查找的方式 文件的內容
查找方式
-name 以文件名的方式進行查找
-user 以用戶名的方式進行查找
-group 以組用戶名的方式進行查找
-size 以大小方式進行查找
可使用"=/-/+"表示文件的大小是大於小於等於該字節數
-type 以類型的方式進行查找
-b 塊設備
-c 字符鏈接
-f 普通文件
-l 符號鏈接
-p 表示管道
-d 表示目錄sql
vim ./.vimrc ------設置行號(set nu)
-----------------------day ------------------------------------------------shell
1. who --查看當前系統中的全部登錄用戶
who am i --查看登陸用戶
whoami --查看當前有效用戶
2. su--表示切換某個用戶
使用方法 su- 用戶
sudo 使用管理員身份執行命令
3.useradd--添加一個用戶
經常使用的選項:
-s 設置登陸shell
-u 表示設置用戶ID
-c 添加註釋信息
-d 設置主目錄
4.usermod --修改用戶的屬性
選項與useradd相同
5.passwd--設置用戶密碼(除超級用戶外,只能設置本身的密碼)
passwd 選項 用戶名
可以使用的選項:
-l 鎖定口令
-u 口令解鎖
-d 使帳戶號無口令
-f 強迫用戶下次登陸時修改口令
強制密碼過時
1.userod -L 用戶名 鎖定用戶
2.chage -d 0 用戶名 設置密碼過時
3.usermod -U 用戶名 解除鎖定
6.userdel--表示刪除用戶的主目錄
7.chown--修改用戶的屬主
-R 表示遞歸
8.chgrp--修改用戶屬組
-R 表示遞歸
9.進程管理
1.程序和進程
1.程序--一段能夠存放的代碼
2.程序運行的過程就是進程
3.進程和程序不是一一對應的
2.進程的分類
1.交互進程
2.批處理進程
3.守護進程
3.進程的屬性(pcb)
1.PID--進程的ID
2.PPID
3.UID GID
4.進程的狀態:就緒,運行,殭屍,睡眠
5.佔用必定的資源
6.優先級
4.init進程是全部進程的父進程,PID恆爲1
5.在shell下敲擊一個命令,在命令後面敲擊"&"表示進程後臺運行
6.jobs表示將當前shell下的全部運行的進程顯示出來
7.fg 標號--表示將後臺該標號的進程調入前臺
8.ctrl+z 表示將前臺的進程放入後臺,而且暫停
9.bg 將後臺暫停的程序改成運行態
10.ps 將系統中全部的進程顯示出來
-a 表示全部用戶的進程
-u 顯示用戶的名稱和啓動時間
-x 沒有終端的進程
-l 以長格式顯示
-e 全部的進程
11. ps-aux
ps-le
12.pstree-以樹狀結構顯示進程
13.pgrep--表示查看服務進程的ID
14.kill ID 殺死進程編程
《
cat /etc/passwd 查看全部用戶信息
groups 查看用戶所屬組
finger 查看用戶信息ubuntu
一、setfacl -R -m u:oracle:rwx /home/cdy 給目錄加權限(用戶存在 不能切換)
vim
-----------------------------------day 01--------------------------------數組
軟件包的管理
1.常見的包:RPM,YUM;
2.tar包的管理:
1.tar包中主要是源碼;
2.tar包的建立:
tar -cvf 壓縮包.tar 文件鏈表;
-c 表示建立;
-v 表示顯示詳細過程;
-f 顯示制定文件名;
-t 表示顯示tar包的內容;bash
tar -xvf 包.tar --減壓一個包
tar -czvf 壓縮包.tar.gz 文件鏈表;
tar -zjvf 壓縮包.tar.bz2 減壓縮目錄
tar -zxvf tar.gz 文件鏈表
3.gzip /gunzip --壓包命令
-v 表示壓包
-l 查看包中內容
系統的啓動流程
1.硬件的加電自檢
1.硬件時間的設置:hwclock --set --data mm/dd/yy/hh/mm/ss
2.主引導記錄:
1.446b--主引導記錄
2.4*16b--分區信息
3.2b--跳轉指令 將CPU的控制權交給操做系統
2.bootloader
1.是運行操做系統前的一小段代碼,一般使用匯編語言來編寫
主要是對相關硬件進行初始化(時鐘,內存),將內核代碼複製到內存中
2.跳轉到內存中內核對應的代碼處執行
3.經常使用的配置文件/etc/grub.conf==>/boot/grub/grub.conf
1.default -->加載的內核
2.timeout -->等待用戶輸入的時間
3.initrd,root等
3.載入內核
名稱:主板本+次版本+末版本號
4.啓動init進程
1.init進程是全部進程的父進程
2.它是加載內核後啓動的第一個進程:PID=1;
3.PID=0 表示內核調度器,主要在分配時間片
4.與init相關的配置文件(設置相關的啓動服務)
5.讀取相關的配置文件
1..etc/inittab/--init進程的配置文件
1.initdefault:
0--halt 關機
1--signal 單用戶模式
2--Multiuser 多用戶模式
3--FULL Multiuser完整的多用戶模式
4--nousing
5--X11(x window)圖形界面
6--reboot 重啓
2.在各類模式下都要啓動的進程
si::sysinit:/etc/rc.d/rc.sysinit
id:run_level:action:process
id:爲兩位的標識符
run-level:啓動的級別
action:在該級別下運行的文件或腳本
action--sysinit 在系統啓動時執行;
3.etc/rc.d/init.d--存放啓動服務
4.etc/rc.d/rc[0123456].d--表示對應模式下啓動的服務
常見到的服務長以K和S開頭,表示不啓動和啓動
5.經常使用的命令:
chkconfig --查看設置某個級別下某個服務
ntsysv--圖形界面下的設置服務
網絡設置:
網路模型:
OSI(iso):應用層,表示層,會話層,運輸層,網絡層,鏈路層,物理層
TCP/IP:應用層 傳輸層 網際層 網絡接口層
ip地址
A類:0 + 7位的網絡號+24位的主機號
0.0.0.0~127.255.255.255
B類:10+14位的網絡號+16位的主機號
128.0.0.0~191.255.255.255
C類 110+21位網絡號+8位主機號
192.0.0.0~223.255.255.255
D類:1110 +28網絡號
224.0.0.0`239.255.255.255
E類:保留
------------------------------------- C -----------------------------------
第二階段:c語言基礎
1.在產生Unix操做系統(彙編語言)以後,在第二年的時候由貝爾實驗室產生了c語言;
2.兩個標準:
0.K&R;
1.c89 -- 在1989年的時候,美國國家標準委員會經過的一個標準;
2.c99 -- 在1999年的時候,美國國家標準委員會經過的一個標準;
3.c語言中註釋的方式:
1./*......*/ --段註釋
2.// --行註釋
3.#if 0..... #endif --宏定義註釋
4.#include --表示引入一個頭文件
1.頭文件的做用,對函數作申明和定義;
2.若是引入系統頭文件使用"<>"和" "" ";
3.若是引入自定義頭文件使用" "" ";
5.gcc -- GUN計劃下的一個免費的c語言編譯器;
常見的選項:
-o 表示重命名;
-E 表示預處理;
-c 編譯過程
-S 彙編過程
-I 添加一個頭文件的搜索路徑;
-L 添加一個庫的搜索路徑
-l 添加一個庫
-Wall 儘量指出警告
-std=c99 使用c99標準
-O0~3-- 程序優化
6.編譯的過程:
源文件 --〉預處理--〉編譯-->彙編--〉連接--〉可執行文件
7.文件的後綴名:
.c 源文件
.i 預處理以後的源文件
.s/S 彙編語言程序
.o 目錄文件(二進制文件)
.so 共享庫
.a 靜態庫
8.經常使用到的運算符:
算數運算符: + - * / %
賦值運算符: =
邏輯運算符:〉 〈 〉= 〈= != == && ||
位運算符: 《 》 & | ^
三目運算符: ?:
逗號運算符: ,
9.標識符:
1.申請的標識法大小不能超過32字節;
2.標識符只能以字母、下劃線、數字構成,同時數字不能做爲標識符的開頭;
3.常使用的標識符規則爲駝峯式(get)和下劃線()的方式;
10.常量的定義:
1.#define分爲兩種
1.普通的定義宏
2.行數的宏定義
2.在使用define時,每每使用大寫表示常量
3.define的本質是在程序預處理的時候將定義的宏替換
11.在C語言中的八進制和十六進制
012---八進制
0x12---十六進制
12.變量
變量必須隨時先定義後使用
經常使用的轉義字符
\t---水平指標(8個空格)
\v---垂直製表
\n---回車
\r---換行
\b---推格
13.經常使用的輸入輸出函數
1.putchar---輸出一個字符
函數原型 int putchar(int c)
函數參數 c 表示一個整數
函數返回 成功:一個無符號字符(ANSI)
失敗:EOF
2.printf 輸出的格式
%d 十進制
%u 輸出無符號整數
%c 字符類型數據
%f 浮點類型
%lf 雙精度類型
%s 字符串類型
%x 十六進制
%p 輸出地址
%o 八進制格式
3.格式:%m.nf
- 左對齊
m 數據的寬度
n 實數的有效位數
4.類型轉換:
1.隱式類型轉換
int i = 3+5-2.7;
2.強制類型轉換:
(type)+ 類型或者表達式;
5.& -- 表示對一個變量取地址
6.* -- 表示對一個地址取值;
7.if語句:
格式: if(表達式) 語句;
表達式: 計算表達式獲得一個邏輯運算值爲真,執行語句;
不然跳過執行下一條語句;
語句: 只能是一條語句,若是須要多條,要構形成一個複合語句;
8.不管是什麼結構(循環、選擇等)以後只能加一條語句;
if(條件)
一條語句(複合語句)
else
一條語句
9.在條件語句中else會就近結合if
10.對for語句而言:
for(循環因子的初始化;循環因子的退出條件;循環因子的變化規律;)
語句
數組:
1.基本概念:同種類型數據的集合;
2.數組名稱表示數組集合的名稱;
數組名是一個指針常量 表示下一維空間的首地址;
3.一維數組:(定義,初始化,賦值和使用,特殊用法)
定義: 數據類型 數據名[ 常量表達式 ];
1.數組如下表爲0 的元素開始;
2.數組名稱爲申請的連續空間的首地址;
引用: a[下標表達式];
---注意邊界問題:因爲編譯器不會檢測數組是否越界,因此可能修改其餘變量的狀況;
3.類型修飾符:
auto:
const:
static:
register:
4.初始化方式:
1.初始化的個數小於申請數組大小的維數;-- int a[3]={1,2,3,4}
2.能夠初始化部分; int a[3]={[1]=3};
3.能夠省略維數; int a[] ={1,1,2};
4.常見的初始化方式:
int a[ ]={1,2,3,4,5,6,7};
5.初始化的個數小於數組的維數,那麼其餘元素賦值爲0;
int a[100]={0};
5.sizeof() --運算符: ---sizeof(int)
1.變量 -- 計算該變量佔用的空間
2.數據類型 -- 計算數據類型申請的空間
6.rand ( );
1.設置隨機種子srand ( );
2.產生隨機數: ([n]~[m]) (1~100)
(int)((rand()/(1.0 + RAND_MAX))*(m-n+1)+n)
---不要把隨機種子和隨機數放一個循環裏(循環不超過1s,產生相同的數)、
一維字符數組:
1.字符串常量的表示: "abcd"
2.字符串組成: 首地址+ 空間+ 字符串的結尾
3.字符串的存儲: 字符數組。
4.字符串的輸入輸出:
類型 (%s )+地址(數組名、指針)
強調:地址中數組應爲一個字符數組,指針是一個字符指針
5.在使用scanf輸入字符串時:遇到 空格 tab 回車,表示字符串結束
6.stdin 標準輸入 (鍵盤)
stdout 標準輸出(顯示器)
stderr 標準錯誤 (顯示器)
7.輸入輸出字符串:
gets/ puts
8.字符串操做函數: #include〈string.h>
strcpy -- 字符串的複製
strlen -- 求字符串的長度 (不包含'\0')
strcat -- 鏈接字符串
sprintf -- 同上
strncpy -- 表示複製原字符串前n個字符
strcmp -- 字符串的比較
函數:
1.分類:
1.按照用戶分類:庫函數和自定義函數
2.按照參數分類:有參函數和無參函數
2.函數的使用:
1.函數的定義
[類型修飾符] 返回值類型 函數名稱 ( 形參列表)
{
函數體;
}
1.函數的返回類型:
若是不定義函數返回,默認返回整數;
函數的返回只能有一值;
若是沒有返回,那麼加void 表示無返回值;
函數返回若是是一個指針或地址,那麼該地址對應的空間不能是普通的局部變量;
2.函數名: 表示該函數的入口點
3.形參列表:形參的類型 + 形參變量--(不可省略,調用可省);
各形參之間使用逗號隔開。
4.函數體: 表示函數的實現;
若是須要返回 ,return + 返回值; 若不須要,什麼都不寫 -- return ;
2.函數的聲明: 聲明必須放在調用以前。
做用:告訴編譯器調用該函數返回的使用的參數個數和類型 以及函數返回的類
型,爲編譯器提供語法判斷的依據;
兩種形式:
定義以下:
int abc(int a,int b,char c)
{
//函數體;
}
聲明:
1.int abc(int a,int b,char c)
2.int abc(int ,int ,char)
3.函數的調用
對函數的使用
函數名 (實參列表)
返回值接收 = 函數名 (實參列表)
變量的生存空間和做用範圍:
1.做用域
1.局部變量:
1.在定義的函數或者複合語句有效;
2.程序開始運行時不分配空間,在定義該變量時分配空間。
2.全局變量:
1.做用範圍爲開始定義處,到文件尾部;
2.程序在運行時分配空間,在程序運行結束時釋放空間;
3.全局變量的優先級小於局部變量。
2.生存週期:(局部變量)
1.動態存儲:(auto)
2.靜態存儲:(static):至關於全局變量;
3.extern:表示外部的
若是用來修飾全局變量:表示拓展變量的做用域;
file1:
int a;
file2:
extern int a;
4.static:
1.用來修飾變量:
1.局部變量:至關於全局變量;
2.全局變量:表示該變量不能被其餘文件使用;該變量只能 在本文件中使用;
2.修飾函數:表示函數只能在本文件中使用;
static int abc (int a)
{
}
5.const:表示常量 ;
指針:
1.定義:指針是一種數據類型,是變量在內存中所對應單元的地址;
2.內存是以字節的形式進行劃分,每個字節都有一個地址;
3.指針變量:它是一個存放其餘類型數據地址的變量:
1.基本數據類型:float *p 等價於 float (*p);
2.數組指針變量: int (*p)[5]; ------------ 佔4個字節
3.指向指針的指針變量:int **p;
4.指針的數組: char *a[5]; ----------20個字節
5.函數指針: int (*p)(int *,int) = swap; ----- 函數入口點的指針;
swap(&a,&b); //p(&a,&b); ---- 每每使用在函數的傳參中;
6.內存空間訪問的方式:
1.直接訪問:使用變量的名稱直接訪問或者修改變量;
2.間接訪問;經過該變量空間的指針訪問或者修改變量。
7.每種指針應該指向同一類型的數據的地址;
4.運算符:
1.取值運算符 &:表示對某一變量進行取地址;
2. *:表示對某個地址進行取值;(char * -- 表示指針的一個標識);
3.
5.int *a; int* a; int * a;
6.野指針:申請普通局部變量指針,但沒有作任何初始化;
7.指針的算術運算:
對於指針而言,作算術運算的本質是地址的偏移;加法向後偏移,減法向前偏移。
例:char *p; (p+1)表示指針向後偏移一個char類型數據個字節;
指針的偏移的是數據類型,而不是字節;(編譯器決定的)
8.const:
修飾通常變量:const放於修飾類型符的前、後做用相同。
const int a = 5;
int const a = 5;
修飾指針時:
const int *a = &b; const 修飾a指向的對象;
int const *a= &b; const 修飾a指向的對象;
int *const a= &b; const 修飾a;
const int *const a= &b; const 修飾a和a指向的對象;
const 修飾函
void swap(const int *a,const int *b)-----*a,*b不會被改變。
9.指針和字符串:
char *p = "abcdeg";
strlen(p); ----字符串長度
sizeof(p); ----指針所佔用的字節空間
strlen sizeof( )
10.malloc函數組:
表示用戶自定義空間,可是用戶有申請空間的權利,那麼必須存在釋放空間的
函數;用戶申請的空間在堆中
void *malloc(size_t,size)
函數說明:從內存中申請一片內容
函數參數:
size --預申請的空間大小
函數返回:成功返回空間首地址;
失敗返回 NULL;
void free (void *ptr) ;
函數說明: 釋放申請的空間;
做業:P200 二、 三、
int (*a) [5]; -----4個字節
int *a[5]; ------20個字節
int (*a)add(int ,int)
const int a = 5;
int b = 3;
const int *c = &b;
{
*c = 15; ----錯
b = 15; ----正確
}
malloc/calloc/realloc --> free( )
文件函數:
(stdin,stdout,stderr ---> 文件指針)
errno
perror
fprintf
*1.fopen(打開文件)
FILE *fopen(const char *path,const char *mode);
函數說明:打開流式操做;
函數參數:
path:欲打開文件路徑
(路徑pathname、文件名filename)
mode: 表示文件的打開權限
r:表示只讀,而且文件指向文件的開頭部分;
r+:表示讀寫,文件指向文件的開頭部分;
w:表示只寫,若是文件不存在則建立,而且文件指向文件的開頭部分;
w+: 表示讀寫,若是文件不存在則建立,文件指向文件的開頭部分;
a:表示寫追加
a+:表示讀寫追加
函數返回:
成功:返回FILE類型的指針;
失敗: NULL set the errno
*2.fclose(關閉文件)
int fclose(FILE *fp);
表示關閉一個文件;
3.fgetc/fgets (從打開的文件中獲取一個字符/字符串)
4.getc/gets
5.fputc/fputs(寫入文件一個字符/字符串)
*6.fread
size_t fread (void *ptr,size_t size,size_t nmemb,FILE *fp)
*7.fwrite
size_t fwrite (void *ptr,size_t size,size_t nmemb,FILE *fp)
8.fflush
*9.fseek
——————————————————————— 高 編 ———————————————————
#if
#else
#ifdef
#idndef
#endif
2.c
step 1. type code
2. gcc 2.c
3. close line3
4. gcc 2.c
5. gcc -D DEBUG 2.c (看結果)
宏定義、
服務器與客戶端:
ftpc.c
設置端口號 ifconfig eth0 192.168.12.62
查看端口號 ifconfig
sudo vim /etc/services
myftp 6666/tcp 綁定端口號,使用tcp協議
信號:進程間通訊機制
爲何進程間要進行通訊?
進程間沒有任何聯繫
進程間通訊方式有幾種?
1.信號
2.無名管道
3.有名管道
4.消息隊列
5.共享內存
6.信號量
7.套接字
進程間通訊原理?
1.信號
進程間通訊原理?
pid
怎麼查看進程id號?
ps -l | grep a.out
(ps -l 查看當前終端進程
ps l 查看全部終端進程)
怎麼經過命令發送信號?
kill 信號編號 pid
咱們可以發送什麼信號?
kill -l 列出全部的信號
man 7 signal信號的屬性
CTRL+C的本質是:
kill -2 pid(只能結束當前終端的前臺進程)
信號是異步事件:
在任什麼時候候均可能發生的事件
軟件中斷: 模式和硬件中斷相同
信號都有默認方式,是否能夠修改默認方式?
默認方式: 中斷、中止和忽略
能夠修改默認方式
怎麼修改默認方式?
signal函數能夠修改默認方式
typedef關鍵字的使用技巧:
只要會定義變量,就會使用typedef
int t_32:分配了4個字節,咱們能夠往t_32中存數據
typedef int t_32; 不分配空間(只是給編譯器看的),只是從新定義了int這個數據類型,也就是說在程序中t_32和int沒有區別
char *cp:分配了4個字節,咱們能夠往cp中存數據的地址
typedef char *cp;
void (*fp)(int);分配了4個字節,咱們能夠往fp中存函數的地址
typedef void (*fp)(int);
命令行能夠發信號,怎麼編程序實現發命令?
kill函數
(只要在命令行裏能夠實現的功能,大多能夠經過函數實現)
2.無名管道進程間通訊方式:
原理: 子進程繼承父進程的文件描述符(在硬盤裏)
管道就是一個特殊的文件,既然是特殊的文件,咱們的讀寫方式應該是固定的,
咱們用read和write進行讀和寫,不能使用fread或fwrite,也不能用lseek和fseek
當寫滿時會阻塞,等待讀;
當讀空時也會阻塞,等待寫。
當關閉寫端,只有讀端,這時讀管道會出現兩種狀況:
1.當管道中有數據時,讀取數據
2.當讀完數據時會直接返回,不會阻塞
當關閉讀端,只有寫端,這時寫管道會收到SIGPIPE
做業:
利用無名管道實現cp命令(子進程寫新文件,父進程讀要複製的文件)
cp res,dest----> a.out res,dest
vim:
vsp路徑 垂直分屏
sp 路徑 水平分屏
多屏之間切換:ctrl+ww
shift+v 激活行選擇,而後按上下鍵選擇多行,而後按下y複製
縮進:選中, 2 shift+ 〉 後縮2次
shift+ 〈 前縮
ctrl+v 激活局部選擇
ctrl+i 恢復
u 返回上一層
3.有名管道進程間通訊方式:
原理:文件系統可見,意味着ls能夠看見,但大小始終爲0,由於寫到管道中的數據
都在內存中,內存中的東西文件系統不可見
建立有名管道有兩種方式:
命令mkfifo(需建立fifo)和函數mkfifo(#include<sys/stat.h>),不需fifo
既然文件系統可見,那麼全部進程均可以打開open這個管道文件,往管道寫write數據,
讀read數據
strlen和sizeof區別:
strlen:是函數,計算字符串長度,不包括\0, \0自己是結尾標示符
sizeof:是運算符,計算數據類型的長度,基本數據類型和構造數據類型
sizeof(int)--〉4
int a[10],sizeof(a)--> 40
做業:
利用有名管道實現複製文件,一個進程進行寫新文件,一個讀要複製的文件
fifow dict.txt
fifor dictbackup
diff dict.txt dictbackup
(兩個main函數)
寫管道:mkfifo fifo(一個管道就能夠了)
diff fifo.c 123 (看fifo.c 和 123 是否同樣,同樣什麼都不顯示)
4.system v(一種標準) 進程間通訊方式:
共享內存、消息隊列和信號燈
原理都同樣
原理看圖:圖system v ipc,圖share memory
(1)共享內存實現步驟:ftok獲得key-->shmget用key獲得sid-->shmat內核到用戶的地址映射--shmdt刪除內核到用戶的地址映射--〉shmctl刪除共享內存
ipcs 查看全部system v ipc
ipcs -m 查看貢獻內存
ipcs -s 查看信號量
ipcs -q 查看消息隊列
ipcrm -m sid 刪除共享內存
IPC_CREAT|IPC_EXCL 這兩個組合,當相同的共享內存已經存在時,會報錯EEXIST
vim7.3安裝和vim7.3配置(root下)
安裝:
tar -xvf vim-7.3.tar.bz2
cd vim73
cd src
./configure
make
make install
關閉終端從新打開
配置:(root權限下,當前目錄)
cd ~
tar -xvf vim.tar
(2)兩個信號同時發生,可能有一個被忽略掉
信號量進程間通訊方式,兩種:
兩種:一種是2值信號量,一種是計數信號量
當申請資源時,本質就是-1
當釋放資源時,本質就是+1
0和非0兩種狀況,0是沒有資源,非0有資源。
vim:
shift+8 n和N 全選中
:%s/old/new/g 替換
(3)消息隊列進程間通訊方式
是經過數據結構中的鏈式隊實現的
每一個消息必須有本身的類型(相似於QQ號碼)
消息的長度是不固定的
消息的前4個字節必須是類型
若是是本身的消息,經過後4個字節來知道消息的長度,而後讀固定長度的數據
每一個進程均可以往隊列中添加固定類型固定長度的消息
管道本質:循環數據隊
信號:異步事件(軟中斷,操做系統級別的)
信號量: 同步事件
(posix標準)
*同步共享內存 程序(重點)
共享內存:相似於malloc(一個進程定義的一個進程使用),共享內存可多進程使用,都是經過返回void類型的首地址。
多進程協調中,共享內存很重要
線程和進程:
一個進程最少有一個線程
在進程中建立線程
一個進程能夠建立多個線程,多個線程都具備同一個pid屬性,具備不一樣的LWP屬性
資源角度:一個進程建立的全部的線程都共享進程的資源,進程之間資源收獨立的
線程關聯角度:一個進程建立的全部的線程中任一線程出現段錯誤(去了不應去的內存空間),那麼其餘線程一塊兒中斷
cpu利用角度:進程和線程沒有區別,都參與調度(兩個while(1)能夠「同時」運行)
查看LWP命令:ps -aL
操做 建立 關閉 等待
進程 fork exit wait
線程 pthread_create pthread_cancel pthread_join
pthread_create函數不包含在libc庫中,因此在gcc編譯時須要加-lpthread,來講明程序中使用了線程相關的函數
線程能夠很方便的實現線程間通訊,只要是全局變量就能夠實現線程間通訊。
多個線程訪問同一塊空間,會遇到同步問題,解決同步問題使用posix信號量(計數信號量)
vim
shift+g 跳轉到當前文件的最後一行
gg 跳轉到當前文件的第一行
做業:
server.c中爲何要加close(listenfd)和close(acceptfd)?
他們的位置能不能隨意改變?
測試tcp的三次握手和三次揮手?
瞭解序號和應答號的原理和做用?
瞭解tcp頭中flags中syn和ack的意義?
總結tcp和udp的基本區別?
vim /etc/services #myftp 6666 tcp 設置服務器端口號
vim ftp.conf 設置文件目錄(get service 顯示的)
ifconfig 查看虛擬機iP
ifconfig eth0 192.168.12.62 設置虛擬機ip
SQL:(gcc -lsqlite3)
sqlite3 my.db
.ta 查看table
.sc
create table student(number integer,name text,score real) 建立
insert into student values(1,'niuniu',90.5); 插入
select * from student; 查看
select * from student where number > 2 ; where條件查詢
select * from student order by score; 升序
select * from student order by score desc; 降序排序
select * from student where score > 60 order by score desc limit 2;
drop table haha(table名); 刪除table
alter table student add column sex text; 給table添加sex選項
update student set sex='man' where name='niuniu'; update更新屬性
update student set sex='man' where number=1;
delete from student where name='liu'; 刪除liu
create table student(number integer primary key,name text,score real); 主鍵
.q 退出
locate sqlite3.so 查看庫
第二階段項目:電子相冊
Framebuffer
像素: 1024(寬) * 768(高) * 32位
ubuntu 10.04 CTRL+alt+F1 退出圖形界面 CTRL+alt+f7 進入圖像界面
解壓字體庫:
tar -xvf freetype-2.3.11.tar.bz2
cd freetype-2.3.11/
./configure --prefix=/home/lh/Desktop/drivers/Shome/v4l2/名字(必須是絕對路徑) --host=arm-linux(要解壓的版本)
make
make install
--------------------------------------------- ARM ---------------------------------------
爲何學習arm?
嵌入式是能夠裁剪、低功耗、低成本的專用計算機系統
cpu(中央處理器)、mcu(cpu+控制器)和單片機(cpu+控制器+存儲器)
s3c2440是mcu,內部沒有存儲器,須要外接
存儲器有flash(掉電不丟失,是基於陣列的 --〉U盤)、硬盤(掉電不丟失,是基於機械的 --〉移動硬盤,光盤)和內存(掉電丟失,是基於陣列的)
flash和硬盤用於存儲程序(能夠執行,可是特別慢,虛擬內存),內存是最大的緩衝區 --〉用於執行程序(速度快)
一級緩衝、二級緩衝 --〉 內核
arm是一種cpu,cpu是一種大腦,學習arm就是在學習怎麼使用這個大腦
arm是arm公司設計的,但arm公司不生產實體的芯片,它會把arm的設計受權給不一樣的公司,不如三星,三星再根據本身對市場需求的判斷在arm的基礎上添加控制器
控制器是對各類設備控制程序的最優硬件化
若是沒有控制器,咱們也能夠控制設備,但控制流程會變得很複雜,使得開發成本增長,這個成本包括人力和財力
控制器不是生物的,他也須要相關的程序進行配置,可是僅限於配置
使用寄存器配置控制器
寄存器是總線寬度(arm9是32位總線寬度)的存儲器,以位爲控制標誌
怎麼學習arm?
看說明書
學習arm的難點?
寄存器的理解和對設備自己的理解
怎麼和開發板進行互動?
開發板經過com0能夠和pc進行雙向通訊
com0是9針串口,發現如今的pc都沒有這個接口,但咱們有USB,因此用串口轉USB進行雙向通訊
首先鏈接開發板與pc
激活虛擬機的狀況下插入USB線
虛擬機識別USB線的查看方式是lsusb
ubuntu查看USB線的驅動用lsmod 如有ch340,則證實驅動存在並可用
USB線驅動存在而且已經運行後,確定會建立相應的設備文件,設備文件在/dev下,文件名是ttyUSBn
有了設備文件之後,相關的軟件就能夠打開設備文件進行通訊
kermit這個軟件能夠實現這種功能
安裝配置kermit
sudo dpkg -l | grep kermit,若是什麼也沒有打印證實沒有安裝
sudo dpkg -i ckermit.deb
安裝過程當中會提示須要先安裝另外一個包:libsocks.deb,安裝失敗
sudo dpkg -i libsocks.deb
上面的安裝成功之後再從新安裝ckermit.deb
sudo dpkg -i ckermit.deb
kermit 這個軟件須要一個配置文件kermitrc.tar,來設置一些相關屬性
把kermrc.tar 解檔到用戶根目錄 (root:/root sram:/home/sram/),用戶根目錄下會多餘一個文件.kermrc
kermit -c, 若是開發板沒有通電,他會阻塞,這時打開開發板電源,若能看到不是亂碼的信息,那麼kermit就可使用了
vi ./.bashrc 下添加 PATH=$PATH:~/Desktop....
source ./.bashrc
怎樣點亮LED?
一個Led有2種狀態,亮和滅
控制器GPIO(通用目的輸入輸出)控制器能夠實現控制led
用寄存器配置GPIO控制器
只要是寄存器確定是32位,那麼一個led的亮滅須要1位控制
須要知道mcu的哪一個端口在控制led,因此須要看原理圖
怎麼使用GPIO控制器?
一共130個GPIO,因爲一個寄存器只有32位,不能控制130個GPIO,因此分爲9組,每組都有獨立的寄存器進行相應的配置
因爲應用的複雜性,端口數過少,因此須要每一個端口具備多種功能,那麼咱們能夠獲得一個結論:當咱們編程序時,首先應該選擇端口的功能
編寫的程序怎麼變成arm上能夠運行的機器代碼?
不一樣的硬件須要不一樣的編譯器
gcc編譯的程序只能用於AMD/因特爾
那麼對於arm來講須要專用的編譯器,arm-linux-gcc
在光盤中找arm編譯器
tar -xvf arm-none-linux-guneabi.tar
把arm-none-linux-guneabi/bin 這個路徑加到PATH
打開 .bashrc ,添加PATH=$PATH:/home/niulibin/toolchain/bin/
寄存器配置要點?
當你要修改某1四、15位時,千萬不要修改了其餘位
經過位運算 &與 |或 ~非來實現
做業: 編寫Led程序,而且可以編譯經過
CPATH和VPATH的做用
怎麼讓led.bin在開發板上運行?
s3c2440上電啓動時,會主動的去norflash 或 nandflash中去取4k字節到內存中,而後運行,這時s3c2440啓動任務已經完成,而後交給運行的4k程序
經過開發部上的S2來決定去哪裏取
4k程序已經燒寫到flash中了
{
在nor flash下,下載uboot.bin引導程序到nand flash
kermit -c
3-->2-->1s
enter
loadb 30008000 ....
}
loadb 30008000,給開發板發命令,要經過串口給開發板發數據,開發板要把這些數據存到30008000開頭的內存中
ctrl+\而後按c,進入kermit命令行界面,然send led.bin,經過串口發送led.bin這個arm程序到開發板30008000開頭的內存中 ( .kermrc)
而後按c回到和引導程序的交互中,go 30008000
led 只有輸出---〉0x55(5爲4位,0101)
任務: 實現puts 和 gets、
ADC?
數字信號:隨着時間的變化,電壓不是連續變化的信號就是數字信號
模擬信號:隨着時間的變化,電壓連續變化的信號就是模擬信號
現實世界中都是模擬信號,但咱們的智能系統是數字信號,因此要處理現實中的模擬信號
RTC?
順序不對應是由於說明書中寄存器的地址不是連續的
中斷:
做業?
經過kermit給開發板發命令
ledon n (strtok)
ledoff n
adc
adc set 2500
電壓大於2.5V,led1閃; 小於2.5V,led1滅
RTC
RTC set 2014.8.8 20:20:20 (返回時間)
爲何裸機編程中能用靜態庫,但不能用動態庫?
靜態庫是在編譯階段,把相關的函數機器代碼都編譯進入可執行文件,因此不須要相關庫的依賴,能夠直接運行,行話叫可移植性強,能夠用於裸機編程也能夠用於操做系統編程
動態庫是在編譯階段,沒有把相關的函數機器代碼編譯進入可執行文件,因此須要相關庫的依賴,不能夠直接運行,行話叫可移植性強,能夠用於操做系統編程
做業(iic)?
保存結構體到AT24C08
保存1024個數據到AT24C08
中斷?
串口中斷中發送與接受爲一箇中斷(INT_TXD0、INT_RXD0)
什麼存儲器能夠直接運行程序? nor flash ( nand flash 只能存程序)
友善之臂 在nor flash中,燒寫了一段4k的程序,可用來向內存(SDRAM)中下載程序
若是nor flash和nand flash中都沒有程序,可用 JTAG
lh--〉 .kermrc 設置波特率 9600
12M/9600/16-1 = 4D
-L map.lds /* 註釋 */
全局變量不能使用,致使strtok不能使用?
經過連接腳本能夠解決
程序的組織形式:
棧段 局部變量 (高)
代碼段(text) if else
常量段(rodata) "niulibing"
初始化數據段(data) 全局變量 int a=1 局部靜態變量static int a=1
未初始化數據段(bss)全局變量 int a 局部靜態變量static int a (低)
RTC的實現?
寄存器不連續
啓動過程?
cpu有兩種啓動方式(nand nor),經過配置4個OM端口來決定從哪裏啓動
nand 啓動:
nand沒有地址線,有8位的數據線,經過nand控制器來操做
上面的特性決定了nand不能被cpu地址總線直接操做
(nor flash :4M 2^22/1024/1024)----> 22 = 13根行線 + 9根列線
cpu啓動後會把nand的前4K搬移到cpu內部的4k靜態隨機存儲器(SRAM),這是cpu內部操做與咱們沒有關係
而後從0地址開始執行及其代碼,內部SRAM的首地址是0,正好和上面的性質對應
若是nand中的程序大於4k,那麼nand中的前4k就必須具有把全部的程序從nand搬移到cpu外部同步動態隨機存儲器SDRAM
(虛擬內存:flash)
nor 啓動:
nor有22位地址線,最大支持4M,直接與cpu的地址總線鏈接,能夠被cpu直接訪問,有16位數據線,因此每次能讀2個字節,經過memory控制器來操做
cpu啓動之後經過片選信號nGCS0,能夠直接訪問nor,因此nor中的程序能夠被cpu直接執行
而後從0地址開始執行nor中的機器代碼,nGCS0這個片的大小爲128M,首地址是0,正好和從0地址運行對應
(機器指令確定 32位)
彙編語言: .dis 反彙編
Linux系統實用開發:四、
ARM體系結構與編程:2—4
arm 有37個寄存器
lr 返回值
s3c2440 三、
當即數: #開頭的
64M內存(SDRAM):
4bank * 4M * 16bits/8(2 bytes) * 2片
任務?
三級流水線 (並行執行,取指、譯碼、執行) arm9最多支持5級流水線
b(相對--〉跳轉指令)和bl(帶返回的跳轉指令,保存到LR)指令的理解 2^(24+2)/1024/1024 = 64M (-32M,32M正負跳轉)
ldr(=)指令和ldr僞指令的區別 (ARM中的機器指令:須要翻譯的ARM中的機器指令)
GNU ARM彙編(機器代碼 + 若是條件--〉 .開頭的)和 ARM彙編(機器代碼)的區別 ---〉 Linux系統開發 4.四、
指令的前4個位表明什麼(條件執行)
37個寄存器各是什麼
PC(4字節)是r15,有幾個PC(1個),PC中存的是什麼(下一條指令的地址--〉cpu總線地址)
ea000006
e:無條件執行 a:(1010) 101 0不保存地址到LR(共6個) 6<<2 +8 24爲3個週期 32--〉向下偏移20位
nop: 佔用執行週期,不進行任何操做--〉跳轉到下一個異常
CPSR(1個) SPSR(5個)
指定svc模式棧地址: 才能實現C語言函數調用功能
任務?
滿遞減棧(先減4,後存入棧),可讓咱們知道ldr sp,0x1000的意思
模擬und異常(cpu不支持的指令稱爲und,arm9不支持硬浮點,可用。。。實現)
led的彙編實現
做業:
串口彙編/RTC
做業?
鬧鐘 flasharm/rtc/rtc.c
每到固定時間(一分鐘)響,響30秒,用rtc中斷
在30s響的中間任什麼時候刻,可讓鬧鐘不響,用按鍵中斷(中斷不能夠嵌套中斷--〉定義全局變量)
經過串口z能夠設置當前時間和鬧鐘時間,用串口中斷
主程序只輸出時間
定時器4:12M/(255+1)/16=2929 --〉 1s 0x6000 = 24576 24576/2929爲8s
uboot移植:
文件系統: 組織硬盤
bootloader源碼下載(ftp)--〉第一個 2410型號
2440比2410快---〉更改時鐘配置
tar -xvf
cd u-boot-1.1.65
uname -a
uboot(引導內核)130k,咱們只能移動4k,怎麼辦?
二次搬移 (第一次運行時,須要搬移SRAM--〉SDRAM)
第一次:硬件程序將flash前4k移動到cpu(4k的有效程序,初始化SDRAM)
第二次:uboot把130k搬移到GCS6(片選6)
uboot命令:
loadb(下載到SDRAM) help/? go
led: 下載pc機的程序--〉SDRAM拷貝到nand flash
loadb 30008000
nand erase 0 1000(16進制)--〉 擦除、覆蓋Nand
nand write 30008000 0 1000
任務?
bootloader? 引導下載
你知道幾種bootloader? uboot vv
uboot? 對硬件進行初始化(串口、SDRAM) 用uboot把130k的bootloader移動到nand flash
uboot和咱們本身編寫的arm邏輯程序有什麼區別?
uboot大小? >4k(130k)
uboot運行步驟? 兩次搬移
uboot中須要實現什麼功能?
uboot中實現以太網的目的?
用uboot怎麼實現把咱們本身編寫的邏輯程序拷貝到flash中,拷貝完成之後uboot處於什麼狀態?
---uboot移植---?
smdk 評估版
與體系結構無關:strcpy 在哪都能運行
arm-linux-gcc -v 查看gcc版本
tar -xvf gcc-3.4.5-glibc-2.3.5
echo `pwd` >> ~.bashrc
cd ---> vim .bashrc 添加路徑
source .bashrc
關閉中斷,再打開
vi Makefile 添加mini 2440
cp -rf smdk2410/ smdk2440
cd /include/config cp -rf smdk2410.h smdk2440.h
cd /board/smdk2440 把2410改爲2440
cd /u-boot-1.1.65 make smdk2440_config 配置文件
make
ls u-boot.bin
ctags:
make ctags,必定要在最頂層Makefile處執行,會在頂層目錄生成ctags文件,這個文件中有頂層目錄下全部文件的關聯信息
在~/.vimrc的最後一行添加 set tags=/home/。。。。u-boot-1.1.6/ctags
而後再用vim打開的文件中,就能夠跳轉到相關的文件中,定位相關的變量定義
vim的定位步驟,光標移動到相關變量,而後按CTRL+] 進行跳轉,跳轉是能夠遞歸的,而後按CTRL+o 能夠返回
{
ctags -R *
ls
vim tags
}
u 撤銷
CTRL+V 局部激活 (能夠一列一列的)
做業?
下載u-boot-1.1.6 和 2014-3
環境變量:
setenv niuniu good man 設置
saveenv 保存
printenv 打印
setenv niuniu 刪除(再設置一次)
saveenv
網絡:
setenv ipaddr 192.168.12.222
saveenv
setenv serverip 192.168.12.62
ping 192.168.12.252 (不能夠ping本身)
netstat -u4a ---> udp 0 0 *:tftp *:*(證實服務器存在)
設置服務器目錄
tftpboot 30008000 led.bin
#boot nand erase 0 1000
nand write 30008000(內存) 0(nand flash 0字節處) 1000(字節大小)---〉實用系統開發 七、
dpkg -l | grep tftp 查看是否有服務器
{ ii tftp-hpa 5.0-11ubuntu2.1 HPA's tftp client
ii tftpd-hpa 5.0-11ubuntu2.1 HPA's tftp server }
任務?
uboot環境變量?
是否能夠本身定義環境變量?本身定義的有什麼意義?
uboot環境變量怎麼操做?
ping通本身的ubuntu?
在ubuntu下設置tftp服務器?
netstat -u4a?
/etc/services?
/etc/default/tftpd-hpa?
tftpboot 30008000 led.bin?
爲何tftpboot不用加ip地址?
----內核移植----?
tar -xvf linux-2.6.32.2
cd linux-2.6.32.2
vim Makefile
#183 $ arm
#184
make mini2440_defconfig
make uImage
cd u-boot-1.1.6/
ls cd tools/
sudo cp mkimage /bin/ 產生uImage
(1)啓動內核--〉手動
make uImage
cd linux-2.6.32.2/arch/arm/boot/
ls
cp uImage var/lib/tftpboot/
cp u-boot.bin /tftpboot/
kermit -c
tftpboot 30008000 u-boot.bin 加載u-boot.bin到內存,覆蓋掉niu-u-boot.bin
setenv ipaddr 192.168.12.222
setenv serverip 192.168.12.62
saveenv
----> 覆蓋以前的u-boot.bin
help nand
nand erase 0 100000
nand write 30008000 0 100000
reset 復位
setenv ipaddr 192.168.12.222
setenv serverip 192.168.12.62
saveenv
printenv
tftpboot 30006000 uImage
bootm 30006000
(2)啓動內核--〉自動
bootcmd 修改倒計時3 2 1 ---〉 爲0 :bootdelay 0
setenv bootcmd tftpboot 30006000 uImage\;bootm 30006000
saveenv
printenv
重啓電源,不要按enter(須要網線,拔了網線,就消失了)
(3) 寫到nand flash,拔出網線仍能夠啓動
nand erase clean 所有擦除
tftpboot 30008000 u-boot.bin / 用minitools進行拷貝
nand write.jffs2 30008000 0 100000 (須要.jffs2,遇到壞塊能夠跳過)
setenv addrip
setenv serverip
tftpboot 30008000 uImage
nand write.jffs2 30008000 100000 500000 (從30008000寫到100000,大小爲5M)
setenv bootcmd nand read.jffs2 30006000 100000 500000\;bootm 30006000 (30006000:必須在30008000靠前一點)
uncompres 解壓
作一下 Mini2440 之Linux 移植開發實戰指南 三、
----文件系統移植----?
make distclean 刪除中間文件(變成剛剛下載的樣子)
{ smdk2440 用的是smdk2410 的_defconfig }
先 make mini2440_defconfig (一次)
再
make
make menuconfig (在最上層目錄) 是否保存:Yes 會生成 .config 兩下Esc退出
vim .config
文件系統:硬盤的組織形式
移植根文件系統
/bin(ls) /sys(驅動)---〉/proc + /dev(相應的設備) /etc(配置文件)
內核不能和文件系統起衝突,文件系統不能和 起衝突
內核不須要uboot
內核啓動時,把flash分區
步驟?
cd busybox-1.13.3
make menuconfig
參照參考手冊
vim .config
make
make install
cp /gcc...arm-none/arm-none/bin rootfs/lib (複製目錄cp -a) *so*
arm-linux-readelf /home/lh/Desktop/software/busybox-1.13.3/busybox -a | grep Sh 查看必須的庫
最後生成 rootfs.jfft2 約13M
只有busy-box一個可執行文件,其餘都爲軟連接
ping 192.168.12.62
tftpboot 30008000 uImage
nand write.jffs2 30008000 100000 500000 (從30008000寫到100000,大小爲5M)
setenv bootcmd nand read.jffs2 30006000 100000 500000\;bootm 30006000 (30006000:必須在30008000靠前一點)
[sram=w]# (能夠)
設置主機ip:
從磁盤獲取。。。
------------------驅動編程----------------------
sudo insmod ./globalmem.ko
sudo rmmod globalmem
lsmod | grep global*
cat /dev/glo*
day04?
77.pdf
能讀幾個
要讀幾個
day05?
88.pdf
ioctl 設置屬性
setsockopt 更改緩衝區屬性
echo "abcde" 〉 /dev/globalpipe1 寫
cat /dev/globalpipe1 讀
e 6章02
day06?
e 6章01
整型佔 32位
5種io模型
netstat -nap | grep app 查看有木有服務器
man 2 fcntl
server中: -----〉man ipv4 (red hat)
ipv4.sin_family = AF_INET;
ipv4.sin_addr.s_addr = INADDR_ANY;
ipv4.sin_port = htons(PORT);
day07?
e 6.3
10.pdf
鎖: 自旋鎖 信號量
頂半部 + 底半部 (定時器:定時爲頂半部,10s後響應爲底半部)
keys
day08?
irq_adc.c(內核源碼樹中已有adc中斷,需設置成共享,再判斷中斷是哪一個產生的)
tar -xvf linux-2.6.32.2_usb.tar.gz
cd /linux-2.6.32.2/drivers/char
vim mini2440_adc.c
在
//中斷處理函數 中加:
if(dev_id != &adcdev)
return IRQ_NONE;
cd /linux-2.6.32.2
sudo cp /home/lh/Desktop/software/mkimage /bin/ 產生uImage
make mini2440_defconfig
make uImage
智能家居項目:
AM2302?
起始信號:輸出 低電平 延時至少800us
釋放總線:輸出 高電平/ 輸入
響應信號: 判斷是否低電平(while)--〉低 可能有響應
讀取40位:申請一長度爲5的數組
V4l:
1.打開設備 /dev/video open
2.查看能力(是否有捕獲能力) ioctl(video.fd,,)
vi /usr/include/linux/videodev2.h
v4l2 capability
#245 CAPTURE 捕獲
3.每秒捕獲多少幀
4.捕獲
5.關閉
開始採集 STREAMON STREAMOFF
mmap 內存映射
攝像頭:
cd /mnt/v4l2
cp libjpeg_arm/lib/* /lib/
修改內核:
mini2440-〉images-〉linux-〉 vboot.bin zImage_p35 rootfs_qtopia_qt4.img
cheng
uname -r 2.6.32.2-FriendlyARM
把你從光盤裏拿出的內核解壓後,的文件,linux-2.6.32.2,進入
vi Makefile
改成 當前版本號 2.6.32.2-FriendlyARM(把原來的EXTRAVERSION=.2-FRIENDLYARM)
須要.config文件(若是沒有.config 文件,那麼咱們須要吧一個文件config_mini2440_x35不知道是cp 成.config)
make
modinfo ./led_driver.ko 查看版本信息
顯示:
vermagic: 2.6.32.2-FriendlyARM mod_unload ARMv4 成功
關閉板子led進程:
vi /etc/init.d/rcS/
#leds start service #註釋掉
重啓
結構體 struct homeinfo{ int ledinfo[4],int meiqiinfo,int yanwuinfo} led: Unable to handle kernel NULL pointer dereference at virtual address 00000000 ** 內核中存在空指針 去掉 struct keysdev *keysdev = filp->private_data; 是否缺乏 return keys: CTRL + c 以後不能在執行 ./app 提示lock failed 緣由:上一個lock,沒有up() 在keyscan中加up()解鎖