【Notes9】Linux系统启动过程,数据库,驱动,i2c-tools,shell
文章目錄
- 1.Linux系統(tǒng)啟動過程:ukr,ubuntu開機引導文件/etc/default/grub
- 2.數(shù)據(jù)庫:存儲過程(PL/SQL代碼集,像沒有返回值的自定義函數(shù))和函數(shù)需要用戶顯示調(diào)用才執(zhí)行,而觸發(fā)器是由一個事件來觸發(fā)運行,當某個事件發(fā)生時會自動地隱式運行,不能被顯示的調(diào)用
- 2.1 數(shù)據(jù)庫優(yōu)化:項目管理PMP證書,數(shù)據(jù)庫DBA/OCM(Oracle Certified Master)證書
- 2.2 數(shù)據(jù)庫備份和恢復:冷熱備份
- 2.3 數(shù)據(jù)庫精度:高精度數(shù)據(jù)用SQL Server數(shù)據(jù)庫
- 2.4 MySQL開發(fā)函數(shù):having,where,group by,max,min,sum,count,case where-end,order by,sort by,distinct
- 2.5 查詢上個月數(shù)據(jù):DATE_SUB(),CURDATE()
- 3.字符設備驅動:編譯做的事:預處理(語法檢查),編譯(.c->.s匯編文件),匯編(.s->.o二進制文件),鏈接(多個.o合并成1個執(zhí)行文件)
- 4.i2c-tools使用:bus號,bus上器件,器件的寄存器,寄存器的offset
- 5.shell:Shell是一個用C語言編寫的程序,它是用戶使用Linux的橋梁,硬件>內(nèi)核>shell>文件系統(tǒng)
- 5.1 變量:定義變量修飾詞:readonly定義只讀變量,unset刪除變量
- 5.2 設置與別名,printf,重定向,exit,until,shift:set指令能設置所使用shell的執(zhí)行方式
- 5.3 declare與let:let命令和雙小括號 (( )) 的用法是類似的,它們都是用來對整數(shù)進行運算,不能對小數(shù)(浮點數(shù))或字符串進行運算
- 5.4 函數(shù)與傳參:shell腳本傳遞的參數(shù)中包含空格,應使用單引號或雙引號將該參數(shù)括起來,以便于腳本將這個參數(shù)作為整體來接收。if [ -n str1 ] 當串的長度大于0時為真(串非空)
- 5.5 test:用于檢查某個條件是否成立,它可以進行數(shù)值、字符和文件三個方面的測試
- 5.6 運算:算術、關系、布爾、邏輯、字符串、文件運算
- 5.7 流程控制:if、for、while、case
1.Linux系統(tǒng)啟動過程:ukr,ubuntu開機引導文件/etc/default/grub
如下圖最上面的是最底層。
最小根文件系統(tǒng):1.dev/null和dev/console兩個文件,2.init程序->busybox,3./etc/inittab即配置文件,4.配置文件中指定的程序,5.C庫(應用程序用到)。
內(nèi)核(=操作系統(tǒng))怎樣啟動第一個應用程序:1.open(dev/console,printf/scanf/err)等設備文,2.run_init_process函數(shù)如下。
init進程:是加載內(nèi)核鏡像文件后第一個進程,是Linux的根進程,所有的系統(tǒng)進程都是它的子進程。運行級別:0(init0關機),1(單用戶模式,只允許root用戶對系統(tǒng)維護),2到5(多用戶模式,3為字符界面,5為圖形界面),6(init6重啟)。
busybox:ls這些命令相當于應用程序(可執(zhí)行二進制文件),成千上百個命令,源碼找來再編譯,顯然很費事。busybox是這些命令的組合。想確定init進程做了什么事就要看busybox的源碼。在kernel掛載根文件系統(tǒng)后,運行的第一個程序是根目錄下的linuxrc,實際是一個指向/bin/busybox的鏈接, 也就是說系統(tǒng)起來后運行的第一個程序是busybox本身。busybox首先解析/etc/inittab這個進行初始化的配置文件, 然后調(diào)用/etc/init.d/rcS, 最后是執(zhí)行/etc/profile(/etc/profile.d , ~/.bashrc , ~/.bash_file)。
2.數(shù)據(jù)庫:存儲過程(PL/SQL代碼集,像沒有返回值的自定義函數(shù))和函數(shù)需要用戶顯示調(diào)用才執(zhí)行,而觸發(fā)器是由一個事件來觸發(fā)運行,當某個事件發(fā)生時會自動地隱式運行,不能被顯示的調(diào)用
冒泡,二分查找,sql多用group by。
2.1 數(shù)據(jù)庫優(yōu)化:項目管理PMP證書,數(shù)據(jù)庫DBA/OCM(Oracle Certified Master)證書
緩e索1永,引1小固n,e is rj分。
3.1 數(shù)據(jù)庫開啟緩存,還要避免緩存失效如下第一行:
3.3 小結果集適合建索引。如果占表超過50%不適合建索引,因為數(shù)據(jù)量達到一定量后會走全表掃描:原因是mysql內(nèi)部有一個優(yōu)化器進行最優(yōu)策略即聚集索引和非聚集索引查詢原理,數(shù)據(jù)量太大會先走非聚集索引,然后才走聚集索引獲取數(shù)據(jù)。太頻繁加個redis。
3.4 有l(wèi)imit 1,查到一行就不繼續(xù)往下走。
3.5 數(shù)據(jù)庫創(chuàng)建完一次連接后會永久處于連接狀態(tài),已經(jīng)永久連接了,apache還給數(shù)據(jù)庫不斷發(fā)連接,給數(shù)據(jù)庫增加了壓力,大公司會解決這個。
3.6 myISAM適合大數(shù)據(jù)量查詢,因為進行update時會進行表鎖,這時候讀表都是無效的,必須等插入操作完成。innoDB與myISAM相反,且支持B樹索引,ACID(事務原子性,一致性,,,),行鎖。
3.7 大量insert或delete時會把表整個鎖起來,導致大量web服務器請求過來進不去表,導致宕機,所以用limit進行拆分。
3.8 不同數(shù)據(jù)類型占用硬盤空間不一樣,如果占用硬盤空間小且緊湊,這樣硬盤數(shù)據(jù)讀寫快。
3.9 字段長度統(tǒng)一,數(shù)據(jù)庫計算偏移量輕松。從前端查出來的數(shù)據(jù)會多出來一些空格,用trim去除空格再封裝進對象。
3.10 報錯:該對象屬性不為null或mysql查詢數(shù)據(jù)為null…,用’空格’。數(shù)據(jù)庫一字段查出賦值到java對象上,如果字段為null會報空指針異常。
3.11 enum速度比varchar快。
3.12 不管任何方式查詢表,最終都會通過主鍵定位到數(shù)據(jù),建立主鍵會有效提高性能。id主鍵多用int速度比varchar快。
3.14 避免使用rand(),order by rand()把數(shù)據(jù)庫累死。
3.15 兩個字段類型不一致,索引建不上。
2.2 數(shù)據(jù)庫備份和恢復:冷熱備份
1.冷備份:適用于myisam引擎,不適用于innoDB引擎:關閉mysql,如下或可以點進book文件夾里將.frm(表結構)和.MYD(表數(shù)據(jù))和.MYI(表索引)文件拷貝出來,這三個組合到一起就是一張表,恢復的時候只需把你copy出來的這些文件再重新粘貼回去即可。
2.熱備份:執(zhí)行mysql安裝目錄下的bin/里面的這個mysqldump.exe工具。mysqldump是工具 -u是用戶名 -p是密碼 -A是全部的意思 -d是表結構 -t是表數(shù)據(jù) > 是重定向的意思 > 右邊是需要輸出的路徑和文件名。
2.1 全備份:mysqldump -uroot -p123456 -A > /back/backdb.sql
2.2 備份指定庫命令:mysqldump -uroot -p123456 db1,db2 > /back/backdb.sql
2.3 備份指定表命令:mysqldump -uroot -p123456 db1 tb1 tb2, db2 tb2> /back/backdb.sql
2.4 備份表結構命令:mysqldump -uroot -p123456 -A -d > /back/backdb.sql
2.5 備份表數(shù)據(jù)命令:mysqldump -uroot -p123456 -A -t > /back/backdb.sql
2.6 恢復:source命令在執(zhí)行時會顯示詳細信息,能看到執(zhí)行到哪出錯了:source /back/backdb.sql
數(shù)據(jù)庫界面化工具(sqlyog navicat)也可以備份,但是從來沒用過,數(shù)據(jù)量太大用增量備份xtrabackup。
2.3 數(shù)據(jù)庫精度:高精度數(shù)據(jù)用SQL Server數(shù)據(jù)庫
float(8,6)小數(shù)點前面占2位,小數(shù)點后面占6位。
2.4 MySQL開發(fā)函數(shù):having,where,group by,max,min,sum,count,case where-end,order by,sort by,distinct
如下同理RIGHT。
如下同理小寫LOWER 。
如下右邊先顯示,后得到記錄數(shù)。
2.5 查詢上個月數(shù)據(jù):DATE_SUB(),CURDATE()
如上精確到日,需要將它格式化到月如下。
現(xiàn)在可以拿表中字段(datetime shijian)數(shù)據(jù)進行比較,shijian字段精確到秒需要格式到月份如下。
返回1為true,返回0為false。
如下只需要月份,所以用curdate()。
如下采用period_diff函數(shù),也就是這個月跟字段shijian的間隔為1。
Runapplication啟動類:控制層(UserController),業(yè)務層(UseService,UseServiceImpl),持久層(User即pojo,UseMapper.xml,UseMapper接口)
3.字符設備驅動:編譯做的事:預處理(語法檢查),編譯(.c->.s匯編文件),匯編(.s->.o二進制文件),鏈接(多個.o合并成1個執(zhí)行文件)
1.字符設備:串口,鍵盤,鼠標,幀緩存設備(LCD)。字節(jié)流形式串行順序進行,至少要實現(xiàn)open,close,read,write等系統(tǒng)調(diào)用。應用程序可通過/dev下的文件系統(tǒng)結點訪問字符設備,如:/dev/led,/dev/ttySAC0。音頻芯片將數(shù)字信號轉化為模擬信號得到聲音,數(shù)據(jù)有順序,也是字符設備。
2.塊設備:硬盤,nandflash,SD卡,U盤。設備對數(shù)據(jù)處理按照若干塊進行,一個塊有固定大小,如4k(flash,頁),512字節(jié)(硬盤扇區(qū))。
3.網(wǎng)絡設備:網(wǎng)卡中以幀傳播,大小變動。鏈路層,ip層等層層解剖,最后數(shù)據(jù)報文變數(shù)據(jù)包(loopback設備即127.0.0.1,ping 127.0.0.1 -c 1 ,1為1次,從應用層轉到協(xié)議棧再轉到loopback設備,協(xié)議棧功能正常,返回完整包。loopback設備還能實現(xiàn)同一臺設備不同進程通信,通過TCP Socket綁定127.0.0.1。ifconfig lo時可看到RX和TX接在一起)。如下開發(fā)板只要連電源,顯示器HDMI,串口三個就能串口登錄調(diào)試。
如下是應用程序led_test.c:向設備文件(/dev/myled0)寫1燈亮,寫0燈滅。打開一個文件會返回文件描述符,用數(shù)組記錄。
如下是編譯服務器,rootfs通過NFS網(wǎng)絡共享掛載到開發(fā)板上。進入開發(fā)板rootfs文件夾里執(zhí)行./a.out(先insmod 驅動.ko)。
如下是hello.c,make后生成hello.ko,insmod hello.ko會執(zhí)行hello_init函數(shù)和main函數(shù)一樣,hello_init函數(shù)里申請資源,如向內(nèi)核申請內(nèi)存,初始化gpio控制器,硬件初始化(關閉看門狗即定時器即3s沒人關會重啟整個系統(tǒng),初始化時鐘,初始化SDRAM)。應用程序退出有內(nèi)核幫你釋放你申請的資源,驅動程序需要hello_exit釋放資源,rmmod hello時執(zhí)行hello_exit函數(shù)。
設備文件 - 設備號 - cdev。
如下是hashmap數(shù)據(jù)結構。
如下在內(nèi)核源碼中。
Linux用inode記錄文件的信息。
4.i2c-tools使用:bus號,bus上器件,器件的寄存器,寄存器的offset
i2c-tools工具是調(diào)試i2c,從開源網(wǎng)站http://dl.lm-sensors.org/i2c-tools/releases/下載i2c-tools,解壓后修改makefile直接make進行編譯。編譯完成后在tools/文件夾下會有幾個可執(zhí)行文件:i2cdetect,i2cdump,i2cget,i2cset,將它們拷貝到機器上就可以調(diào)式了。
用i2cset設置單個寄存器值,用i2cget讀取單個寄存器值,可以在初期調(diào)試時發(fā)揮很大作用,一旦有預期的現(xiàn)象出現(xiàn),就可以用i2cdump讀出整個寄存器的值,然后固化到代碼中。
OS命令行查看BMC的ip:sudo ipmitool lan print 8。
5.shell:Shell是一個用C語言編寫的程序,它是用戶使用Linux的橋梁,硬件>內(nèi)核>shell>文件系統(tǒng)
5.1 變量:定義變量修飾詞:readonly定義只讀變量,unset刪除變量
如果字符串中有空格,必須需要使用引號(str=hello world會報錯)。
獲取字符串長度:echo ${#str} ,expr length “${str}”。
截取字符串:echo ${str:1:4}:顯示字符串第1到第4個字符。
echo ${str:4}:從左邊第4個字符開始,一直到結束。
echo ${str:0-6:3}:從倒數(shù)第6個字符開始的3個字符。
echo ${str:0-6}:從倒數(shù)第6個字符開始,一直到結束。
5.2 設置與別名,printf,重定向,exit,until,shift:set指令能設置所使用shell的執(zhí)行方式
不添加引號,轉義將不被執(zhí)行,如下轉義。
command > /dev/null 2>&1不在屏幕上顯示輸出結果和錯誤。/dev/null 是一個特殊文件,寫入到它的內(nèi)容都會被丟棄,從該文件讀取內(nèi)容,什么也讀不到,起到"禁止輸出下面文字"的效果。
$./shift.sh 1 2 3 4
結果顯示:第一個參數(shù)為: 1 參數(shù)個數(shù)為: 4
第一個參數(shù)為: 2 參數(shù)個數(shù)為: 3
第一個參數(shù)為: 3 參數(shù)個數(shù)為: 2
第一個參數(shù)為: 4 參數(shù)個數(shù)為: 1
$./shift1.sh 10 20 15
結果顯示:45
5.3 declare與let:let命令和雙小括號 (( )) 的用法是類似的,它們都是用來對整數(shù)進行運算,不能對小數(shù)(浮點數(shù))或字符串進行運算
5.4 函數(shù)與傳參:shell腳本傳遞的參數(shù)中包含空格,應使用單引號或雙引號將該參數(shù)括起來,以便于腳本將這個參數(shù)作為整體來接收。if [ -n str1 ] 當串的長度大于0時為真(串非空)
5.5 test:用于檢查某個條件是否成立,它可以進行數(shù)值、字符和文件三個方面的測試
5.6 運算:算術、關系、布爾、邏輯、字符串、文件運算
算術:
關系:
布爾:
邏輯:
文件測試運算:
5.7 流程控制:if、for、while、case
if:
for:
while:
until:
case:
break與continue:
總結
以上是生活随笔為你收集整理的【Notes9】Linux系统启动过程,数据库,驱动,i2c-tools,shell的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Notes8】Linux开发环境,Li
- 下一篇: Exp1 PC平台逆向破解 201643