Common Linux Data Types

Source: Internet
Author: User

 

When the Linux kernel is transplanted between platforms with large differences in architecture, problems related to data types will occur. Use the-wall-wstrict-prototypes option when compiling the kernel to avoid many errors.

The kernel uses the following basic data types:

ØØ int Standard C language Integer type;

ØØ u32 32-bit integer type;

ØØ pid_t specifies the PID type of the kernel object.

The data types in C Language occupy different spaces in different CPU architectures. Below is the number of bytes of the Data Type in x86:

Arch

Char

Short

Int

Long

PTR

Long-long

U8

2010.cn

U32

U64

I686

1

2

4

4

4

8

1

2

4

8

Below are the bytes of data types on other platforms:

Arch

Char

Short

Int

Long

PTR

Long-long

U8

2010.cn

U32

U64

I386

1

2

4

4

4

8

1

2

4

8

Alpha

1

2

4

8

8

8

1

2

4

8

Armv4l

1

2

4

4

4

8

1

2

4

8

IA64

1

2

4

8

8

8

1

2

4

8

M68k

1

2

4

4

4

8

1

2

4

8

MIPs

1

2

4

4

4

8

1

2

4

8

PPC

1

2

4

4

4

8

1

2

4

8

ISCSI

1

2

4

4

4

8

1

2

4

8

Sparc64

1

2

4

4

4

8

1

2

4

8

The sparc64-based Linux user space can run 32-bit code. The user space pointer is 32-bit wide, but the kernel space is 64-bit.

The address in the kernel is of the unsigned long type, and the pointer size is the same as that of the long type.

The kernel provides the following data types. All types are declared in the header file <include/ASM/types. h>. This file is included in the header file <Linux/types. h>. The following is an Include/ASM/types. h file. This is some definition of the/ASM/types. h file in the ARM architecture: Because I configured the ARM architecture.

#ifndef __ASM_ARM_TYPES_H
#define __ASM_ARM_TYPES_H

#ifndef __ASSEMBLY__

typedef unsigned short umode_t;

/*
 * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
 * header files exported to user space
 */

typedef __signed__ char __s8;
typedef unsigned char __u8;

typedef __signed__ short __s16;
typedef unsigned short __u16;

typedef __signed__ int __s32;
typedef unsigned int __u32;

#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
typedef __signed__ long long __s64;
typedef unsigned long long __u64;
#endif

#endif /* __ASSEMBLY__ */

/*
 * These aren't exported outside the kernel to avoid name space clashes
 */
#ifdef __KERNEL__

#define BITS_PER_LONG 32

#ifndef __ASSEMBLY__

typedef signed char s8;
typedef unsigned char u8;

typedef signed short s16;
typedef unsigned short u16;

typedef signed int s32;
typedef unsigned int u32;

typedef signed long long s64;
typedef unsigned long long u64;

/* Dma addresses are 32-bits wide. */

typedef u32 dma_addr_t;
typedef u32 dma64_addr_t;

#endif /* __ASSEMBLY__ */

#endif /* __KERNEL__ */

#endif

 

The prefix type is used to expose variables to user space, such as _ u8. For example, if a driver exchanges data with a program running in the user space through the ioctl function, _ u32 should be used to declare a 32-bit data type.

Sometimes the kernel uses the C language type, such as unsigned int, which is usually used for data items with a size independent of the architecture. Many data types in the kernel are declared by typedef, which facilitates transplantation. For example, if the pid_t type is used as the PID type, rather than the int type, pid_t shields the actual data types on different platforms.

If it is not easy to select an appropriate type, it will be forcibly converted to the most possible type (long or unsigned long ).

As mentioned above, in <include/Linux/types. h>, define the type defined in the architecture you configured

<Include/ASM/types. h>: paste the <include/Linux/types. h> file, whose kernel version is 2.6.16.28.

 

#ifndef _LINUX_TYPES_H
#define _LINUX_TYPES_H

#ifdef    __KERNEL__
#include <linux/config.h>

#define BITS_TO_LONGS(bits) \
    (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
#define DECLARE_BITMAP(name,bits) \
    unsigned long name[BITS_TO_LONGS(bits)]

#define BITS_PER_BYTE 8
#endif

#include <linux/posix_types.h>
#include <asm/types.h>

#ifndef __KERNEL_STRICT_NAMES

typedef __u32 __kernel_dev_t;

typedef __kernel_fd_set        fd_set;
typedef __kernel_dev_t        dev_t;
typedef __kernel_ino_t        ino_t;
typedef __kernel_mode_t        mode_t;
typedef __kernel_nlink_t    nlink_t;
typedef __kernel_off_t        off_t;
typedef __kernel_pid_t        pid_t;
typedef __kernel_daddr_t    daddr_t;
typedef __kernel_key_t        key_t;
typedef __kernel_suseconds_t    suseconds_t;
typedef __kernel_timer_t    timer_t;
typedef __kernel_clockid_t    clockid_t;
typedef __kernel_mqd_t        mqd_t;

#ifdef __KERNEL__
typedef __kernel_uid32_t    uid_t;
typedef __kernel_gid32_t    gid_t;
typedef __kernel_uid16_t uid16_t;
typedef __kernel_gid16_t gid16_t;

#ifdef CONFIG_UID16
/* This is defined by include/asm-{arch}/posix_types.h */
typedef __kernel_old_uid_t    old_uid_t;
typedef __kernel_old_gid_t    old_gid_t;
#endif /* CONFIG_UID16 */

/* libc5 includes this file to define uid_t, thus uid_t can never change
 * when it is included by non-kernel code
 */
#else
typedef __kernel_uid_t        uid_t;
typedef __kernel_gid_t        gid_t;
#endif /* __KERNEL__ */

#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
typedef __kernel_loff_t        loff_t;
#endif

/*
 * The following typedefs are also protected by individual ifdefs for
 * historical reasons:
 */
#ifndef _SIZE_T
#define _SIZE_T
typedef __kernel_size_t        size_t;
#endif

#ifndef _SSIZE_T
#define _SSIZE_T
typedef __kernel_ssize_t    ssize_t;
#endif

#ifndef _PTRDIFF_T
#define _PTRDIFF_T
typedef __kernel_ptrdiff_t    ptrdiff_t;
#endif

#ifndef _TIME_T
#define _TIME_T
typedef __kernel_time_t        time_t;
#endif

#ifndef _CLOCK_T
#define _CLOCK_T
typedef __kernel_clock_t    clock_t;
#endif

#ifndef _CADDR_T
#define _CADDR_T
typedef __kernel_caddr_t    caddr_t;
#endif

/* bsd */
typedef unsigned char        u_char;
typedef unsigned short        u_short;
typedef unsigned int        u_int;
typedef unsigned long        u_long;

/* sysv */
typedef unsigned char        unchar;
typedef unsigned short        ushort;
typedef unsigned int        uint;
typedef unsigned long        ulong;

#ifndef __BIT_TYPES_DEFINED__
#define __BIT_TYPES_DEFINED__

typedef        __u8        u_int8_t;
typedef        __s8        int8_t;
typedef        __u16        u_int16_t;
typedef        __s16        int16_t;
typedef        __u32        u_int32_t;
typedef        __s32        int32_t;

#endif /* !(__BIT_TYPES_DEFINED__) */

typedef        __u8        uint8_t;
typedef        __u16        uint16_t;
typedef        __u32        uint32_t;

#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
typedef        __u64        uint64_t;
typedef        __u64        u_int64_t;
typedef        __s64        int64_t;
#endif

/* this is a special 64bit data type that is 8-byte aligned */
#define aligned_u64 unsigned long long __attribute__((aligned(8)))

/*
 * The type used for indexing onto a disc or disc partition.
 * If required, asm/types.h can override it and define
 * HAVE_SECTOR_T
 */
#ifndef HAVE_SECTOR_T
typedef unsigned long sector_t;
#endif

/*
 * The type of an index into the pagecache. Use a #define so asm/types.h
 * can override it.
 */
#ifndef pgoff_t
#define pgoff_t unsigned long
#endif

#endif /* __KERNEL_STRICT_NAMES */

/*
 * Below are truly Linux-specific types that should never collide with
 * any application/library that wants linux/types.h.
 */

#ifdef __CHECKER__
#define __bitwise__ __attribute__((bitwise))
#else
#define __bitwise__
#endif
#ifdef __CHECK_ENDIAN__
#define __bitwise __bitwise__
#else
#define __bitwise
#endif

typedef __u16 __bitwise __le16;
typedef __u16 __bitwise __be16;
typedef __u32 __bitwise __le32;
typedef __u32 __bitwise __be32;
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
typedef __u64 __bitwise __le64;
typedef __u64 __bitwise __be64;
#endif

#ifdef __KERNEL__
typedef unsigned __bitwise__ gfp_t;
#endif

struct ustat {
    __kernel_daddr_t    f_tfree;
    __kernel_ino_t        f_tinode;
    char            f_fname[6];
    char            f_fpack[6];
};

#endif /* _LINUX_TYPES_H */

 

Here I can see some custom types, such as loff_t and size_t.

Typedef _ kernel_uid_t uid_t;
Typedef _ kernel_gid_t gid_t;

Typedef _ kernel_loff_t loff_t;

In this way, the loff_t type is defined as _ kernel_loff_t, And the uid_t type is defined as _ kernel_uid_t, but now the _ kernel_loff_t _ kernel_uid_t type is obviously related to the architecture. For the ARM architecture, it is defined in <include/ASM-arm/posix_types.h>, the Code is as follows:

 

/*
 * linux/include/asm-arm/posix_types.h
 *
 * Copyright (C) 1996-1998 Russell King.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * Changelog:
 * 27-06-1996    RMK    Created
 */
#ifndef __ARCH_ARM_POSIX_TYPES_H
#define __ARCH_ARM_POSIX_TYPES_H

/*
 * This file is generally used by user-level software, so you need to
 * be a little careful about namespace pollution etc. Also, we cannot
 * assume GCC is being used.
 */

typedef unsigned long        __kernel_ino_t;
typedef unsigned short        __kernel_mode_t;
typedef unsigned short        __kernel_nlink_t;
typedef long            __kernel_off_t;
typedef int            __kernel_pid_t;
typedef unsigned short        __kernel_ipc_pid_t;
typedef unsigned short        __kernel_uid_t;
typedef unsigned short        __kernel_gid_t;
typedef unsigned int        __kernel_size_t;
typedef int            __kernel_ssize_t;
typedef int            __kernel_ptrdiff_t;
typedef long            __kernel_time_t;
typedef long            __kernel_suseconds_t;
typedef long            __kernel_clock_t;
typedef int            __kernel_timer_t;
typedef int            __kernel_clockid_t;
typedef int            __kernel_daddr_t;
typedef char *            __kernel_caddr_t;
typedef unsigned short        __kernel_uid16_t;
typedef unsigned short        __kernel_gid16_t;
typedef unsigned int        __kernel_uid32_t;
typedef unsigned int        __kernel_gid32_t;

typedef unsigned short        __kernel_old_uid_t;
typedef unsigned short        __kernel_old_gid_t;
typedef unsigned short        __kernel_old_dev_t;

#ifdef __GNUC__
typedef long long        __kernel_loff_t;
#endif

typedef struct {
#if defined(__KERNEL__) || defined(__USE_ALL)
    int    val[2];
#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */
    int    __val[2];
#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */
} __kernel_fsid_t;

#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)

#undef    __FD_SET
#define __FD_SET(fd, fdsetp) \
        (((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] |= (1<<((fd) & 31)))

#undef    __FD_CLR
#define __FD_CLR(fd, fdsetp) \
        (((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] &= ~(1<<((fd) & 31)))

#undef    __FD_ISSET
#define __FD_ISSET(fd, fdsetp) \
        ((((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] & (1<<((fd) & 31))) != 0)

#undef    __FD_ZERO
#define __FD_ZERO(fdsetp) \
        (memset (fdsetp, 0, sizeof (*(fd_set *)(fdsetp))))

#endif

#endif

 

Now, you can see that the parameter types of some functions in the kernel are loff_t and ssize_t! Haha.

However, I also found a very good website. You can enter a Linux parameter or data type to query internal data types.

Http://www.gelato.unsw.edu.au/lxr/ident? I = loff_t

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.