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

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

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

3天內不再提示

Linux內核結構介紹

CHANBAEK ? 來源:南山府嵌入式 ? 作者:小秋秋 ? 2023-04-14 11:59 ? 次閱讀

說明

通常情況下,Linux內核的結構被認為包含以下11個主要層次:

硬件抽象層

提供了與硬件交互的接口,包括設備驅動程序和中斷控制器等。 HAL層的主要功能是隱藏硬件細節,為其他層提供一個硬件無關的接口,使內核能夠在不同的硬件平臺上運行。

系統調用接口層

提供了與用戶空間程序交互的接口,包括系統調用和進程管理等。 SCI層是內核與用戶空間之間的接口,它允許用戶空間程序向內核發出請求,以獲取系統資源或執行某些操作。

進程管理層

管理進程和線程,包括調度、同步和通信等。 PM層負責調度進程和線程的執行,控制進程之間的同步和通信,以及提供進程間共享資源的機制。

進程調度層負責管理系統中的進程,包括進程的創建、銷毀、調度等操作。 它是內核的一個核心模塊,也是系統性能的關鍵因素之一。

進程調度層的代碼位于 kernel/sched/ 目錄下,主要文件包括 sched.ctask.ccgroup_sched.c 等。

內存管理層

管理系統的物理內存和虛擬內存,包括內存分配和釋放等。 MM層的主要任務是為進程提供內存,同時保護進程的內存空間不被其他進程破壞。

它是內核的一個核心模塊,也是系統性能的關鍵因素之一。

內存管理層的代碼位于 mm/ 目錄下,主要文件包括 mmap.cpage_alloc.cvmalloc.c 等。

文件系統層

提供了對文件系統的支持,包括EXT4、FAT32等文件系統的實現。 FS層的主要功能是管理文件和目錄,提供對文件的讀寫訪問,并控制文件的權限和安全性。

文件系統層的代碼位于 fs/ 目錄下,主要文件包括 file.cnamei.csuper.c 等。

網絡

實現網絡協議棧,包括TCP/IP、UDP等協議的實現。 NET層提供了網絡通信的功能,包括數據包的發送和接收、網絡連接的管理以及網絡安全等。

網絡協議棧層的代碼位于 net/ 目錄下,主要文件包括 core.cipv4/ipv6/ 等。

設備驅動層

提供與硬件設備交互的接口,包括輸入/輸出設備驅動程序、網絡設備驅動程序等。 DD層負責將內核與硬件設備連接起來,允許內核對硬件設備進行訪問和控制。

設備驅動層的代碼位于 drivers/ 目錄下,根據設備類型的不同,代碼被組織到不同的子目錄中,例如網絡設備的驅動代碼位于 drivers/net/ 目錄下。

中斷處理層

處理硬件中斷,包括中斷的注冊、響應和處理等。 IH層負責管理中斷處理程序,確保系統能夠快速、準確地響應硬件中斷。

虛擬化層

實現虛擬化技術,包括KVM、Xen等虛擬化平臺的實現。 VIRT層提供了虛擬化的能力,允許在同一物理主機上運行多個虛擬機,并提供虛擬機管理和資源調度的功能。

虛擬化層的代碼位于 virt/ 目錄下,主要文件包括 virtio.ckvm/xen/

安全子系統層

提供了安全機制和策略的實現,包括SELinux、AppArmor等安全子系統的實現。 SEC層為內核提供了安全的保護機制,確保系統資源的安全性和機密性。

安全模塊層的代碼位于 security/ 目錄下,主要文件包括 security.ccapability.cselinux/ 等。

調試和診斷層

提供了內核調試和診斷工具的支持,包括kdump、crash等工具的實現。 D&D層為開發人員提供了內核調試和診斷的功能,以便快速識別和修復內核問題。

其實分層不一定是這樣的,因為Linux內核之間是相互交錯的,所以分層不一定,從網上也可以看到有的是分了4層,有的七層不等。 當然也可以按照模塊來分,其實都差不多,可能是我剛接觸有些還不太明白。

硬件抽象層

1// include/linux/platform_device.h
 2
 3#ifndef _LINUX_PLATFORM_DEVICE_H
 4#define _LINUX_PLATFORM_DEVICE_H
 5
 6struct resource;
 7struct platform_device_id;
 8struct device;
 9
10/**
11 * struct platform_device - platform-level device structure
12 * @name: name of device (mandatory)
13 * @id: id of the device, usually derived from ACPI or device tree
14 * @dev: associated device structure (optional)
15 * @num_resources: number of resources associated with the device
16 * @resource: resource configuration of the device
17 * @dev.parent: parent device (optional)
18 * @driver_override: driver override name (optional)
19 * @dma_mask: dma mask (optional)
20 * @coherent_dma_mask: coherent dma mask (optional)
21 * @id_entry: identity of the device (optional)
22 * @driver_data: driver specific data
23 * @fwnode: firmware node pointer for the device node
24 * @pm_domain: power management domain of the device
25 * @extcon_dev: external connector device associated with platform device
26 *
27 * NOTE: @id_entry is for the use of platform bus only; other bus types should
28 * use their own means to associate a driver with a device.
29 */
30struct platform_device {
31    const char      *name;
32    int         id;
33    struct device       dev;
34    u32         num_resources;
35    struct resource     *resource;
36    struct device_node  *of_node;
37    struct device       *parent;
38    const char      *driver_override;
39    const u64       *dma_mask;
40    const u64       *coherent_dma_mask;
41    const struct platform_device_id *id_entry;
42    void            *driver_data;
43    struct fwnode_handle    *fwnode;
44    struct pm_domain    *pm_domain;
45#ifdef CONFIG_EXTCON
46    struct extcon_dev   *extcon_dev;
47#endif
48};
49
50/**
51 * platform_device_register() - register a platform-level device
52 * @pdev: platform-level device structure to register
53 *
54 * This function registers a platform-level device with the kernel. The device
55 * will be bound to an appropriate driver if one is available.
56 *
57 * Return: 0 on success, error code on failure.
58 */
59int platform_device_register(struct platform_device *pdev);
60
61/**
62 * platform_device_unregister() - unregister a platform-level device
63 * @pdev: platform-level device structure to unregister
64 *
65 * This function unregisters a platform-level device from the kernel. If the
66 * device was bound to a driver, the driver will be unbound from the device.
67 */
68void platform_device_unregister(struct platform_device *pdev);
69
70#endif /* _LINUX_PLATFORM_DEVICE_H */

設備驅動層

1// include/linux/device.h
 2
 3/**
 4 * struct device_driver - The basic device driver structure
 5 * @name:    Name of the device driver
 6 * @bus:    Type of bus device is on
 7 * @owner:    Module owner
 8 * @mod_name:    Used for built-in modules
 9 * @probe:    Initializes a given device
10 * @remove:    Reverses the effect of probe
11 * @shutdown:    Tear down a device prior to system shutdown
12 * @suspend:    Prepares a device for power saving mode
13 * @resume:    Wake up a device from power saving mode
14 * @groups:    Optional sysfs attribute groups
15 * @of_match_table: Matching table for OF devices
16 * @acpi_match_table: Matching table for ACPI devices
17 * @pm:        Device power management operations
18 * @probe_type: Type of probe to be used
19 * @suppress_bind_attrs: Suppress the binding/unbinding attributes
20 * @driverfs_dev: Optional driverfs device link
21 * @percpu_ref: Optional percpu reference count
22 * @p: private driver data (of the driver core)
23 * @fwnode: firmware node pointer for the device node
24 * @legacy: if true, a driver bound by OF style match will match legacy platform devices
25 * @no_driver_policy: policy for devices with missing driver
26 * @bus_rescan_devices: pointer to bus specific rescan devices function
27 * @dev_groups: Optional device specific sysfs attribute groups
28 * @sriov_configure: Optional callback for SR-IOV PF driver to configure VFs
29 * @coherent_dma_masks: Optional list of DMA masks this driver supports.
30 *                      The list should be terminated with a mask of 0.
31 *                      If the driver sets a dma_mask, it should be
32 *                      included in this list.
33 */
34struct device_driver {
35    const char *name;
36    struct bus_type *bus;
37    struct module *owner;
38    const char *mod_name;   /* used for built-in modules */
39    const struct of_device_id *of_match_table;
40    const struct acpi_device_id *acpi_match_table;
41    int (*probe) (struct device *dev);
42    int (*remove) (struct device *dev);
43    void (*shutdown) (struct device *dev);
44    int (*suspend) (struct device *dev, pm_message_t state);
45    int (*resume) (struct device *dev);
46    const struct attribute_group **groups;
47    const struct dev_pm_ops *pm;
48
49    /* Set of flags used to determine driver state */
50    unsigned int driver_features;
51    enum probe_type probe_type:2;
52    unsigned int suppress_bind_attrs:1;
53    struct driver_private *p;
54
55    /* For driver core */
56    struct device_driver *next;
57    struct driver_attribute *dyn_attrs;
58#ifdef CONFIG_SYSFS
59    struct kobject kobj;
60#endif
61#ifdef CONFIG_DEBUG_DRIVER
62    unsigned long _priv[4];
63#endif
64    struct fwnode_handle *fwnode;
65    unsigned int legacy:1;
66    enum no_driver_policy no_driver_policy:2;
67    void (*bus_rescan_devices)(struct device_driver *drv);
68    const struct attribute_group **dev_groups;
69
70#ifdef CONFIG_PCI_IOV
71    int (*sriov_configure)(struct pci_dev *dev, int num_vfs);
72#endif
73    const u64 *coherent_dma_masks;
74};
75
76/**
77 * driver_register - register a device driver with the system.
78 * @drv: driver structure
79 *
80 * Returns zero on success, or a negative error code.
81 */
82int driver_register(struct device_driver *drv);
83
84/**
85 * driver_unregister - unregister a driver from the driver core.
86 * @drv: driver structure to unregister
87 */
88void driver_unregister(struct device_driver *drv);
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1372

    瀏覽量

    40291
  • 接口
    +關注

    關注

    33

    文章

    8598

    瀏覽量

    151164
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209521
  • 文件
    +關注

    關注

    1

    文章

    566

    瀏覽量

    24746
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19684
收藏 人收藏

    評論

    相關推薦

    Linux內核開發工具介紹

    進行嵌入式Linux產品開發,往往需要對內核進行裁剪和定制,以滿足嵌入式產品的功能和性能需求。本文介紹幾種閱讀Linux內核源碼的工具和方法
    發表于 12-29 15:20 ?4710次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>開發工具<b class='flag-5'>介紹</b>

    一文詳解Linux內核源碼組織結構

    概要:本文內容包含Linux源碼樹結構分析、Linux Makefile分析、Kconfig文件分析、Linux內核配置選項分析。這些知識是
    的頭像 發表于 05-10 19:28 ?5765次閱讀

    Linux內核結構詳解

    ,打印警告或錯誤信息的過程,還有系統的調試例程等等。系統數據結構linux內核的實現中,有一些數據結構使用頻度較高,他們是:task_struct.
    發表于 07-11 16:59

    Linux內核源碼目錄結構

    Linux體系結構Linux內核結構Linux內核
    發表于 12-30 07:22

    linux 5.4.31為例來介紹一下linux內核目錄結構

    ,它是Linux內核的概述和編譯命令說明。readme的說明更加針對X86等通用的平臺,對于某些特殊的體系結構,可能有些特殊的地方。內核源碼很復雜,包含多級目錄,形成一個龐大的樹狀
    發表于 02-16 07:30

    Linux內核教程

    本章學習目標掌握LINUX內核版本的含義理解并掌握進程的概念掌握管道的概念及實現了解內核的數據結構了解LINUX
    發表于 04-10 16:59 ?0次下載

    Linux內核學習起步課件

    Linux內核學習起步介紹
    發表于 04-10 17:22 ?0次下載

    Linux 內核數據結構:位圖(Bitmap)

    除了各種鏈式和樹形數據結構Linux內核還提供了位圖接口。位圖在Linux內核中大量使用。下面的源代碼文件包含這些
    發表于 05-14 17:24 ?3484次閱讀

    你知道Linux內核數據結構中雙向鏈表的作用?

    Linux 內核提供一套雙向鏈表的實現,你可以在 include/linux/list.h 中找到。我們以雙向鏈表著手開始介紹 Linux
    發表于 05-14 17:27 ?1877次閱讀

    如何使用Linux內核實現USB驅動程序框架

    Linux內核提供了完整的USB驅動程序框架。USB總線采用樹形結構,在一條總線上只能有唯一的主機設備。 Linux內核從主機和設備兩個角度
    發表于 11-06 17:59 ?20次下載
    如何使用<b class='flag-5'>Linux</b><b class='flag-5'>內核</b>實現USB驅動程序框架

    Linux內核結構詳細說明

    Linux內核結構Linux內核主要由五個子系統組成:進程調度,內存管理,虛擬文件系統,網絡接口,進程間通信。1進程調度( SCHED):控
    發表于 11-10 17:35 ?16次下載

    STM32MP157 Linux系統移植開發篇7:Linux內核目錄結構詳解

    ,它是Linux內核的概述和編譯命令說明。readme的說明更加針對X86等通用的平臺,對于某些特殊的體系結構,可能有些特殊的地方。內核源碼很復雜,包含多級目錄,形成一個龐大的樹狀
    發表于 12-17 18:29 ?10次下載
    STM32MP157 <b class='flag-5'>Linux</b>系統移植開發篇7:<b class='flag-5'>Linux</b><b class='flag-5'>內核</b>目錄<b class='flag-5'>結構</b>詳解

    Linux內核的鏈表數據結構

    Linux內核實現了自己的鏈表數據結構,它的設計與傳統的方式不同,非常巧妙也很通用。
    的頭像 發表于 03-24 11:34 ?839次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>的鏈表數據<b class='flag-5'>結構</b>

    Linux內核如何使用結構體和函數指針?

    我將結合具體的Linux內核驅動框架代碼來展示Linux內核如何使用結構體和函數指針。
    的頭像 發表于 09-06 14:17 ?1025次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>如何使用<b class='flag-5'>結構</b>體和函數指針?

    Linux內核中使用的數據結構

    Linux內核代碼中廣泛使用了數據結構和算法,其中最常用的兩個是鏈表和紅黑樹。 鏈表 Linux內核代碼大量使用了鏈表這種數據
    的頭像 發表于 11-09 14:24 ?491次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中使用的數據<b class='flag-5'>結構</b>
    主站蜘蛛池模板: 天天插插| 国产精品视频久久久久| 免费视频在线观看1| 亚洲人成伊人成综合网久久| 琪琪午夜免费影院在线观看| 91久久婷婷国产综合精品青草| 粉嫩尤物在线456| 亚洲欧美视频在线| 国产一级一片免费播放视频| 加勒比精品视频| 一级国产特黄aa大片| 国产手机免费视频| 67194最新网址| 四虎影院欧美| 亚洲爱爱图| 午夜三级在线| 淫五月| 久久精品福利| 正在播放91大神调教偷偷| 精品一区二区三区免费爱| 黄录像欧美片在线观看| 一个色亚洲| 97综合| 特大一级aaaaa毛片| 美国色网站| 极品丰满翘臀后进啪啪| 亚洲第8页| 亚洲色图17p| 热re99久久国产精品| 久久九九国产精品怡红院| 国产精品一区牛牛影视| 四虎4hu永久在线观看| 天天做天天做天天综合网| 久久99热精品免费观看无卡顿| 韩国三级理在线视频观看 | 亚洲午夜综合网| 亚洲专区一路线二| 激情有码| 8844aa在线毛片| 久久人人精品| 免费午夜影片在线观看影院|