Time of Update: 2018-12-03
在新的F13十分順暢的完成了核心的編譯, 幾乎沒有遇到任何阻力, 可見版本差異還是關鍵問題. 不過最後, 由於只給了虛擬機器12g的容量, 最後居然不夠用了, 一來是因為我的核心配置幾乎完全按照發行版的選項, 二來10g容量可能是小了些. 那麼之後, 粗略的剪裁了核心(還是省了幾百M的), 再make clean之後, 其實就有3G多的剩餘了, 不過還是試著追加了下硬碟容量, 主要參考的是擴充虛擬機器VM的磁碟空間(LVM)總之 , 核心編譯告一段落, 再針對的做這事, 就是ARM體系下的了.
Time of Update: 2018-12-03
本章主要是介紹性的東西為主,可寫的東西不多,其中做了兩個實驗——hello world和帶參數的模組,算是為驅動學習最簡單的兩個模組了。這章的知識體系較散亂,也就胡亂記些了版本依賴和平台依賴上,並不是很理解,但感覺也不是很重要,記得vermagic.o與這兩者息息相關即可。 不過在此節提及一個觀點/忠告:盡量把條件編譯放到盡量低層的宏和函數中去。核心符號表,包含核心全部的變數和函數地址,是實現模組疊層的必要技術。一個模組可向外部匯出符號。不是很理解,符號是指變數和函數嗎?
Time of Update: 2018-12-03
public class ADR { private static int YEAR=0; private static int MONTH=1; private static int DAY=2; /** * * @param user * @param pass * @return * @throws Exception */ private static String loginJh(String
Time of Update: 2018-12-03
花了一天時間,希望能理解這兩個介面和核心空間下對使用者空間資料的拷貝問題,可惜事與願違,雖有收穫,還是留下了很多問題。遺留的問題首先,關於核心空間下是不允許發生分頁錯誤的疑惑:1.核心的記憶體空間本身就具有虛擬性的概念,那麼當核心的記憶體區需要換頁時,該如何?的呢?2.這樣的規定是基於什麼原因設定的?是作業系統設計時安全性,效能考慮,還是CPU體繫結構上就做出了這樣的設定?或者說假設可以頁錯誤,那麼接下來的問題是無法合理實現還是存在嚴重的效能或安全隱患?(這個問題可能是有點鑽牛角尖了,但找不到答
Time of Update: 2018-12-03
作者:蔡於清www.another-prj.com(約有修改)正如硬碟的碟片被分為磁軌,每個磁軌又分為若干扇區,一塊nand flash也分為若干block,每個block分為如幹page。一般而言,block、page之間的關係隨著晶片的不同而不同,典型的分配是這樣的:1block = 32page1page = 512bytes(datafield) +
Time of Update: 2018-12-03
XMLHttpRequest提供用戶端同http伺服器通訊的協議Dim HttpReq As New MSXML2.XMLHTTP30 HttpReq.open "GET", "http://localhost/books.xml", False HttpReq.send MsgBox HttpReq.responseText 備忘用戶端可以通過XmlHttp對象(MSXML2.XMLHTTP.3.0)向http伺服器發送請求並使用微軟XML文件物件模型Microsoft? XML
Time of Update: 2018-12-03
sscanf函數的進階用法(轉貼+添加) 大家都知道sscanf是一個很好用的函數,利用它可以從字串中取出整數、浮點數和字串等等。它的使用方法簡單,特別對於整數和浮點數來說。但新手可能並不知道處理字串時的一些進階用法,這裡做個簡要說明吧。 1. 常見用法。char str[512] = {0}; sscanf("123456 ", "%s", str); printf("str=%s/n", str); 2.
Time of Update: 2018-12-03
IP資料包傳輸類型 IPv4定義了3種IP資料包的傳輸: 單播(unicast) 廣播(broadcast) 組播(multicast). 比較一下unicast和multicast兩種資料的傳輸方式可以發現, 當一台主機向多個使用者發送資訊時,單播對於每一個使用者都 要發送一份資料的拷貝,而組播總共只需發送一份資料的拷貝。 這樣,組播的使用就大大的節省了頻寬,減輕了網路的負載, 從而更加有效利用了網路的頻寬資源. IP組播和單播的目的
Time of Update: 2018-12-03
大致流程為:下載核心代碼 -> 修改核心配置(make menuconfig/gconfig/xconfig) -> 構建核心( make ) -> 安裝核心( make modules_install -> make install )此次編譯只為熟悉流程瞭解原理修改核心配置 採用預設配置. 此處應該正確選擇驅動的類型構建核心 直接用make, 將產生vmlinux, 未壓縮的靜態核心, 還 會在arch/i386/boot下產生bzImage經壓縮後的核心(
Time of Update: 2018-12-03
HashMap基於雜湊表的 Map 介面的實現。此實現提供所有可選的映射操作,並允許使用 null 值和 null 鍵。(除了不同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順序恒久不變。(from JDK DOC) 預設的 Map大小是 16. (這裡要求必須是 2 的冪數,為什麼一定是 2的冪數(16,32,64,128...下邊有解釋). static final int
Time of Update: 2018-12-03
繼昨天之後, 開始對核心中的硬體開始配置, 方法是, 根據發行版給出的硬體模組, 找出在核心中對應的的選項. 具體是先執行指令碼find_all_modules.sh -- 源自<linux核心技術手冊>一書, 其代碼:#!/bin/sh#for i in `find /sys/ -name modalias -exec cat {} \;`; do /sbin/modprobe --config /dev/null --show-depends $i ;done | rev
Time of Update: 2018-12-03
在Turbo C2.0啟動過程中, 傳遞main()函數三個參數: argc, argv和env。 * argc: 整數, main()的命令列參數個數。 * argv: 字串數組。 argv[0] 為程式啟動並執行全路徑名 argv[1] 為在DOS命令列中執行程式名後的第一個字串; argv[2] 為執行程式名後的第二個字串; ...
Time of Update: 2018-12-03
為了核心的問題請教了tinnal, 他指出了三處問題: 1. 編譯的命令使用的是Make defconfig; 2. 檔案系統, 尤其是LVM的問題; 3. 編譯環境的核心版本比要編譯的核心版本高太多;按照這個思路, 首先, 在原核心配置基礎上, 將發行版中檔案系統的配置幾乎複製過來(僅忽略沒有的配置項), 重新編譯後, 問題依舊.之後, make distclean, 直接Make menuconfig, 再編譯, 光make就差不多花了70分鐘, 其間遇到兩個編譯問題:
Time of Update: 2018-12-03
轉自 《unix 環境進階編程》+ 個人補充一個現存進程調用f o r k函數是U N I X核心建立一個新進程的唯一方法(這並不適用於前節提及的交換進程、i n i t進程和頁精靈進程。這些進程是由核心作為自舉過程的一部分以特殊方式建立的)。 #i nclude <sys/types.h>#i nclude <unistd.h>pid_t fork(void);
Time of Update: 2018-12-03
編寫字元裝置的驅動程式一般流程:定義驅動程式為使用者程式提供的能力(機制);決定模組的核心資料結構,如:描述裝置的,描述裝置資料在記憶體中的存放形式的等;確定主、次裝置號;通過/proc/devices可獲得裝置的主裝置號,依此在/dev下mknod出裝置檔案;編寫模組的init, exit函數;編寫file_operations結構中的功能函數:open release, read write等; 對file_operations,
Time of Update: 2018-12-03
回呼函數,就是由你自己寫的。你需要調用另外一個函數,而這個函數的其中一個參數,就是你的這個回呼函數名。這樣,系統在必要的時候,就會調用你寫的回呼函數,這樣你就可以在回呼函數裡完成你要做的事。模組A有一個函數foo,它向模組B傳遞foo的地址,然後在B裡面發生某種事件(event)時,通過從A裡面傳遞過來的foo的地址調用foo,通知A發生了什麼事情,讓A作出相應反應。 那麼我們就把foo稱為回呼函數。 例子:
Time of Update: 2018-12-03
本章主要分為四個部分:通過日誌(列印)調試,通過proc(查詢)調試,通過strace(監視)調試以及通過kgdb調試。kgdb簡單看了下,沒動手,感覺作用不是很大,如果以後有需要再回頭看。先按章節來總結。通過日誌調試
Time of Update: 2018-12-03
訊號量semaphore down_interruptible故名思義是可以被中斷的(這也是為什麼要檢查傳回值的原因),而與之對應的是down無法被中斷,這個介面是一般不用的。讀寫訊號量rwsem( read/write semaphore ) 介面命名上與訊號量類似。completion completion用於“在當前線程這外初始化某個活動,然後等待該活動完成”,介面主要是:wait_for_completion與complete/complete_
Time of Update: 2018-12-03
一、編譯代碼一般需要指定三個路徑: (1)編譯器的路徑。(2)庫資源的路徑。(3)標頭檔的路徑。二、編譯器的路徑: 在Linux中,常用命令程式的路徑都放在環境變數$PATH中,當你在控制台寫一個命令回 車 時作業系統就會到環境變數$PATH中去找,如果找不到就會顯示“command not find”, 所以編譯器的路徑不在環境變數中當然不行了:),可以用 $echo $PATH看看有那些路
Time of Update: 2018-12-03
常用的找錯辦法就是先確認你剛剛改動了哪些語句,然後用/*和*/把可能出錯的語句屏障掉,如果運行後還不通過就再擴大範圍。即使有一段程式你覺得不可能有什麼問題或以前工作正常也要試試將它屏障,有時就是在似乎最不可能出錯的地方出了問題。 還有一種大家都經常用的找錯辦法就是把一些變數的值顯示在螢幕上,或是把程式啟動並執行詳細過程存入檔案中,出什麼問題一目瞭然。如果再像QuakeIII一樣用一個"控制台"顯示出來就很酷了。