在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺析Linux kernel的閱讀方法

Linux閱碼場 ? 來源:Linux閱碼場 ? 2023-03-25 16:49 ? 次閱讀

l 帶著課題

分析任何代碼都要都要帶著課題,如果只是走馬觀花很難有具體的收獲。“課題”可大、可小,大課題有大收獲閱讀分析時間也比較長。比如“搞清楚Linux是如何收發數據的”“Linux是如何分配內存的”,這些都是比較大的題目;再比如“IP數據包如何被重組的”這就是比較具體的問題,屬于“小課題”。

“大課題”一般是由多個彼此關聯的“小課題”組成的,所以最終我們還是會去在內核中挨個尋找某個具體問題的具體答案,然后再回頭來看整個問題。“小課題”是指某個具體問題,我們通常需要先找到一個切入點,然后順藤摸瓜理出一個頭緒來。

源代碼的分析工具比較簡單,一個編輯器(語法加亮)一個快捷的查找工具(比如grep)就可以開始干活了。通過查找工具找到切入點,然后分析代碼的邏輯。如果代碼量比較大,一般我們會選擇一個IDE工具或者專門的代碼閱讀工具(Source Insight、Understand)來分析、閱讀代碼。

l 觀察數據流向

成熟的代碼通常都很復雜,考慮的事情也比較全面,所以一個函數可能有幾十行代碼。閱讀代碼的時候我們要把握數據流向,比如我們知道函數的返回值是我們關注的數據,那么我們觀察它在哪里執行了賦值語句,這樣就可以理出個主脈絡來。

l 分析總結

我喜歡用兩幅圖來表示分析代碼之后的收獲,函數調用關系圖、數據結構圖。調用關系可以從宏觀上告訴我們整個過程分成哪些步驟,步驟里面分為哪些子步驟;數據結構輔助說明了這些過程涉及到的數據操作。

l分析實戰

代碼分析

“萬物皆文件(everything is a file)”,Unix/Linux的一條著名的設計哲學。在Unix/Linux中很多硬件設備、進程運行信息、系統狀態都被映射成文件系統中的某個文件,這種設計極大的簡化了系統模型。

在Linux中每個文件都由“struct file”和“一個int類型的變量——file descriptor(文件描述符)”組成。下面通過分析Kernel代碼來剖析file descriptor的分配過程。

我們是要探究file descriptor的分配過程,問題非常明確,切入點也比較好找——什么時候執行fd的分配?答案是執行`open`函數的時候。所以我們通過查找工具定位到`open`系統調用的代碼(fs/open.c)

c3e28d06-cae8-11ed-bfe3-dac502259ad0.jpg

Linux的代碼非常清晰,open函數實際上調用的是do_sys_open。“打開文件”的過程分為:

1.分配文件描述符(fd);

2.分配struct file;

3.綁定fd和structfile。

Linux中資源分配的對象是進程,用struct task表示進程的數據結構。“文件句柄”(內核中指向某個打開文件的指針數據結構是struct file)屬于資源申請,所以按道理說Linux的struct task中應該定義一個struct file類型的數組,文件描述符則表示struct file數組中的索引

c3fa8d84-cae8-11ed-bfe3-dac502259ad0.jpg

實際上Linux2.1之前就是這么干的,但是這種實現方式有一個很明顯的缺陷——files的大小是受限的,2.1之前它是一個固定的值——256。如果要突破限制那就不能使用“固定大小數組”的數字定義files,所以在后續的版本中就把“文件句柄”拆分成立兩種內核資源——文件描述符(fd)文件對象(struct file)。(后面會放上我們分析后的數據結構圖——也是Linux正在用的數據結構)

回到我們的代碼,分配文件描述符的代碼是get_unused_fd_flags,我們跟蹤下去發現它其實是__alloc_fd函數的封裝,直接看__alloc_fd。

c40fca00-cae8-11ed-bfe3-dac502259ad0.jpg

直接讀這么一大段代碼很難理清楚頭緒,這里有個技巧推薦給大家。直接看它的返回值,它的返回值就是文件描述符,所以我們只要注意在哪里給它賦值就能理出關鍵頭緒。

__alloc_fd函數的start,end參數是指文件描述符的**可用**范圍,get_unused_fd_flags在傳遞start參數的時候是0,所以不設置下標范圍。Linux用一個位圖記錄fd的分配狀態,需要注意的是next_fd并不能直接作為fd返回,它僅僅是標識“未使用的fd中最小值”,這是為了防止位圖中“空隙”(位圖中1、2、4、5、6都是空閑的,3已經被使用了,我們搜索未使用fd的時候很顯然應該從1開始搜索。所以一定要保存這個“下標”)。

fdtable是內核中用來表示文件描述符表格的數據結構,表示fd分配狀態的位圖就是它的成員變量(full_fds_bits),max_fds記錄的是當前表格可用的最大文件描述符,這個值是可以通過expand_files增加的(如果你打開`expand_files`會發現fd最大值是不能超過`sysctl_nr_open`的,這個就是fs.nr_open的值)。

上面的代碼只是尋找可用fd而沒有修改位圖,所以代碼最后通過__set_open_fd來修改位圖。

l總結經驗

“一圖勝千言”,代碼分析是一件非常難“表達出來”的事情,如果是像上面的文字估計沒有多少人會有興趣看。所以我一般分析完代碼后畫兩張圖,一張表示數據結構關系的圖,一張表示函數調用關系的圖。

c42b91fe-cae8-11ed-bfe3-dac502259ad0.jpg

do_sys_open所做的都是為了最后執行fd_install(成功打開文件),而fd_install可以被簡化為一個簡單的賦值語句(圖中的那句賦值語句)。所以前面的get_unused_fd_flags其實是為了返回合適的fd、do_filp_open則是為struct file分配一塊內存空間。

結合數據結構圖來看

c43d295a-cae8-11ed-bfe3-dac502259ad0.jpg

get_unused_fd_flags的主要操作對象其實就是struct files_struct。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux系統
    +關注

    關注

    4

    文章

    594

    瀏覽量

    27441
  • UNIX
    +關注

    關注

    0

    文章

    296

    瀏覽量

    41503
  • sys
    sys
    +關注

    關注

    0

    文章

    9

    瀏覽量

    9170
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21672

原文標題:邢森: 淺析Linux kernel的閱讀方法

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux kernel內存管理模塊結構分析

    基于上面章節的需求,Linux kernel從虛擬內存(VM)、DMA mapping以及DMA buffer sharing三個角度,對內存進行管理.
    發表于 09-19 11:55 ?1788次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>kernel</b>內存管理模塊結構分析

    Linux Kernel核心中文手冊

    Linux Kernel核心中文手冊:Hardware Basic( 硬件基礎知識) 一個操作系統必須和作為它的基礎的硬件系統緊密配合。操作系統需要使用一些只有硬件才能提供的功能。為了完整的了解 Linux
    發表于 12-08 10:15 ?39次下載
    <b class='flag-5'>Linux</b> <b class='flag-5'>Kernel</b>核心中文手冊

    Developing Linux kernel space

    This thesis introduces how to develop kernel level device drivers on Linux platform in detail.
    發表于 08-21 10:22 ?10次下載

    linux內核kernel-api

    linux內核kernel-api,不知道從哪兒找的了,但是你如果想要做內核編程,這是一部api函數詳盡的工具書!!!五星推薦
    發表于 10-30 17:16 ?19次下載

    Linuxkernel_timer教程

    Linuxkernel_timer教程,很好的Linux自學資料,快來學習吧。
    發表于 04-15 17:59 ?12次下載

    linux kernel工作隊列及源碼解析

    1. 前言 工作隊列(workqueue)的Linux內核中的定義的用來處理不是很緊急事件的回調方式處理方法。 以下代碼的linux內核版本為2.6.19.2, 源代碼文件主要為kernel
    發表于 10-27 10:19 ?0次下載

    Linux運行期間升級Linux系 統Uboot+kernel+Rootfs

    Linux運行期間升級Linux系 統Uboot+kernel+Rootfs
    發表于 10-30 08:43 ?5次下載
    在<b class='flag-5'>Linux</b>運行期間升級<b class='flag-5'>Linux</b>系 統Uboot+<b class='flag-5'>kernel</b>+Rootfs

    Linux-kernel-3 0的移植記錄

    Linux-kernel-3 0的移植記錄
    發表于 10-31 11:33 ?7次下載
    <b class='flag-5'>Linux-kernel</b>-3 0的移植記錄

    U-boot傳遞RAM和Linux kernel讀取RAM參數的解析

    U-boot會給Linux Kernel傳遞很多參數,如:串口,RAM,videofb等。而Linux kernel也會讀取和處理這些參數。兩者之間通過struct tag來傳遞參數。
    的頭像 發表于 02-06 08:24 ?5868次閱讀
    U-boot傳遞RAM和<b class='flag-5'>Linux</b> <b class='flag-5'>kernel</b>讀取RAM參數的解析

    你知道linux kernel內存碎片防治技術?

    Linux kernel組織管理物理內存的方式是buddy system(伙伴系統),而物理內存碎片正式buddy system的弱點之一,為了預防以及解決碎片問題,kernel采取了一些實用技術,這里將對這些技術進行總結歸納。
    發表于 05-10 10:59 ?959次閱讀

    Linux Kernel 5.2.2震撼發布!

    在首個維護版本更新之后,在kernel.org官網上已經將Linux Kernel 5.2分支標記為“Stable”,意味著已經準備好大規模部署了,所有GNU/Linux發行版本都應該
    的頭像 發表于 08-09 17:01 ?2881次閱讀

    Linux Kernel 5.6-rc7候選版本發布

    在新冠病毒爆發期間,Linus Torvalds 宣布了 Linux 5.6 的第七個每周候選版本,即 Linux Kernel 5.6-rc7 的發布。
    的頭像 發表于 03-26 15:52 ?5526次閱讀

    Linux_Kernel_Developments內核開發

    Linux_Kernel_Developments內核開發詳細說明。
    發表于 04-07 14:27 ?37次下載
    <b class='flag-5'>Linux_Kernel</b>_Developments內核開發

    Linux Kernel5.10維護周期將從2年延長至6年

    經過 Linux Kernel 社區成員的共同努力,Linux Kernel 5.10 維護周期最終確定從2年延長至6年。華為是第一個在 Linux
    的頭像 發表于 05-24 13:52 ?2368次閱讀

    如何選擇合適的工具來閱讀源代碼

    在做嵌入式 Linux 軟件開發的時候,經常會閱讀大型工程源碼,比如 uboot 源代碼,Linux Kernel 源碼等。
    的頭像 發表于 03-30 14:01 ?1177次閱讀
    主站蜘蛛池模板: 手机在线看片国产日韩生活片| 一级视频免费观看| 色婷婷六月| 日日操日日射| 免费人成在线观看视频播放| 色片免费网站| 久久久黄色片| 色射啪| 日本一区二区三区在线观看视频| 国产亚洲精品aaa大片| 国产福利在线免费| 清纯唯美亚洲综合一区| 久久久久久亚洲精品| 色爱区综合激情五月综合激情 | 狠狠色噜噜| www.四虎影院.con| 国产一区二区高清| a毛片网站| 奇米精品| 黄色大片在线免费观看| 国产一区二区在线视频播放| 午夜剧场黄| 免费人成在线观看网站品爱网| 国产亚洲人成网站天堂岛| 午夜精品久久久久久久2023| 国产精品免费久久久久影院| 一区二区视屏| 亚洲人在线| 中文字幕婷婷| 三级毛片免费看| 国内精品一级毛片免费看| 中国特黄一级片| 夜夜做夜夜爽| 精品午夜视频| 日本免费不卡视频| 色网站视频| 国产99色| 婷婷在线观看香蕉五月天| 福利片在线观看免费高清| 久久国产热| 欧美一区二区在线观看视频|