freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linuxalsa聲卡驅(qū)動原理分析-設(shè)備打開過程和數(shù)據(jù)流程(編輯修改稿)

2025-03-08 22:16 本頁面
 

【文章內(nèi)容簡介】 /pcmC0D0) ptr = mmap() snd_pcm_dmix_open() kernel user aplay alsalib alsadriver devicedriver alsalib alsadriver pcmopshw_params( ) //snd_pcm_hw_hw_params() 上圖對應(yīng)的是 ”聲卡打開流程圖 ”的 (3)(4)、 (7)(8)、 (10) (11)、(13) (14)、 (17) (18) 打開 dmix時,會創(chuàng)建或獲取一個信號量,這個信號量用于多個進(jìn)程共同訪問 dmix臨界資源時的互斥,如對sum_buffer的寫操作。 hw(hardware)作為 dmix的從設(shè)備打開,并在映射 pci內(nèi)存及設(shè)置 hw參數(shù)后,將 hw設(shè)為為工作狀態(tài)。 hw的打開、 pci內(nèi)存映射、參數(shù)設(shè)置及狀態(tài)設(shè)置等通過系統(tǒng)調(diào)用進(jìn)入 alsadriver。而shm_sum_create_or_connect()函數(shù)會創(chuàng)建共享內(nèi)存sum_buffer, sum_buffer主要用于混音,具體見下頁。后續(xù)頁先展開 alsalib的 shm_sum_create_or_connect()后,alsadirver以 dmix的流程 open()、 ioctl(HW_PARAMS)、mmap ()、 ioctl(PREPARE)、 ioctl(START)的順序展開。 主要函數(shù)位置: 1. _snd_pcm_hw_open() : 1203 2. snd_open_device() : 247 3. snd_pcm_direct_initialize_slave() : 847 4. snd_pcm_hw_params() : 811 5. snd_pcm_hw_hw_params() : 260 6. snd_pcm_mmap() : 292 7. snd_pcm_hw_prepare() : 425 8. snd_pcm_start() : 1040 9. snd_pcm_hw_start() : 449 四、設(shè)備打開過程和數(shù)據(jù)流程 創(chuàng)建共享內(nèi)存 snd_pcm_direct_semaphore_create_or_connect() semget() iv. 聲卡打開流程圖 alsalib shm_sum_create_or_connect()流程圖 kernel user aplay alsalib alsadriver devicedriver shm_sum_create_or_connect()函數(shù)創(chuàng)建共享內(nèi)存sum_buffer, sum_buffer始和其他進(jìn)程共享的,這樣就可以取得其他進(jìn)程的數(shù)據(jù),并把自己進(jìn)程的數(shù)據(jù)和其他進(jìn)程疊加,完成混音功能。 關(guān)于共享內(nèi)存:共享內(nèi)存允許兩個或多個進(jìn)程共享同一塊內(nèi)存(這塊內(nèi)存會映射到各自進(jìn)程獨立的地址空間中)從而使這些進(jìn)程可以相互通信。共享內(nèi)存塊提供了在任意數(shù)量的進(jìn)程之間進(jìn)行高效雙向通信的機制。每個使用者都可以讀取寫入數(shù)據(jù),但是所有程序之間必須達(dá)成并遵守一定的協(xié)議,以防止諸如在讀取信息之前覆寫內(nèi)存空間等競爭狀態(tài)的出現(xiàn)。 shmget():分配一個共享內(nèi)存塊。 shmctl():設(shè)置或返回一個共享內(nèi)存塊的相關(guān)信息。 shmat():綁定共享內(nèi)存到進(jìn)程地址空間。 四、設(shè)備打開過程和數(shù)據(jù)流程 shm_sum_create_or_connect() shmid_sum = shmget() shmctl(…, IPC_STAT, …) 創(chuàng)建一個共享內(nèi)存,如果失敗,去掉 IPC_CREAT參數(shù)重新調(diào)用,取得內(nèi)存區(qū) 收集共享內(nèi)存區(qū)段的信息 sum_buffer = shmat() 在進(jìn)程空間中為共享內(nèi)存指定地址 iv. 聲卡打開流程圖 alsadriver open()流程圖 左圖上半部 alsadriver對應(yīng)的是 ”聲卡打開流程圖 ”的 (5) 在 alsadriver中 open函數(shù)對應(yīng)的 snd_pcm_playback_open()逐層調(diào)用,打開PCM,設(shè)備文件,子流等,在 open_substream中通過數(shù)指針調(diào)用到硬件驅(qū)動函數(shù) snd_ensoniq_playback1_open(),也就是我們寫具體聲卡驅(qū)動需要注冊的 open函數(shù)。這些函數(shù)都已經(jīng)被添加進(jìn)內(nèi)核,調(diào)試方法參見 《Linux 基礎(chǔ)培訓(xùn) (2)驅(qū)動開發(fā)最佳實踐 》 。 主要函數(shù)位置: 1. snd_pcm_playback_open() : 2092 2. snd_pcm_open() : 2110 3. snd_pcm_open_file() : 2059 4. snd_pcm_open_substream() : 2023 5. snd_ensoniq_playback1_open() : 1110 kernel user aplay alsalib alsadriver devicedriver snd_pcm_playback_open() open(/dev/snd/pcmC0D) snd_pcm_open() snd_pcm_f_ops[2] = { .open = snd_pcm_playback_open, … … … }。 snd_pcm_set_sync() snd_pcm_open_substream() substreamopsopen() ENS1371 chip snd_ensoniq_playback1_ops = { .open = snd_ensoniq_playback1_open, … … … }。 snd_ensoniq_playback1_open() alsadriver devicedriver snd_pcm_hw_constraint_ratdens() snd_pcm_open_file() 左圖下半部 alsadriver對應(yīng)的是 ”聲卡打開流程圖 ”的 (6) 主要函數(shù)位置: 1. snd_pcm_set_sync() 設(shè)置硬件同步 ID : 297 2. snd_pcm_hw_constraint_ratdens() 設(shè)置硬件性能約束 : 1068 四、設(shè)備打開過程和數(shù)據(jù)流程 iv. 聲卡打開流程圖 alsadriver ioctl(HW_PARAMS)流程圖 左圖上半部 alsadriver對應(yīng)的是 ”聲卡打開流程圖 ”的 (9) 在 alsadriver中 ioctl函數(shù)對應(yīng)的 snd_pcm_playback_ioctl ()逐層調(diào)用,在snd_pcm_mon_ioctl1()函數(shù)中通過 switchcase定位 hw_param函數(shù)snd_pcm_hw_params_user(),然后逐層向下調(diào)用,最后通過函數(shù)指針調(diào)用到硬件驅(qū)動函數(shù) snd_ensoniq_hw_params(),也就是我們寫具體聲卡驅(qū)動需要注冊的 prepare函數(shù)。 主要函數(shù)位置: 1. snd_pcm_playback_ioctl() () : 2721 2. snd_pcm_mon_ioctl1() ( ) : 2491 3. snd_pcm_hw_params_user() : 462 4. snd_pcm_hw_params() : 364 kernel user aplay alsalib alsadriver devicedriver snd_pcm_playback_ioctl() ioctl(XXX_HW_PARAMS) snd_pcm_playback_ioctl1() snd_pcm_f_ops[2] = { .unlocked_ioctl = snd_pcm_playback_ioctl, … … … }。 snd_pcm_lib_malloc_pages() case SNDRV_PCM_IOCTL_HW_PARAMS : substreamops hw_params() ENS1371 chip snd_ensoniq_playback1_ops = { .hw_params = snd_ensoniq_hw_params, … … … }。 snd_ensoniq_hw_params() alsadriver devicedriver snd_pcm_mon_ioctl1() 左圖下半部 alsadriver對應(yīng)的是 ”聲卡打開流程圖 ”的 (9) 主要函數(shù)位置: 1. snd_pcm_lib_malloc_pages() allocate the DMA buffer : 340 snd_pcm_hw_params_user() snd_pcm_hw_params_user() 四、設(shè)備打開過程和數(shù)據(jù)流程 iv. 聲卡打開流程圖 alsadriver mmap()流程圖 kernel user aplay alsalib alsadriver devicedriver snd_pcm_mmap() mmap() snd_pcm_mmap_data() snd_pcm_f_ops[2] = { .mmap = snd_pcm_mmap, … … … }。 vaddr = runtimedma_area + offset。 areavm_ops = snd_pcm_vm_ops_data alsadriver devicedriver snd_pcm_default_mmap() kernel缺頁調(diào)用 snd_pcm_mmap_data_fault() snd_pcm_vm_ops_data = { .fault = snd_pcm_mmap_data_fault, … … … }。 … … 左圖 alsadriver對應(yīng)的是 ”聲卡打開流程圖 ”的 (12) 在 alsadriver中 mmap函數(shù)對應(yīng)的 snd_pcm_mmap ()將 dmix的 的缺頁方法注冊進(jìn)內(nèi)核。通過缺頁中斷,返回內(nèi)核虛擬地址 runtimedma_area所在頁的描述符指針,完成內(nèi)存映射。 主要函數(shù)位置: 1. snd_pcm_mmap() : 3214 2. snd_pcm_mmap_data() : 3174 3. snd_pcm_default_mmap() : 3126 4. snd_pcm_mmap_data_fault() : 3086 關(guān)于 mmap: mmap也就是內(nèi)存映射,對于驅(qū)動程序來說,內(nèi)存映射可以提供給用戶直接訪問設(shè)備內(nèi)存的能力。映射一個設(shè)備意味著將用戶空間的一段內(nèi)存與設(shè)備內(nèi)存關(guān)聯(lián)起來。無論何時當(dāng)程序分配的地址范圍內(nèi)讀寫時,實際上訪問的就是設(shè)備。 四、設(shè)備打開過程和數(shù)據(jù)流程 取得硬件申請的 pci內(nèi)存地址 iv. 聲卡打開流程圖 alsadriver ioctl(PREPARE)流程圖 kernel user aplay alsalib alsadriver devicedriver snd_pcm_playback_ioctl() ioctl(XXX_PREPARE) snd_pcm_playback_ioctl1() snd_pcm_f_ops[2] = { .unlocked_ioctl = snd_pcm_playback_ioctl, … … … }。 outl(…CONTROL)。 case SNDRV_PCM_IOCTL_PREPARE : substreamopsprepare() snd_pcm_action_prepare = { .do_action = snd_pcm_do_prepare, … … … }。 snd_ensoniq_playback1_prepare() alsadriver devicedriver snd_pcm_mon_ioctl1() snd_pcm_prep
點擊復(fù)制文檔內(nèi)容
職業(yè)教育相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1