為了記錄學習驅動過程,自己簡單的做了筆記。某年某月,當自己成為驅動高手的時候,我再回過頭看看自己當時的想法。。。應該這種感覺是妙不可言的
So,come on!Everyday is nice!
關於基礎
1.tar 可以用來備份關鍵資料,而 dd 則可以用來備份整顆 partition 或 整顆 disk
2.vim區塊選擇(Visual Block)的功能
3.set 這個指令除了會將環境變數列出來之外,其它我們的自訂變數,與所有的變數,都會被列出來喔
4.uptime查看開機已耗用時間
5. head 和 tail 命令
用法為:head -n 檔案名稱
6.lsmod rmmod insmod modprobe
7.反組譯碼命令使用
arm-linux-objdump -D -S hello>log
8.wireshark 網路通訊協定分析器
-----------------------------------------------------------------
9.shell 學習
if [ $a1 = $a2 ]
.在[和]符號兩邊的左右都有空格
.=左右都有空格
a1="hello"
echo $a1
.變數賦值兩邊不能有空格
.bash中語句不需要分號
.比較符號:-eq -gt -lt -ne -ge -le -z(為空白) -n(不為空白)
.判斷檔案符號:-e -f -s -d -r -w -x
.if語句
if []
then
#code
else if []
then
#code
else
#code
fi
fi
.for語句
for var in [list]
do
#code
done
.while語句
while []
do
#code
done
.until語句
until []
do
#code
done
.case 語句
case "$var" in
condition1 )
;;
condition2 )
;;
*)
default statments;;
esac
-----------------------------------------------------------------
10.makefile
.$^:代表所有的依賴檔案
.$@:代表目標
.$<:代表第一個依賴檔案
11.時間
time_t t;
t=time(NULL); //目前時間
gettimeofday(&tpstart,NULL); // 開始時間
function();
gettimeofday(&tpend,NULL); // 結束時間
-----------------------------------------------------------------
12.
fork子進程拷貝父進程的資料區段,執行順序不定
vfork:子進程與父進程共用資料區段,子進程先運行
-----------------------------------------------------------------
13.exec函數族
exec啟動一個新程式,替換原有進程,PID不變
-----------------------------------------------------------------
14.進程通訊
.管道通訊
.訊號通訊
.共用記憶體
管道:
.無名管道pipe(int fd[2])
.有名管道mkfifo(const char* filename,mode_t,mode)
15.posix 可移植的作業系統介面
-----------------------------------------------------------------
16.訊息佇列
.返回索引值 key_t ftok(char* pathname,char proj)
.擷取隊列描述字 int msgget(key_t key,int msgflag)
.發送資訊 int msgsnd(int msqid,struct msgbuf* msgp,int msgsz,int msgflg)
.讀取資訊 int msgrcv(int msqid,struct msgbuf* msgp,int msgsz,long msgtyp,int msgflg)
17.訊號量
.二值號誌 0,1
.計數號誌 非負
18.多線程編程
.建立線程
int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,void *(*start_rtn)(void),void *arg)
tidp: 線程id
attr: 線程屬性
start_rtn: 線程執行函數
arg start_rtn:的參數
.等待線程
int pthread_join(pthread_t *tid,void **rval_ptr)
tid:等待退出的線程id
rval_ptr:線程傳回值的指標
.線程標識
pthread_t pthead_self(void)
返回線程id
-----------------------------------------------------------------
19.linux TCP/IP
.應用程式層 傳輸層 網路層 網路介面層
.socket三種類型:流式通訊端(SOCK_STREAM)----可靠的、資料通訊端(SOCK_DGRAM)----不可靠的,原始通訊端(SOCK_RAW).
.struct sockaddr_in記錄網路地址
.地址轉換
int inet_aton(const char *cp,struct in_addr *inp) 轉網路ip
char *inet_ntoa(struct in_addr in) 轉字元
.位元組序
網路傳輸 big endian
htons/htonl 發送時用的、主機序轉換到網路序
ntohs/ntohl 接收時用的、網路序轉換到主機序
.擷取ip或主機名稱
struct hostent *gethostbyname(const char *hostname)
-----------------------------------------------------------------
20.虛擬檔案系統
VFS隱藏各種檔案系統的具體細節,為檔案操作提供統一的介面。
21.核心開發,主要修改driver(驅動)和arch(體系架構)
-----------------------------------------------------------------
22.核心配置與編譯
.清除命令:make clean/make mrproper /make distclean
.確定目標系統軟硬體設定,例如cpu的類型,網卡型號,還有支援的網路通訊協定
.開始配置核心
執行命令:make menuconfig
.編譯
make zImage/make bzImage
*make zImage V=1 擷取編譯資訊
編譯好的核心位於:arch/<cpu>/boot/
.編譯核心模組
make modules
.安裝核心模組
make modules_install
/lib/modules
.製作init ramdisk
mkinitrd initrd-2.6.29 2.6.29
23.核心安裝步驟
. cp arch/x86/boot/bzImage /boot/vmlinuz-$version
. cp $initrd /boot/
. 修改/etc/grub.conf或者/etc/lilo.conf
24.核心模組
主要Makefile:
ifneq ($(KERNELRELEASE),)
obj-m :=hello.o
hello_objs: main.o add.o(多檔案)
else
KDIR:= /lib/modules/2.6.18-53.el5/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c .symvers
endif
模組參數:module_param(name,type,perm)
int a=3;
module_param(a,int,S_IRUGO);
-----------------------------------------------------------------
25.核心符號匯出---兩個模組以上有用
EXPORT_SYMBOL(符號名)
EXPORT_SYMBOL_GPL(符號名)
26.核心列印 /proc/sys/kernel/printk
27.工具鏈arm-linux-gcc
-----------------------------------------------------------------
28.BootLoader工作流程
stage1
.硬體裝置初始化
.為載入BootLoader的stage2準備RAM空間
.拷貝BootLoader的stage2到RAM空間
.設定好堆棧
.跳轉stage2的C進入點
stage2
.初始化本階段要使用的硬體裝置
.將核心和根檔案系統拷貝從flash拷貝到ram
.調用核心
-----------------------------------------------------------------
29.uboot
命令:help/printenv/setenv(添加、刪除、修改)/saveenv\
md/mm/flinfo/protect off(on) all/erase start end/
cp/go/bdinfo(開發板資訊)
移植:MCU/MPU參考
30.嵌入式核心製作
1.清除 make distclean
2.配置 make menuconfig ARCH=arm
3.編譯 make uImage ARCH=arm CROSS_COMPILE=arm-linux-
-----------------------------------------------------------------
31.製作根檔案系統
@建立根檔案系統的目錄
.mkdir rootfs
.cd rootfs
.mkdir bin dev etc lib proc sbin sys usr mnt tmp var
.mkdir usr/bin usr/lib usr/sbin lib/modules
@建立裝置檔案
.cd dev/
.mknod -m 666 console c 5 1
.mknod -m 666 null c 1 3
@安裝/etc
.tar etc.tar.gz -C /xxx/rootfs
@編譯核心模組
.make modules ARCH=arm CROSS_COMPILE=arm-linux-
@安裝核心模組
.make modules_install ARCH=arm
INSTALL_MOD_PATH=/xxx/rootfs
@配置busybox
@編譯安裝
make ARCH=ARM CROSS_COMPILE=arm-linux
make install