linux快取結構分析

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

linux裝置驅動(十八)–裝置驅動模型(三)各環節整合

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

LINUX裝置驅動i2c架構分析(四)

七: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 =

linux 0.11串口程式分析

0.11核心維護著3個終端,一個顯示器和鍵盤,另外兩個是串口1,2.

linux裝置驅動學習(八)—阻塞式I/O與休眠

阻塞型I/O與休眠當一個進程被置入休眠時,他會被標記為一種特殊的狀態並從調度器的運行隊列調走(將該進程加入到等待隊列中,等待喚醒)。休眠中的進程會被擱置在一邊,等待喚醒。要想安全的進行休眠需要注意:1.永遠不要在原子上下文中進入休眠.原子上下文是指:在執行多個步驟時,不能有任何的並發訪問。對休眠來說,我們的驅動程式不能擁有自旋鎖、seqlock或者RCU鎖時休眠。如果我們已經禁止了中斷,也不能休眠。但在擁有訊號量時允許休眠。如果代碼在擁有訊號量時休眠,任何其他等待該訊號量的線程也會休眠,一次擁有

LINUX裝置驅動學習(十一)–裝置的存取控制

裝置檔案的存取控制:獨享裝置,限制每次只有一個使用者訪問(單使用者訪問),阻塞型使用者訪問,開啟時複製裝置。獨享裝置主要是讓驅動程式維護一個atomic_t變數,該變數初始化為1,表明可用,在open時會減小並測試scull_s_available,並在其他進程開啟該裝置時拒絕開啟該裝置。程式碼範例:static atomic_t scull_s_available = ATOMIC_INIT(1);static int scull_s_open(struct inode

linux塊裝置讀寫的底層實現

ll_re_block()函數:核心塊裝置讀寫都是通過該函數申請請求項來完成的。該函數首先建立請求項,並插入到指定塊裝置的請求隊列中,實際的讀寫操作則是用請求項函數request_fn()來完成的--對與硬碟來說是do_hd_request().該函數建立的請求項後,首先會檢查對應的請求項隊列是否為空白,如果為空白則設定該請求項為當前請求項,否則利用電梯演算法將該請求項加入請求項隊列。由於每個do_hd_request()在結束每個請求項處理後,都會通過終端回呼函數(read_intr和writ

linux裝置驅動(十六)–中斷(一)

中斷處理可以讓裝置在產生某個事件時通知處理器的方法就是中斷。一個“中斷”僅是一個訊號,當硬體需要獲得處理器對它的關注時,就可以發送這個訊號。 Linux

linux裝置驅動學習(七)

進階字元裝置驅動一、ioctl大部分裝置除了讀寫能力,還可進行超出簡單的資料轉送之外的操作,所以裝置驅動也必須具備進行各種硬體控制操作的能力. 這些操作常常通過 ioctl 方法來支援,它有和使用者空間版本不同的原型:int (*ioctl) (struct inode *inode, struct file *filp,              unsigned int cmd, unsigned long

linux交叉編譯配置和檔案系統配置

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 

linux ppp GPRS撥號問題

我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

LINUX裝置驅動i2c架構分析(一)

I2c是philips提出的外設匯流排.I2C只有兩條線,一條串列資料線:SDA,一條是時鐘線SCL.正因為這樣,它方便了工程人員的布線.另外,I2C是一種多主機控制匯流排.它和USB匯流排不同,USB是基於master-slave機制,任何裝置的通一:前言I2c是philips提出的外設匯流排.I2C只有兩條線,一條串列資料線:SDA,一條是時鐘線SCL.正因為這樣,它方便了工程人員的布線.另外,I2C是一種多主機控制匯流排.它和USB匯流排不同,USB是基於master-slave機制,任何

linux裝置驅動學習(二)–字元裝置驅動

字元裝置驅動: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

Linux核心線程之父pid=2的kthreadd線程

轉自http://embexperts.com/viewthread.php?tid=30因為所涉及的話題在代碼的實現上是體系架構相關的,所以本貼基於ARM架構。這裡所謂的核心線程,實際上是由kernel_thread函數建立的一個進程,有自己獨立的task_struct結構並可被調度器調度,這種進程的特殊之處在於它只在核心態運行。在Linux source code中, init/main.c中的rest_init()中就開始調用kernel_thread來構造核心線程了,比如:kernel_

LINUX裝置驅動i2c架構分析(二)

四:i2c driver註冊在分析i2c driver的時候,有必要先分析一下i2c架構的初始化代碼如下:static int __init i2c_init(void){    int retval;     retval = bus_register(&i2c_bus_type);    if (retval)        return retval;    retval = class_register(&i2c_adapter_class);    if

linux裝置驅動學習(三)

1. scull的記憶體管理兩個基本函數void *kmalloc(siez_t size,int flags);void kfree(void

基於ARM 的Linux 的啟動分析報告——ARM+Linux的啟動分析(3)

(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)

LINUX裝置驅動i2c架構分析(三)

六:其它的擴充分析完adapter和i2c driver的註冊之後,好像整個架構也差不多了,其它,擴充的東西還有很多.我們舉一個legacy形式的例子,這個例子是在kernel中隨便搜尋出來的:在linux-2.6.26.3/drivers/hwmon/ad7418.c中,初始化函數為:static int __init ad7418_init(void){    return i2c_add_driver(&ad7418_driver);}i2c_driver

linux裝置驅動學習(四)

1.系統的日誌維護 ◆syslog  這個服務程式太重要了,大部分的系統維護都會用到它,也就是網路或系統管理員經常用到的log 檔案。daemon在執行時其實是執行兩個程式:syslogd和klogd,介紹如下,其分別負責不同種類的log,但全部的資訊在系統剛開完機之後,會全部存放在/var/log/message。klogd  先介紹klogd是因為當一開始寫入/var/log/message時,klogd所記錄的資訊會比syslogd

linux裝置驅動學習(五)

今天學習並發與競態一 並發及其管理競態通常是作為對資源的共用訪問結果而產生的。在設計自己的驅動程式時,第一個要記住的規則是:只要可能,就應該避免資源的共用。若沒有並發訪問,就不會有競態。這種思想的最明顯的應用是避免使用全域變數。但是,資源的共用是不可避免的 ,如硬體資源本質上就是共用、指標傳遞等等。資源共用的硬性規則:(1)在單個執行線程之外共用硬體或軟體資源的任何時候,因為另外一個線程可能產生對該資源的不一致觀察,因此必須顯示地管理對該資源的訪問。--訪問管理的常見技術成為“鎖定”或者“互斥”

總頁數: 4065 1 .... 482 483 484 485 486 .... 4065 Go to: 前往
Tags Index:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。