Time of Update: 2018-12-04
struct buffer_head { char * b_data; /* pointer to data block (1024 bytes) */ unsigned long b_blocknr; /* block number */ unsigned short b_dev; /* device (0 = free) */ unsigned char b_uptodate; unsigned char b_dirt; /* 0-clean,1-dirty */ unsigned
Time of Update: 2018-12-04
PCI裝置建立過程 這部分分成兩部分學習,一是參考前輩的文章,分析lddbus和sculld兩部分源碼,二是參考ldd3學習pci部分 第一部分ldd_bus聲明了一個bus_type結構的ldd_bus_type:struct bus_type ldd_bus_type = { .name = "ldd", .match = ldd_match, .uevent = ldd_uevent,};將ldd_bus_type添加到核心和從核心卸載的代碼如下:static
Time of Update: 2018-12-04
七:i2c dev節點操作現在來分析上面架構圖中的i2c-dev.c中的部份.這個部份為使用者空間提供了操作adapter的介面.這部份代碼其實對應就晃一個模組.它的初始化函數為:module_init(i2c_dev_init);i2c_dev_init()代碼如下:static int __init i2c_dev_init(void){ int res; printk(KERN_INFO "i2c /dev entries driver/n"); res =
Time of Update: 2018-12-04
非同步通知:使用非同步通知機制可以提高查詢裝置的效率。通過使用非同步通知,應用程式可以在資料可用時收到一個訊號,而無需不停地輪詢。設定非同步通知的步驟(針對應用程式層來說的):1.首先制定一個進程作為檔案的屬主。通過使用fcntl系統調用執行F_SETOWN命令時,屬主進程的ID號就會儲存在filp->f_owner中,目的是為了讓核心知道應該通知哪個進程。2.在裝置中設定FASYNC標誌。通過fcntl調用的F_SETFL來完成。設定晚以上兩步後,輸入檔案就可以在新資料到達時請求發送一個
Time of Update: 2018-12-04
網路檔案系統(NFS,Network File System)是一種將遠程主機上的分區(目錄)經網路掛載到本地系統的一種機制,通過對網路檔案系統的支援,使用者可以在本地系統上像操作本地分區一樣來對遠程主機的共用分區(目錄)進行操作。 在嵌入式Linux 的開發過程中,開發人員需要在Linux 伺服器上進行所有的軟體開發,交叉編譯後,通用FTP 方式將可執行檔下載到嵌入式系統運行,但這種方式不但效率低下,且無法實現線上的調試。因此,可以通過建操作Linux
Time of Update: 2018-12-04
中斷處理可以讓裝置在產生某個事件時通知處理器的方法就是中斷。一個“中斷”僅是一個訊號,當硬體需要獲得處理器對它的關注時,就可以發送這個訊號。 Linux
Time of Update: 2018-12-04
1. 在redhat系統的profile檔案中,有如下內容:#path manipulationif [`id -u` = 0];then pathmunge /sbin pathmunge /usr/sbin pathmunge /usr/local/sbin# pathmunge /opt/EmbedSky/crosstool_3.4.5/gcc-3.4.5-glibc-2.3.6/arm-linux/bin pathmunge
Time of Update: 2018-12-04
我3,4年前在一塊ARM板子上弄通過,由於嵌入式上很多要自己做,redhat上會更簡單,也更容易,如果做嵌入式,你應該先在PC上弄通,在移植到目標板上,大致給你說說,希望對你有所協助 1. 配置kernel使它支援如下PPP選項: PPP(point-to-point) support PPP multilink support(EXPERIMENTAL) PPP support for async serial prots PPP support for sync tty ports PPP
Time of Update: 2018-12-04
字元裝置驅動:1.一般我們都採用動態分配裝置號的API:int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);dev是經用於輸出的函數,在成功完成調用以後將儲存分配範圍的第一個編號。void unregister_chrdev_region(dev_t first,unsigned int
Time of Update: 2018-12-04
轉自http://embexperts.com/viewthread.php?tid=30因為所涉及的話題在代碼的實現上是體系架構相關的,所以本貼基於ARM架構。這裡所謂的核心線程,實際上是由kernel_thread函數建立的一個進程,有自己獨立的task_struct結構並可被調度器調度,這種進程的特殊之處在於它只在核心態運行。在Linux source code中, init/main.c中的rest_init()中就開始調用kernel_thread來構造核心線程了,比如:kernel_
Time of Update: 2018-12-04
1. scull的記憶體管理兩個基本函數void *kmalloc(siez_t size,int flags);void kfree(void
Time of Update: 2018-12-04
(9) 調用檔案misc.c的函數decompress_kernel(),解壓核心於緩衝結束的地方(r2地址之後)。此時各寄存器值有如下變化:r0為解壓後kernel的大小r4為kernel執行時的地址r5為解壓後kernel的起始地址r6為CPU類型值(processor ID)r7為系統類別型值(architecture ID)(10) 將reloc_start代碼拷貝之kernel之後(r5+r0之後),首先清除緩衝,而後執行reloc_start。(11)
Time of Update: 2018-12-04
2.6核心的源碼樹目錄下一般都會有兩個文文:Kconfig和Makefile。分布在各目錄下的Kconfig構成了一個分布式的核心設定資料庫,每個Kconfig分別描述了所屬目錄源檔案相關的核心配置菜單。在核心配置make
Time of Update: 2018-12-04
1.系統的日誌維護 ◆syslog 這個服務程式太重要了,大部分的系統維護都會用到它,也就是網路或系統管理員經常用到的log 檔案。daemon在執行時其實是執行兩個程式:syslogd和klogd,介紹如下,其分別負責不同種類的log,但全部的資訊在系統剛開完機之後,會全部存放在/var/log/message。klogd 先介紹klogd是因為當一開始寫入/var/log/message時,klogd所記錄的資訊會比syslogd
Time of Update: 2018-12-04
進階休眠 執行步驟:1.將進程置於休眠的第一個步驟是分配並初始化一個wait_queue_t結構,然後加入到對應的等待序列。2.設定進城的狀態,將其標記問休眠。TASK_RUNNING表示進程可運行,儘管進程並不一定在任何給定時間都運行在某個處理器上。TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE對應兩種休眠狀態。在2.6核心中,通常不需要驅動程式代碼來操作進城狀態,但是如果需要:void set_current_state(int
Time of Update: 2018-12-04
今天學習並發與競態一 並發及其管理競態通常是作為對資源的共用訪問結果而產生的。在設計自己的驅動程式時,第一個要記住的規則是:只要可能,就應該避免資源的共用。若沒有並發訪問,就不會有競態。這種思想的最明顯的應用是避免使用全域變數。但是,資源的共用是不可避免的 ,如硬體資源本質上就是共用、指標傳遞等等。資源共用的硬性規則:(1)在單個執行線程之外共用硬體或軟體資源的任何時候,因為另外一個線程可能產生對該資源的不一致觀察,因此必須顯示地管理對該資源的訪問。--訪問管理的常見技術成為“鎖定”或者“互斥”
Time of Update: 2018-12-04
我們在前面分析過,在linux記憶體管理中,核心使用3G—>4G的地址空間,總共1G的大小。而且有一部份用來做非連續空間的物理映射(vmalloc).除掉這部份空間之外,只留下896M大小供核心映射到物理地址。通常,我們把物理地址超過896M的地區稱為高端記憶體。核心怎樣去管理高端記憶體呢?今天就來分析這個問題。核心有三種方式管理高端記憶體。第一種是非連續映射。這我們在前面的vmalloc中已經分析過了,在vmalloc中請求頁面的時候,請求的是高端記憶體,然後映射到VMALLOC_STA
Time of Update: 2018-12-04
地球人都知道LDD這書經典,但一直沒時間看(貌似是借口)現在開始啃,希望自己能堅持下去。God bless me!要看到核心的列印資訊,可以先執行下面的語句:echo 8 > /proc/sys/kernel/printk這裡,有blog不錯,可以學習下http://blog.chinaunix.net/u1/34474/showart_404278.html由於驅動程式可能同時被不同的程式並發訪問,解決並發的一些方法:1.可以在裝置上實現獨立於硬體功能的記憶體映射。2.
Time of Update: 2018-12-04
首先當程式需要一塊不存在的記憶體時(也即頁表項中已經標記出相應的頁面不在記憶體中),CPU通過80386的頁錯誤異常中斷來實現。當一個進程引用一個不存在的記憶體頁面時就會產生一個頁錯誤中斷,並把引起中斷的線性地址儲存在CR2寄存器中(便於高效快速存取),因此處理該中斷的程式就可以知道頁異常的確切地址,從而可以把進程要求的頁面從二級儲存空間(比如硬碟)載入到記憶體中。如果此時實體記憶體已經被佔用,則可以藉助二級空間的一部分作為緩衝區把記憶體中暫時不使用的頁面交換到二級儲存空間中,然後把進程需求的頁
Time of Update: 2018-12-04
基於ARM 的Linux 的啟動分析報告摘要:本文主要分析基於ARM 的Linux-2.2.26 核心啟動過程。將首先從/arch/arm/Makefile著手,介紹三種不同的啟動方案,再剖析典型的壓縮核心zImage啟動方案的代碼結構,最後將詳細分析這種方案的啟動過程,直到調用start_kernel()為止。1、Linux 核心的啟動方案:由/arch/arm/Makefile的代碼可以看出,主要有三種啟動方案,分別是:echo '* zImage - Compressed kernel