Linux Device Drivers (3rd Edition) [Electronic resources] نسخه متنی

اینجــــا یک کتابخانه دیجیتالی است

با بیش از 100000 منبع الکترونیکی رایگان به زبان فارسی ، عربی و انگلیسی

Linux Device Drivers (3rd Edition) [Electronic resources] - نسخه متنی

Jonathan Corbet, Greg Kroah-Hartman, Alessandro Rubini

| نمايش فراداده ، افزودن یک نقد و بررسی
افزودن به کتابخانه شخصی
ارسال به دوستان
جستجو در متن کتاب
بیشتر
تنظیمات قلم

فونت

اندازه قلم

+ - پیش فرض

حالت نمایش

روز نیمروز شب
جستجو در لغت نامه
بیشتر
لیست موضوعات
توضیحات
افزودن یادداشت جدید








11.2. Assigning an Explicit Size to Data Items


Sometimes kernel code

requires
data items of a specific size, perhaps to match predefined binary
structures,[1] to communicate with user space, or to
align data within structures by inserting
"padding" fields (but refer to the
Section 11.4.4 for information about alignment
issues).

[1] This happens when reading partition
tables, when executing a binary file, or when decoding a network
packet.


The kernel offers the following data types to use whenever you need
to know the size of your data. All the types are declared in
<asm/types.h>, which, in turn, is included
by <linux/types.h>:

u8;   /* unsigned byte (8 bits) */
u16; /* unsigned word (16 bits) */
u32; /* unsigned 32-bit value */
u64; /* unsigned 64-bit value */

The corresponding signed types exist, but
are rarely needed; just replace u with
s in the name if you need them.

If a user-space program needs to use
these types, it can prefix the names with a double underscore:
_ _u8 and the other types are defined independent
of _ _KERNEL_ _. If, for example, a driver needs
to exchange binary structures with a program running in user space by
means of ioctl, the header files should declare
32-bit fields in the structures as _ _u32.


It's
important to remember that these types are Linux specific, and using
them hinders porting software to other Unix flavors. Systems with
recent compilers support the C99-standard types, such as
uint8_t and uint32_t; if
portability is a concern, those types can be used in favor of the
Linux-specific variety.

You might also note that sometimes the kernel uses conventional
types, such as unsigned int, for items whose
dimension is architecture independent. This is usually done for
backward compatibility. When u32 and friends were
introduced in Version 1.1.67, the developers
couldn't change existing data structures to the new
types because the compiler issues a warning when there is a type
mismatch between the structure field and the value being assigned to
it.[2] Linus
didn't expect the operating system (OS) he wrote for
his own use to become multiplatform; as a result, old structures are
sometimes loosely typed.

[2] As a matter of fact, the compiler signals type
inconsistencies even if the two types are just different names for
the same object, such as unsigned long and
u32 on the PC.



    / 202