Time of Update: 2018-12-03
在基於ARM的嵌入式系統開發中,常常用到交叉編譯的GCC工具鏈有兩種:arm-linux-*和 arm-elf-*,兩者區別主要在於使用不同的C庫檔案。arm-linux-*使用GNU的Glibc,而arm-elf-*一般使用 uClibc/uC-libc或者使用REDHAT專門為嵌入式系統的開發的C庫newlib.Glibc。uClibc/uC-libc以及 newlib都是C語言庫檔案,只是所應用的領域不同而已,Glibc是針對PC開發的,uClibc/uC-libc是與Glibc
Time of Update: 2018-12-03
Linux核心驅動程式初始化順序的調整 ,當在做一個驅動的時候要用到另一個驅動提供的API時,此時核心初始化時便碰到了一個依賴問題。而這也是面試老生常談的問題: 經常讓你說下你做的驅動,然後你說XXX驅動後,很可能問下驅動細節後,會有另外一個問題: 1.你寫了一個XXX驅動,那麼它是怎麼被核心執行的呢? 2.我有a,b,c三個裝置的驅動,怎麼讓他們按照b,a,c的順序載入
Time of Update: 2018-12-03
paging_init 用來建立頁表,初始化zone的memory map void *zero_page; sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL); build_mem_type_table(); sanity_check_meminfo(); prepare_page_table(); map_lowmem();
Time of Update: 2018-12-03
Linux存在於各種體繫結構上,所以描述記憶體需要架構獨立的方法。本章會描述用來管理memory bank,頁框的資料結構以及那些影響VM行為的flagsVM第一個重要的流行概念是Non Uniform Memory
Time of Update: 2018-12-03
【實驗內容】 通過運用crosstool-0.43.tar.gz指令碼工具包來製作自己的交叉編譯器。並且此編譯器能夠編譯u-boot,linux核心,以及應用程式。本實驗旨在讓讀者學會一種編譯製作交叉編譯器的方法。在實際開發中,大多根據編譯目標,選擇一些編譯好的、經過測試的交叉編譯器。【實驗環境】1、ubuntu7.10/8.10/9.10發行版 2、linux-2.6.14核心 3、FS2410平台 【實驗步驟】 crosstool是由美國人Dan Kegel(
Time of Update: 2018-12-03
ARM MMU只支援兩級頁表地址轉換,也就是採用三級分頁映射,能夠滿足32bitCPU的儲存管理需求ARM支援的頁大小有幾種 - 1M, 64K, 4K, 1K。在linux
Time of Update: 2018-12-03
在32bit機器上,由於32bit地址空間的限制,最大定址範圍為2^32 - 1也就是4G的線性地址空間,linux 會按照3G/1G, 2G/2G, 1G/3G的分配方式,把這個4G的地址空間劃分為兩個部分所謂3G/1G就是3G應用空間 1G核心空間, 2G/2G就是2G的應用地址空間 2G的核心地址空間。我們這裡只考慮3G/1G的情況,即只有1G的核心空間。linux 核心又對這1G的核心地址空間進行了劃分,1.
Time of Update: 2018-12-03
CELF- CE Linux Forum 在kernel提交了一個“Preset LPJ”的patch,這個patch可以通過預設LPJ來減少linux kernel啟動過程中校正loops_per_jiffy所需花費的時間。What is loops_per_jiffy?按字面的意思就是每jiffy的迴圈次數,jiffy是kernel
Time of Update: 2018-12-03
Linux kernel zone有如下類型:ZONE_DMA,
Time of Update: 2018-12-03
TLB - translation lookaside
Time of Update: 2018-12-03
Linux系統調用mmap和mmap2,建立一個進程地址空間的映射,mmap/mmap2幾個常用的情境:1. 檔案對應普通檔案I/O操作,讀寫mmap映射後的記憶體,即可完成檔案的讀寫操作,kernel和userspace操作同一塊實體記憶體;而常規的檔案讀寫,需要迴圈調用read write
Time of Update: 2018-12-03
在tty core代碼tty_io.c中,有如下幾行代碼/* * Ok, now we can initialize the rest of the tty devices and can count * on memory allocations, interrupts etc.. */static int __init tty_init(void){ cdev_init(&tty_cdev, &tty_fops); if
Time of Update: 2018-12-03
line discipline(LDISC) 線路規程,是linux和類unix系統終端子系統的一個軟體驅動層。終端子系統從上到下可劃分為三層:頂層tty core驅動層提供字元裝置介面(因為所有的終端裝置都是字元裝置);最底層是tty driver層用來和硬體進行通訊,實現tty_operations供tty core和 LDISC層調用;中介層line discipline實現終端輸入輸出資料處理的策略。line discipline把tty core和tty
Time of Update: 2018-12-03
核心功能調用關係可以通過dump_stack()函數分析出來uart裝置是tty裝置的一種,主從裝置號的分配依賴於平台實現,在我的mx51板上,主裝置號是217,從裝置號範圍為16-23終端驅動裝置號分配資訊可以通過proc檔案系統查看:cat /proc/tty/driveruart serial是tty裝置的一種,而tty裝置又是char 裝置。因此,tty驅動向上層提供file_operations實現,uart
Time of Update: 2018-12-03
當前,除了linux標準的檔案系統Ext2/Ext3/Ext4外,存在很多種檔案系統,比如reiserfs, xfs, Windows的vfat NTFS,網路檔案系統nfs 以及flash 檔案系統jffs2, yaffs/yaffs2
Time of Update: 2018-12-03
1966 /* Here we just switch the register state and the stack. */1967 switch_to(prev, next, prev);1968 1969
Time of Update: 2018-12-03
file_system_type1406 struct file_system_type {1407 const char *name;1408 int fs_flags;1409 int (*get_sb) (struct file_system_type *, int,1410 const char *, void *, struct vfsmount *);1411 void (*
Time of Update: 2018-12-03
路徑尋找是VFS的一個主要操作:給定一個檔案名稱,擷取該檔案名稱的inode。路徑尋找是VFS中相當繁瑣的一部分,主要是符號連結,檔案系統裝載點,以及. ..和//等奇怪路徑 引入了複雜性。nameidata資料結構尋找過程涉及到很多函數調用,在這些調用過程中,nameidata起到了很重要的作用:1. 向尋找函數傳遞參數;2. 儲存尋找結果。struct nameidata { struct dentry *dentry; struct vfsmount
Time of Update: 2018-12-03
進程虛擬位址空間是linux的一個重要抽象,系統為每一個啟動並執行Linux進程提供了4GB的虛擬位址空間,進程之間不會相互幹擾,僅能訪問自己的虛擬位址空間地址。Linux進程的虛擬位址空間分為User和kernel兩個部分,0~3G是為進程的User地址空間,3G~4G為kernel地址空間。此外進程虛擬位址空間也使得許多進階的linux技術得以實現:比如記憶體映射,延遲分配,共用記憶體等。因此進程虛擬記憶體技術和kernel部分的地址空間管理相比,要複雜的多。希望通過如下小節,徹底搞清進程虛
Time of Update: 2018-12-03
去年就發現項目Android系統中已經用上了Ext4檔案系統,當時並沒有深究為什麼要使用Ext4檔案系統,使用ext4帶來的優點和缺點。最近有時間,正好整理下Ext4對於Ext2/Ext3帶來的變化。網上關於Ext4的文章並不多,只找到了來自http://kernelnewbies.org/Ext4/的Ext4 Howto,是一篇概括性的文章。1.