Jadual Kandungan
container_of principle " >container_of principle
驱动中的实际例子 " >驱动中的实际例子
Rumah Operasi dan penyelenggaraan operasi dan penyelenggaraan linux Asas kernel Linux - bekas_prinsip dan aplikasi praktikal

Asas kernel Linux - bekas_prinsip dan aplikasi praktikal

Jul 31, 2023 pm 03:46 PM
linux container communication

sering dilihat dalam kernel Linux , 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96); ">bekas angka, ia juga digunakan secara meluas dalam penulisan pemandu sebenar. container_of的身影,它在实际驱动的编写中也是广泛应用。

container_of原理

作用:通过结构体的某个成员变量地址找到该结构体的首地址

定义如下:

/**
 * container_of - cast a member of a structure out to the containing structure
 * @ptr:    the pointer to the member.
 * @type:   the type of the container struct this is embedded in.
 * @member: the name of the member within the struct.
 *
 */
#define container_of(ptr, type, member) ({          \
    const typeof( ((type *)0)->member ) *__mptr = (ptr); \
    (type *)( (char *)__mptr - offsetof(type,member) );})
Salin selepas log masuk
  • ptr:结构体成员变量的指针
  • type:结构体类型
  • member:结构体成员变量的名字

换句话说,叫:已知结构体type的成员member的地址ptr,求解结构体type

container_of principle

Fungsi

: melalui struktur A< strong>alamat pembolehubah ahli 🎜 mencari alamat pertama 🎜 struktur. 🎜🎜Ia ditakrifkan seperti berikut: 🎜
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
Salin selepas log masuk
Salin selepas log masuk
  • ptr: penunjuk kepada pembolehubah ahli struktur
  • < section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">type: structure type
  • ahli: nama pembolehubah ahli struktur
  • 🎜Dalam erti kata lain, ia dipanggil: < struktur kuat>sudah diketahuiAhli jenis< gaya kod ="font-size: 14px; padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font- keluarga: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">alamatahli ptr, selesaikan struktur< gaya kod= "font-size: 14px; padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font- keluarga: " Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">taipalamat mula 🎜. 🎜

    计算公式为:type的起始地址 = ptr -saiz (saiz为ahli的大小)type的起始地址 = ptr -size (size为member的大小)

    以一幅图说明ptrtypemember的关系:

    Asas kernel Linux - bekas_prinsip dan aplikasi praktikal
    • 原理简述:

    container_of的妙处就在于0作为成员变量member的基址

    其中定义了一个中间变量__mptr,"__"代表内部使用,“m”代表middle

    以一幅图说明ptr、< code style="font-size: 14px; padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font- keluarga: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">type、ahli的关系:🎜
    Asas kernel Linux - bekas_prinsip dan aplikasi praktikal
    • 原理简述:
    🎜bekas的妙处就在于🎜以0作为成员变量ahli的基址
    。🎜🎜其中定义了一个中间变量__mptr,"__"代表内部使用,“m”代表mid 。🎜
    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
    Salin selepas log masuk
    Salin selepas log masuk

    typeof( ((type *)0)->member )是获取member的类型,__mptr = (ptr)判断ptrmember是否为同一类型,offsetof计算成员member的大小size

    驱动中的实际例子

    例如内核的pwm驱动,通过成员变量chip,找到结构体bcm2835_pwm

    struct bcm2835_pwm {
     struct pwm_chip chip;
     struct device *dev;
     void __iomem *base;
     struct clk *clk;
    };
    
    static inline struct bcm2835_pwm *to_bcm2835_pwm(struct pwm_chip *chip_ptr)
    {
     return container_of(chip_ptr, struct bcm2835_pwm, chip);
    }
    Salin selepas log masuk

    使用container_of通常都会定义一个函数,并且命名为to_xxx或者to_find_xxx,代表要找xxx这个结构体,传参则传入成员变量指针,另外函数也会声明为inline

    Atas ialah kandungan terperinci Asas kernel Linux - bekas_prinsip dan aplikasi praktikal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    AI Hentai Generator

    AI Hentai Generator

    Menjana ai hentai secara percuma.

    Artikel Panas

    R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
    3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Tetapan grafik terbaik
    3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
    3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Cara Membuka Segala -galanya Di Myrise
    4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

    Alat panas

    Notepad++7.3.1

    Notepad++7.3.1

    Editor kod yang mudah digunakan dan percuma

    SublimeText3 versi Cina

    SublimeText3 versi Cina

    Versi Cina, sangat mudah digunakan

    Hantar Studio 13.0.1

    Hantar Studio 13.0.1

    Persekitaran pembangunan bersepadu PHP yang berkuasa

    Dreamweaver CS6

    Dreamweaver CS6

    Alat pembangunan web visual

    SublimeText3 versi Mac

    SublimeText3 versi Mac

    Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

    Tidak dapat log masuk ke mysql sebagai akar Tidak dapat log masuk ke mysql sebagai akar Apr 08, 2025 pm 04:54 PM

    Sebab utama mengapa anda tidak boleh log masuk ke MySQL sebagai akar adalah masalah kebenaran, ralat fail konfigurasi, kata laluan tidak konsisten, masalah fail soket, atau pemintasan firewall. Penyelesaiannya termasuk: periksa sama ada parameter pengikat di dalam fail konfigurasi dikonfigurasi dengan betul. Semak sama ada kebenaran pengguna root telah diubahsuai atau dipadam dan ditetapkan semula. Sahkan bahawa kata laluan adalah tepat, termasuk kes dan aksara khas. Semak tetapan dan laluan kebenaran fail soket. Semak bahawa firewall menyekat sambungan ke pelayan MySQL.

    C Language Compilation Compilation: Panduan terperinci untuk pemula ke aplikasi praktikal C Language Compilation Compilation: Panduan terperinci untuk pemula ke aplikasi praktikal Apr 04, 2025 am 10:48 AM

    C Language Conditional Compilation adalah mekanisme untuk selektif menyusun blok kod berdasarkan keadaan kompilasi masa. Kaedah pengenalan termasuk: menggunakan arahan #if dan #Else untuk memilih blok kod berdasarkan syarat. Ekspresi bersyarat yang biasa digunakan termasuk STDC, _WIN32 dan LINUX. Kes praktikal: Cetak mesej yang berbeza mengikut sistem operasi. Gunakan jenis data yang berbeza mengikut bilangan digit sistem. Fail header yang berbeza disokong mengikut pengkompil. Penyusunan bersyarat meningkatkan kebolehgunaan dan fleksibiliti kod, menjadikannya boleh disesuaikan dengan pengkompil, sistem operasi, dan perubahan seni bina CPU.

    【Rust Sendiri belajar】 Pengenalan 【Rust Sendiri belajar】 Pengenalan Apr 04, 2025 am 08:03 AM

    1.0.1 Preface Projek ini (termasuk kod dan komen) telah direkodkan semasa karat saya yang diajar sendiri. Mungkin ada kenyataan yang tidak tepat atau tidak jelas, sila minta maaf. Jika anda mendapat manfaat daripadanya, ia lebih baik. 1.0.2 Mengapa Rustrust boleh dipercayai dan cekap? Karat boleh menggantikan C dan C, dengan prestasi yang sama tetapi keselamatan yang lebih tinggi, dan tidak memerlukan rekompilasi yang kerap untuk memeriksa kesilapan seperti C dan C. Kelebihan utama termasuk: Keselamatan Memori (mencegah penunjuk null dari dereferences, penunjuk menggantung, dan perbalahan data). Thread-safe (pastikan kod multi-threaded selamat sebelum pelaksanaan). Elakkan tingkah laku yang tidak ditentukan (mis., Arus dari batas, pembolehubah yang tidak diinisialisasi, atau akses kepada memori yang dibebaskan). Karat menyediakan ciri bahasa moden seperti generik

    Apakah 5 komponen asas Linux? Apakah 5 komponen asas Linux? Apr 06, 2025 am 12:05 AM

    Lima komponen asas Linux adalah: 1. Kernel, menguruskan sumber perkakasan; 2. Perpustakaan sistem, menyediakan fungsi dan perkhidmatan; 3. Shell, antara muka pengguna untuk berinteraksi dengan sistem; 4. Sistem fail, menyimpan dan menganjurkan data; 5. Aplikasi, menggunakan sumber sistem untuk melaksanakan fungsi.

    Cara menyelesaikan MySQL tidak dapat dimulakan Cara menyelesaikan MySQL tidak dapat dimulakan Apr 08, 2025 pm 02:21 PM

    Terdapat banyak sebab mengapa permulaan MySQL gagal, dan ia boleh didiagnosis dengan memeriksa log ralat. Penyebab umum termasuk konflik pelabuhan (periksa penghunian pelabuhan dan ubah suai konfigurasi), isu kebenaran (periksa keizinan pengguna yang menjalankan perkhidmatan), ralat fail konfigurasi (periksa tetapan parameter), rasuah direktori data (memulihkan data atau membina semula ruang meja), isu ruang jadual InnoDB (semak fail ibdata1) Apabila menyelesaikan masalah, anda harus menganalisisnya berdasarkan log ralat, cari punca utama masalah, dan mengembangkan tabiat sandaran data secara teratur untuk mencegah dan menyelesaikan masalah.

    Di manakah perpustakaan fungsi bahasa C? Bagaimana untuk menambah perpustakaan fungsi bahasa C? Di manakah perpustakaan fungsi bahasa C? Bagaimana untuk menambah perpustakaan fungsi bahasa C? Apr 03, 2025 pm 11:39 PM

    Perpustakaan Fungsi Bahasa C adalah kotak alat yang mengandungi pelbagai fungsi, yang dianjurkan dalam fail perpustakaan yang berbeza. Menambah perpustakaan memerlukan menyatakannya melalui pilihan baris perintah pengkompil, contohnya, pengkompil GCC menggunakan pilihan -L diikuti dengan singkatan nama perpustakaan. Jika fail perpustakaan tidak berada di bawah laluan carian lalai, anda perlu menggunakan pilihan -L untuk menentukan laluan fail perpustakaan. Perpustakaan boleh dibahagikan kepada perpustakaan statik dan perpustakaan dinamik. Perpustakaan statik secara langsung dikaitkan dengan program pada masa kompilasi, manakala perpustakaan dinamik dimuatkan semasa runtime.

    Penyelesaian kepada kesilapan yang dilaporkan oleh MySQL pada versi sistem tertentu Penyelesaian kepada kesilapan yang dilaporkan oleh MySQL pada versi sistem tertentu Apr 08, 2025 am 11:54 AM

    Penyelesaian kepada ralat pemasangan MySQL adalah: 1. Berhati -hati memeriksa persekitaran sistem untuk memastikan keperluan perpustakaan ketergantungan MySQL dipenuhi. Sistem operasi dan keperluan versi yang berbeza adalah berbeza; 2. Berhati -hati membaca mesej ralat dan mengambil langkah -langkah yang sepadan mengikut arahan (seperti fail perpustakaan yang hilang atau kebenaran yang tidak mencukupi), seperti memasang kebergantungan atau menggunakan arahan sudo; 3 Jika perlu, cuba pasang kod sumber dan periksa dengan teliti log kompilasi, tetapi ini memerlukan pengetahuan dan pengalaman Linux tertentu. Kunci untuk menyelesaikan masalah akhirnya adalah dengan teliti memeriksa persekitaran sistem dan maklumat ralat, dan merujuk kepada dokumen rasmi.

    Bolehkah mysql berjalan di Android Bolehkah mysql berjalan di Android Apr 08, 2025 pm 05:03 PM

    MySQL tidak boleh berjalan secara langsung di Android, tetapi ia boleh dilaksanakan secara tidak langsung dengan menggunakan kaedah berikut: menggunakan pangkalan data ringan SQLite, yang dibina di atas sistem Android, tidak memerlukan pelayan yang berasingan, dan mempunyai penggunaan sumber kecil, yang sangat sesuai untuk aplikasi peranti mudah alih. Sambungkan jauh ke pelayan MySQL dan sambungkan ke pangkalan data MySQL pada pelayan jauh melalui rangkaian untuk membaca dan menulis data, tetapi terdapat kelemahan seperti kebergantungan rangkaian yang kuat, isu keselamatan dan kos pelayan.

    See all articles