當前位置:首頁 » 數據倉庫 » 嵌入式資料庫mysql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

嵌入式資料庫mysql

發布時間: 2022-08-16 06:19:02

㈠ 如何通過擴展為Mysql帶來2億QPS

MySQL Cluster介紹

MySQL
Cluster是一套具備可擴展能力、實時、內存內且符合ACID要求的事務型資料庫,其將99.999%高可用性與低廉的開源總體擁有成本相結合。在設
計思路方面,MySQL Cluster採用一套分布式多主架構並藉此徹底消滅了單點故障問題。MySQL
Cluster能夠橫向擴展至商用硬體之上,能夠通過自動分區以承載讀取與寫入敏感型工作負載,並可通過SQL與NoSQL介面實現訪問

作為一套最初被設計為嵌入式電信資料庫、用於實現內網應用運營商級可用性及實時性能的解決方案,MySQL
Cluster已經通過眾多新型功能集的強化而得到快速發展,從而將用例范圍擴展到Web、移動以及企業級應用程序等部署在內部或者雲環境下的實例當中,
具體包括:大規模OLTP(實時分析)電子商務、庫存管理、購物車、支付處理、訂單追蹤、在線游戲、金融交易與欺詐檢測、移動與微支付、會話管理與緩存
數據流供應、分析與建議、內容管理與交付、通信與呈現服務、訂閱/用戶配置管理與補貼等等。

MySQL Cluster架構概述

在面向應用程序的事務流程背後,存在著三種負責將服務交付至應用程序的節點類型。下圖所示為一套簡單的示例型MySQL Cluster架構,其由十二套被劃分為六個節點組的Data Node構成。

Data Node屬於MySQL Cluster當中的主節點。它們負責提供以下功能:內存內與基於磁碟數據的存儲與管理、表的自動化與用戶定義型劃分(即分區)、在不同數據節點間進行數據副本同步、事務與數據檢查、自動故障轉移以及用於實現自我修復的故障後自動重新同步。

各種表會在多個數據節點當中進行自動分區,而且每個數據節點作為一個寫入操作的接收主體,這就使其能夠輕松將寫入敏感型工作負載分布至多個商用節點之上,同時保證應用程序的完全透明化。

通過將數據保存並分發至一套無共享架構——也就是不使用任何共享磁碟——當中,並至少為數據同步至一套副本內,MySQL
Cluster能夠保證在單一Data Node出現故障時、用戶至少還擁有另一個存儲有相同信息的Data
Node。如此一來,請求與事務處理流程將以無中斷方式繼續提供令人滿意的運作效果。任何由於Data
Node故障所引發的短暫故障轉移窗口(時間在秒以下)而無法正常完成的事務流程都將被回滾並重新執行。

我們可以為數據選擇存儲方式,包括全部保存在內存內或者將一部分數據只在在磁碟之上(僅限於非索引數據)。內存內存儲對於那些需要經常進行變更的數
據(也就是活躍工作組)而言意義重大。保存在內存內的數據會定期進行指向本地磁碟的檢查,並與全部Data Node進行協調,這樣MySQL
Cluster就能夠在整體系統發生故障時——例如供電中斷——得以全面恢復。基於磁碟的數據能夠被用於存儲對性能要求較低的數據,而這類數據集往往大於
可用內存空間。正如其它大部分資料庫伺服器一樣,MySQL Cluster會利用頁面緩存機制將基於磁碟且訪問頻率較高的數據緩存在Data
Node的內存當中,從而增加其實際性能表現。

Application
Node負責提供由應用程序邏輯到數據節點的連接。應用程序可以利用SQL訪問該資料庫,具體而言通過一台或者多台MySQL伺服器向處於同一套
MySQL Cluster內的存儲數據執行SQL介面功能。在MySQL
Server當中,我們可以使用任何一種標准化MySQL連接機制,這意味著大家擁有非常豐富的訪問技術可供選擇。另外,一套名為NDB
API的高性能(基於C++)介面可被用於實現附加控制、改善實時行為並帶來更理想的吞吐能力。NDB
API的層能夠幫助額外NoSQL介面繞過SQL層而直接訪問該集群,如此一來不僅延遲有所降低、開發人員也有獲得更理想的靈活性水平。現有介麵包括
Java、JPA、Memcached、JavaScript with Node.js以及HTTP/REST(通過一套Apache
Mole實現)。所有Application Node都能夠訪問到來自任意Data
Node的數據,所以即使出現故障、它們也不會導致任何服務丟失——因為各應用程序能夠繼續使用其它尚能正常運轉的節點。

Management Node的職責在於該集群的配置方案發布到集群內的所有節點當中以實現節點管理。Management
Node的起效時間點分別為集群啟動時、某個節點希望加入集群時以及系統進行重新配置時。Management
Node能夠在不影響到當前正在進行的Data及Application
Node執行操作的前提下進行中止以及重啟。在默認情況下,Management
Node同時提供裁定服務,例如某種網路故障引發「裂腦(即split-brain)」或者某信集群開始進行網路劃分的情況。

通過透明化劃分實現可擴展性

來自任何給定表的行都會以透明化方式被拆分成多個分區/片段。在每個片段中會包含一個單獨數據節點,負責保留全部數據內容並處理指向該數據的所有讀
取及寫入操作。每個數據節點還擁有一套搭檔體系,二者共同構成一個節點組;
搭檔節點中保存有該數據片段的輔助副本,但同時也擁有著自己的主片段。MySQL
Cluster利用兩步式提交協議實現數據同步,從而確保當某項事務被提交之後、所引發的變更將被同時存儲在兩個數據節點當中。

在默認情況下,表的主鍵會被作為分片鍵使用,而MySQL
Cluster將對該分片鍵執行MD5散列處理、從而選擇需要保存哪個片段/分區。如果某一事務或者查詢需要訪問來自多個數據節點的數據,那麼其中一個數
據節點會充當事務協調方的角色,並將具體工作分配給其它相關數據節點;
接下來訪問結果會得到整合,並最終提供給應用程序。請注意,我們同樣可以讓多個事務或者查詢訪問來自多個分區及表的數據——相較於利用分片機制保存數據的
典型NoSQL,這無疑成為MySQL Cluster的一大顯著比較優勢。

要實現最理想的(線性)規模縮放效果,我們需要確保將高強度查詢/事務只需運行在單獨一套數據節點之上(因為這能夠大大降低由數據節點間通信所帶來
的網路延遲)。為了實現這個目標,我們可以讓應用程序獲得分布識別能力——具體而言,這意味著由管理員定義的規劃能夠涵蓋分片鍵所需要使用的任意列。舉例
來講,上圖所示為一套配備有由用戶ID與服務名稱組成的復合主鍵的表;
通過將用戶ID選定為分片鍵,表內與給定用戶相關的所有行將始終被容納在同一片段當中。更為強大的是,如果我們在其它表中使用同樣的用戶ID列並將其設定
為分片鍵,那麼該給定用戶在所有表內的全部數據都會被容納在同一片段之內——換言之,指向該用戶的查詢/事務都將在單一數據節點內進行處理。

利用NoSQL API最大程度提升數據訪問速度

MySQL Cluster提供多種方式對存儲數據進行訪問;
最常見的方法當然是SQL,不過正如下圖所示,我們還可以利用多種原生API幫助應用程序直接從資料庫當中讀取及寫入數據,同時又能通過轉換為SQL以繞
過MySQL
Server的方式防止效率低下或者拉高開發復雜程度。現有API面向C++、Java、JPA、JavaScript/Node.js、HTTP以及
Memcached協議。

基準目標:每秒2億次查詢

MySQL Cluster在設計當中主要面向兩種工作負載類型:

-OLTP(即聯機事務處理):內存優化型表提供次毫秒級低延遲與堪稱極端水平的OLTP工作負載並發能力,同時仍然保證良好的耐久性表現; 此外,其也能夠被用於處理基於磁碟的表數據。

-臨時性搜索:MySQL Cluster增加了並行數量上限,從而在對表內非索引數據列進行掃描時帶來顯著的速度提升。

值得一提的是,MySQL Cluster在處理OLTP工作負載方面的表現最為突出,特別是在以並發方式發出海量查詢/事務請求的情況下。為此,我們一般會使用flexAsynch基準測試來衡量將更多數據節點添加到集群當中後,NoSQL所獲得的實際性能擴展效果。

此次基準測試所面向的每個數據節點都運行在採用專用56線程英特爾E5-2697
v3(Haswell架構)設備之上。上圖所示為數據吞吐能力隨數據節點數量增長的變化趨勢,具體區間由2節點最終增加到32節點(請注意,MySQL
Cluster目前最多能夠支持48個數據節點)。如套大家所見,整個擴展比例幾乎保持線性,而且在32數據中心情況下其整體吞吐能力達到了每秒2億次
NoSQL查詢。

如果大家對這次測試感興趣,可以點擊此處在MySQL Cluster基準測試頁面內了解與之相關的詳盡描述與最新結果。

㈡ Linux下各個MySQL安裝包的用處是什麼

Development Libraries 開發庫,在mysql上做二次開發的,一般不會用到,是修改Mysql的時候用,可以給Mysql增加新的功能或打補丁。
Client Utilities 客戶端工具,
Test Suite 測試套件,用來測試資料庫的性能、sql正確性之類的
MySQL Server 真正的mysql伺服器程序的安裝包

Shared components 不知道
Embedded 嵌入式開發時候用到的
Compressed TAR Archive Mysql的可執行文件,不需要安裝即可使用的綠色版

如果是你RPM包管理器,只要下載 Mysql Server 就可以了
否則只要下載 TAR 壓縮包版
其他的都是你用到的話才需要下載。

㈢ 如何更換openfire資料庫,比如我現在用的是mysql,想換成內嵌的資料庫應該怎麼操作

openfire設置的配置文件路徑為:../openfire/conf/openfire.xml。打開xml文件發現安裝設置完成後setup的值為true,<setup>true</setup>。首先關閉openfire伺服器,然後刪除<setup>屬性,然後重新啟動Openfire並重新裝入設置工具。

㈣ 嵌入式linux,怎麼訪問pc機的mysql資料庫

1. 通過調用mysql_library_init(),初始化MySQL庫。庫可以是mysqlclient C客戶端庫,或mysqld嵌入式伺服器庫,具體情況取決於應用程序是否與「-libmysqlclient」或「-libmysqld」標志鏈接。
2. 通過調用mysql_init()初始化連接處理程序,並通過調用mysql_real_connect()連接到伺服器。
3. 發出SQL語句並處理其結果。(在下面的討論中,詳細介紹了使用它的方法)。
4. 通過調用mysql_close(),關閉與MySQL伺服器的連接。
5. 通過調用mysql_library_end(),結束MySQL庫的使用。

㈤ linux gcc mysql 如何在c語言中使用嵌入式SQL編程 要什麼頭文件如何編譯越詳細越好

最起碼包含mysql.h
實例代碼:
#include <stdlib.h>
#include <stdio.h>

#include "mysql.h"

int main(int argc, char *argv[]) {
MYSQL *conn_ptr;

conn_ptr = mysql_init(NULL);
if (!conn_ptr) {
fprintf(stderr, "mysql_init failed\n");
return EXIT_FAILURE;
}

conn_ptr = mysql_real_connect(conn_ptr, "localhost", "rick", "secret",
"foo", 0, NULL, 0);//連接資料庫

if (conn_ptr) {
printf("Connection success\n");
} else {
printf("Connection failed\n");
}

mysql_close(conn_ptr);

return EXIT_SUCCESS;
}
編譯:(假定上面文件取名 con.c,在當前目錄下)
gcc -I/usr/include/mysql con.c -L/usr/lib/mysql -lmysqlclient -o con

㈥ 學習嵌入式要學oracle資料庫知識么

就我個人工作中的建議,不一定,比如我公司的設備產品用的就是MYSQL 資料庫。當然其它資料庫不是說就不用去學習了,事實上如果一個產品要推向市場,就得以解決所有用戶的需求為目的,而企業不可能只使用一個單一的資料庫,根據客戶需求去調整產品策略是產品成功的必然過程,否則就會被淘汰,只是初期會先以某個平台為起點而已。以上純屬個人一時亂說,希望可以給你提供些參考。

㈦ Mysql 資料庫查詢大小

能,找本sql方面的書看看,跟c語言介面部分。

C API代碼是與MySQL一起提供的。它包含在mysqlclient庫中,並允許C程序訪問資料庫。

MySQL源碼分發版的很多客戶端是用C語言編寫的。如果你正在尋找能演示如何使用C API的示例,可參看這些客戶端程序。你可以在MySQL源碼分發版的客戶端目錄下找到它們。

大多數其他客戶端API(除了Connector/J和Connector/NET)採用mysqlclient庫來與MySQL伺服器進行通信。這意味著(例如),你可以利用很多相同環境變數(與其他客戶端程序使用的環境變數相同)帶來的好處,這是因為它們是從庫中引用的。關於這些變數的詳細清單,請參見第8章:客戶端和實用工具程序。

客戶端具有最大的通信緩沖區大小。初始分配的緩沖區大小(16KB)將自動增加到最大(最大為16MB)。由於緩沖區大小將按需增加,簡單地增加默認的最大限制,從其本身來說不會增加資源使用。該大小檢查主要是檢查錯誤查詢和通信信息包。

通信緩沖區必須足夠大,足以包含1條SQL語句(用於客戶端-伺服器通信)以及1行返回的數據(用於伺服器-客戶端通信)。每個線程的通信緩沖區將動態增加,以處理直至最大限制的任何查詢或行。例如,如果BLOB值包含高達16MB的數據,那麼通信緩沖區的大小限制至少為16MB(在伺服器和客戶端)。客戶端的默認最大值為16MB,但伺服器的默認最大值為1MB。也可以在啟動伺服器時,通過更改max_allowed_packet參數的值增加它。請參見7.5.2節,「調節伺服器參數」。

每次查詢後,MySQL伺服器會將通信緩沖區的大小降至net_buffer_length位元組。對於客戶端,不會降低與連接相關緩沖區大小,直至連接關閉為止,此時,客戶端內存將被收回。

關於使用線程的編程方法,請參見25.2.15節,「如何生成線程式客戶端」。關於在相同程序創建包含「伺服器」和「客戶端」的獨立應用程序的更多信息(不與外部MySQL伺服器通信),請參見25.1節,「libmysqld,嵌入式MySQL伺服器庫」。

這里很詳細
好好認真學習啊

㈧ mysql 是不是嵌入式資料庫,該如何處理

雖不是嚴格意義上的嵌入式資料庫,但是支持嵌入式應用:
在程序里邊直接啟動MySQL嵌入式運行時可以執行任何CUD操作。

㈨ MYSQL和SQLITE有什麼重要區別

mysql 和 sqlite 區別

SQLITE是單機資料庫。功能簡約,小型化,追求最大磁碟效率
MYSQL是完善的伺服器資料庫。功能全面,綜合化,追求最大並發效率
MYSQL、Sybase、Oracle等這些都是試用於伺服器數據量大功能多需要安裝,例如網站訪問量比較大的。而sqlite是一款小型資料庫,簡單移植性好無需安裝只需要幾個文件。一般手機,終端等用的比較多

㈩ 怎麼在arm9上使用mysql資料庫

你51接觸不多,嗯……arm9很成熟了,而且有跑裸機的——可以看成高級單片機,不過功能更多,然後再來過渡到linux……
下文來字韋老師的建議:
作為一個新人,怎樣學習嵌入式Linux?被問過太多次,特寫這篇文章來回答一下。
在學習嵌入式Linux之前,肯定要有C語言基礎。匯編基礎有沒有無所謂(就那麼幾條匯編指令,用到了一看就會)。
C語言要學到什麼程度呢?越熟當然越好,不熟的話也要具備基本技能。比如寫一個數組排序、輸入數字求和什麼的。
學C語言唯一的方法是多寫程序多練習,編譯出錯沒關系,自己去解決;執行出錯沒關系,自己去分析。以前我是用
VC來練習C語言的,經常去嘗試著寫一些C語言競賽的題目。它們是純C、純數學、純邏輯的題目,不涉及界面這些東西,
很適合煅煉你的編程能力。

回到主題,首先我們要明白你的目的是什麼,大概來說所謂嵌入式Linux可以分為兩部分:底層系統、應用開發。
如果你是想做應用開發,那麼你去把C語言、數據結構、JAVA什麼的學好吧。嵌入式應用開發和PC上的
應用開發並沒有什麼特別要注意的。也許你說在嵌入式上要做些優化,是的,要優化,但是未經優化的程序
和PC上的程序開發沒什麼差別。另外,當你有能力去優化時,你已經不用來問這個問題了。具體到某個例子,
比如說開發界面,在PC上我們用VC;在嵌入式Linux里也許我們用QT也許用Android,這個時候你應該去學學QT、
Android的編程。但是基礎還是C或JAVA,在此基礎上去熟悉它們的介面。你學過VC的話,也是要花時間去了解
那些類、控制項的。
如果你的目的是想學習底層系統,這是我的專長,倒是可以說一點。
在回答這個問題之前,我先回答:不少人問我,到底是學驅動還是學應用?
我只能說憑興趣,並且驅動和應用並不是截然分開的
1. 我們說的驅動,其實並不局限於硬體的操作,還有操作系統的原理、進程的休眠喚醒調度等概念。
想寫出一個好的應用,想比較好的解決應用碰到的問題,這些知識你應該懂
2. 做應用門檻低,特別是現在的ANDROID,純JAVA。做應用的發展路徑個人認為就是業務純熟。
比如在通信行業、IPTV行業、手機行業,你了解行業的需求。所以,當領導的人,多是做應用的。
3. 做驅動,其實我不想稱為「做驅動」,而是想稱為「做底層系統」,做好了這是通殺各行業。我工作幾年,
做過手機、IPTV、會議電視,但是這些產品對我毫無差別,因為我只做底層。他們的業務跟我沒關系。
當應用出現問題,他們解決不了時,我就會從內核角度給他們出主意,給他們提供工具。
做底層的發展方向,個人認為是技術專家。
4. 其實,做底層還是做應用,之間並沒有一個界線,有底層經驗,再去做應用,你會感覺很踏實。
有了業務經驗,你再了解一下底層,很快就可以組成一個團隊。

回到怎麼學的問題上。嵌入式Linux底層系統包含哪些東西?不要急,舉一個例子你就知道了。
1. 電腦一開機,那些界面是誰顯示的?是BIOS,它做什麼?一些自檢,然後從硬碟上讀入windows,並啟動它。
類似的,這個BIOS對應於嵌入式Linux里的bootloader。這個bootloader要去Flash上讀入Linux內核,並啟動它。
2. 啟動windows的目的是什麼?當然是上網聊天什麼的了。這些上網、聊天工具在哪?
在C盤、D盤上。所以, windows要先識別出C盤、D盤。在Linux下我們稱為根文件系統。
3. windows能識別出C盤、D盤,那麼肯定能讀寫硬碟才行。這涉及的東西稱為驅動程序。當然不僅僅是硬碟,還有網卡、USB等等。
嵌入式Linux能從Flash上讀出並執行應用程序,肯定也得有Flash的驅動程序啊,當然也不僅僅是Flash。

先說到這里吧,嵌入式LINUX里含有bootloader, 內核, 驅動程序、根文件系統這4大塊。
一、bootloader:
它就是一個稍微復雜的裸板程序。但是要把這裸板程序看懂寫好一點都不容易。Windows下好用的工具弱化了我們的編程能力。
很多人一玩嵌入式就用ADS、KEIL。你能回答這幾個問題嗎?
1. 一上電,CPU從哪裡取指令執行?
答:一般從Flash上指令。
2. 但是Flash一般是只能讀不能直接寫的,如果我用到全局變數,這些全局變數在哪裡?
答:全局變數應該在內存里
3. 那麼誰把全局變數放到內存里去?
答:長期用ADS、KEIL的朋友,你能回答嗎?這需要"重定位"。在ADS或KEIL里,重定位的代碼是製作這些工具的公司幫你寫好了。
你可曾去閱讀過?
4. 內存那麼大,我怎麼知道把"原來存在Flash上的內容"讀到內存的"哪個地址去"?
答:這個地址用"鏈接腳本"決定,在ADS里有scatter文件,KEIL里也有類似的文件。但是,你去研究過嗎?
5. 你說重定位是把程序從Flash復制到內存,那麼這個程序可以讀Flash啊?
答:是的,要能操作Flash。當然不僅僅是這些,還有設置時鍾讓系統運行得更快等等。

先自問自答到這里吧,bootloader這一個裸板程序,其實有3部分要點:
1. 對硬體的操作
2. 對ARM體系處理器的了解
3. 程序的基本概念:重定位、棧、代碼段數據段BSS段什麼的。

對硬體的操作,需要看原理圖、晶元手冊。這需要一定的硬體知識,不求你能設計硬體,但是至少能看懂; 不求能看懂模擬電路,
但是要能看懂數字電路。這方面的能力我是在學校里學到的,微機原理、數字電路這2本書(書名忘了)就足夠了。但是我懷疑你有無耐
心把這2本書看完。我不知道現在有沒有更快捷的書。想速成的話,就先放掉這塊吧,不懂就問GOOGLE、發貼。
另外,晶元手冊是肯定要讀的,別去找中文的,就看英文的。開始是非常痛苦,以後就會發現那些語法、詞彙一旦熟悉後,
讀任何晶元手冊都很容易。
對ARM體系處理器的了解, 看杜春蕾的<ARM體系架構與編程>吧,裡面講有匯編指令,有異常模式、MMU等。也就這3塊內容需要你了解。
程序的基本概念,王道當然是去看編譯原理了。可惜,這類書絕對是天書級別的。勸你若非超級天才還是別去看了。就看我寫的
<嵌入式Linux應用開發完全手冊>和第1期視頻吧,別擔心,不用花錢。照著視頻把硬體相關的實驗做了,這些概念就清楚了。我還沒有
發現第2套講這些概念的書或視頻,允許我盲目吹噓一回。

對於bootloader,我學習時是先看了<ARM體系架構與編程>,然後自己寫程序把各個硬體的實驗都做了一遍,比如GPIO、時鍾、
SDRAM、UART、NAND。把它們都弄清楚了,組台在一起就很容易看懂u-boot了
總結一下,看懂硬體原理圖、看晶元手冊,這需要你自己去找資料。剩下的,就按<嵌入式Linux應用開發完全手冊>和第1期視頻的章
節目錄去學習吧。

二、內核:
想速成的人,先跨過內核的學習,直接學習怎麼寫驅動。
想成為高手,內核必須深刻了解。注意,我說的是了解,我沒奢望去寫出一個內核。
要對裡面的調度機制、內存管理機制、文件管理機制等等有所了解。
推薦兩本書:
1. 通讀<linux內核完全注釋>,請看薄的那本(浮燥的社會講求速度, 呵),
2. 選讀<Linux內核情景分析>, 想了解哪一塊就讀哪一節

三、驅動:
驅動包含兩部分:硬體本身的操作、驅動程序的框架。
又是硬體,還是要看得懂原理圖、讀得懂晶元手冊,多練吧。

說到驅動框架,有一些書介紹一下。LDD3,即<Linux設備驅動>,老外寫的那本,裡面介紹了不少概念,值得一讀。但是,它的作用
也就限於介紹概念了。我基本上是入門之前用它來熟悉一下概念,入門後就扔掉了。
驅動方面比較全的介紹,應該是宋寶華的<linux設備驅動開發詳解>了,老實說我只看過目錄,有不少人說好,這里推薦一下。
要想深入了解某一塊,<Linux內核情景分析>絕對是超5星級推薦。你別指望把它讀完,1800多頁,上下兩冊呢。我是某一塊不清楚
時,就去翻一下它。任何一部分,這書都可以講上2、3百頁,非常詳細。並且是以某個目標來帶你分析內核源碼。它以linux 2.4為例,
但是原理相通,同樣適用於其它版本的linux。

還有沒有其他介紹?呵呵,當然有了,韋東山Linux視頻第2期。<嵌入式Linux應用開發完全手冊>里對驅動講得不多,不夠深入。
於是我錄制了這期視頻。不僅僅教你怎麼寫怎麼改驅動,還教你為什麼這樣寫這樣改驅動。
每一個驅動都是現場編寫:
1. 用繪圖板畫圖講解──相當於學校里老師在黑板上畫圖講解,很直觀
絕對不是對著PPT念。
2. 用source insight當場寫程序,從第1行開始寫,每一課都是這樣。我講了20多個驅動,就寫了20多個程序。
3. 寫完就編譯、測試。
4. 很全面,字元設備驅動、塊設備、網卡驅動3大類齊全,硬體介紹、驅動框架分析、測試3大類齊全。
培訓機構里教的內容,遠不及這期視頻豐富。我在多個培訓機構講過課,從沒看到哪個老師敢每一課都當場講解當場編寫代碼
當場測試,除我之外!也沒看到哪個培訓機構講完這些內容──因為時間不夠,講完起碼要一個月,但是這部分基本只有2周授課時間。

把你手上的開發板所涉及的硬體,都去嘗試寫一個驅動吧。有問題就先"痛苦地思考",思考的過程中你會把很多不相關的知識
串聯起來,最終貫通。

四、根文件系統:
大家有沒有想過這2個問題:
1. 對於Linux做出來的產品,有些用作監控、有些做手機、有些做平板。那麼內核啟動後,掛載根文件系統後,應該啟動哪一個應用程序呢?
答:內核不知道也不管應該啟動哪一個用戶程序。它只啟動init這一個應用程序,它對應/sbin/init。
顯然,這個應用程序就要讀取配置文件,根據配置文件去啟動用戶程序(監控、手冊界面、平板界面等等)
這個問題提示我們,文件系統的內容是有一些約定的,比如要有/sbin/init,要有配置文件
2. 你寫的hello,world程序,有沒有想過裡面用到的printf是誰實現的?
答:這個函數不是你實現的,是庫函數實現的。它運行時,得找到庫。
這個問題提示我們,文件系統里還要有庫。

簡單的自問自答到這里,要想深入了解,可以看一下busybox的init.c,就可以知道init進程做的事情了。
當然,也可以看<嵌入式Linux應用開發完全手冊>里構建根文件系統那章。

說一下我的學習經歷吧。
1. 我在學校時讀的是物理電子專業,其實課程里沒有教怎麼設計電路,只是教了些電子電路方面的知識。PCB的設計
是在實驗室里自學的,只設計過2層板,現在忘記得差不多了。但是保留了看原理圖、看晶元手冊的能力。
2. 選修了軟體學位,對軟體設計挺感興趣,但是也只是學了C語言、資料庫而已。憑著興趣做了不少競賽題。沒能力去
參加競賽,但是把C語言練得很扎實。
3. 在實驗室、在第1家公司,就是設計些簡單的PCI卡,寫一下windows的驅動程序
4. 在第2家公司,用51單片機做車載電話,開始走上純軟體的道路。
5. 開始感到單片機的不足,辭職半年閉門學Linux,從red hat怎麼操作開始。步驟就是先看<ARM體系架構與編程>,
再自己寫裸板程序操作硬體,接著到分析u-boot。同時看<linux內核完全注釋>,對LINUX框架有所了解。
在寫裸板時,建議各位加強對中斷的理解,內核就是用中斷來完成各種功能的。
6. 分析完u-boot,就開始進行簡單的驅動編程了,這時候,能力還很弱。
7. 開始去中興上班,工作2年,編寫各類驅動、解決各類問題(驅動問題、幫助定位應用問題),能力得到煅煉。

總結一下:
1. 硬體方面的書: 微機原理、數字電路,高校里的教材。畢業多年,忘名了。
2. Linux方面的書:
<ARM體系架構與編程>
<嵌入式Linux應用開發完全手冊>
<Linux設備驅動>,老外寫的那本
<linux設備驅動開發詳解>
<linux內核完全注釋>
<Linux內核情景分析>