Удаление отступов из структуры в модуле ядра - PullRequest
1 голос
/ 04 мая 2010

Я собираю модуль ядра, содержащий структуру размером 34, используя стандартную команду.

make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

sizeof(some_structure) приходит как 36 вместо 34, то есть компилятор дополняет структуру.

Как мне удалить этот отступ?

Запуск make V=1 показывает параметры компилятора gcc, переданные как

make -I../inc -C /lib/modules/2.6.29.4-167.fc11.i686.PAE/build M=/home/vishal/20100426_eth_vishal/organised_eth/src modules

make[1]: Entering directory `/usr/src/kernels/2.6.29.4-167.fc11.i686.PAE'
test -e include/linux/autoconf.h -a -e include/config/auto.conf || (  \
 echo;        \
 echo "  ERROR: Kernel configuration is invalid.";  \
 echo "         include/linux/autoconf.h or include/config/auto.conf are missing."; \
 echo "         Run 'make oldconfig && make prepare' on kernel src to fix it."; \
 echo;        \
 /bin/false)

mkdir -p /home/vishal/20100426_eth_vishal/organised_eth/src/.tmp_versions ; rm -f /home/vishal/20100426_eth_vishal/organised_eth/src/.tmp_versions/*

make -f scripts/Makefile.build obj=/home/vishal/20100426_eth_vishal/organised_eth/src

  gcc -Wp,-MD,/home/vishal/20100426_eth_vishal/organised_eth/src/.eth_main.o.d  -nostdinc -isystem /usr/lib/gcc/i586-redhat-linux/4.4.0/include -Iinclude  -I/usr/src/kernels/2.6.29.4-167.fc11.i686.PAE/arch/x86/include -include include/linux/autoconf.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Os -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i686 -mtune=generic -Wa,-mtune=generic32 -ffreestanding -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Iarch/x86/include/asm/mach-generic -Iarch/x86/include/asm/mach-default -Wframe-larger-than=1024 -fno-stack-protector -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -pg -Wdeclaration-after-statement -Wno-pointer-sign -fwrapv -fno-dwarf2-cfi-asm -DTX_DESCRIPTOR_IN_SYSTEM_MEMORY -DRX_DESCRIPTOR_IN_SYSTEM_MEMORY -DTX_BUFFER_IN_SYSTEM_MEMORY -DRX_BUFFER_IN_SYSTEM_MEMORY -DALTERNATE_DESCRIPTORS -DEXT_8_BYTE_DESCRIPTOR -O0 -Wall -DT_ETH_1588_051 -DALTERNATE_DESCRIPTORS -DEXT_8_BYTE_DESCRIPTOR -DNETHERNET_INTERRUPTS -DETH_IEEE1588_TESTS -DSNAPTYPSEL_TMSTRENA_TEVENTENA_TESTS -DT_ETH_1588_140_147 -DLOW_DEBUG_PRINTS -DMEDIUM_DEBUG_PRINTS -DHIGH_DEBUG_PRINTS -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(eth_main)"  -D"KBUILD_MODNAME=KBUILD_STR(conxt_eth)"  -c -o /home/vishal/20100426_eth_vishal/organised_eth/src/eth_main.o /home/vishal/20100426_eth_vishal/organised_eth/src/eth_main.c 

Ответы [ 3 ]

4 голосов
/ 04 мая 2010

Если вы используете GCC, вы можете использовать атрибут pack в своей структуре для предотвращения заполнения:

struct foo
{
    void * bar;
}
__attribute__( ( packed ) );
1 голос
/ 04 мая 2010

# pragma pack может работать

0 голосов
/ 14 мая 2010

Я подозреваю, что GCC заставляет всю структуру быть выровненной по 32-битной границе, поэтому ее размер кратен 4.

Представьте себе следующее. структура фу {

пустота * бар; некоторые другие вещи ..... };

struct foo my_foo_array [10];

Тогда, если sizeof (struct foo) не кратно 4, тогда. my_foo_array [0] .bar имеет другое выравнивание памяти для my_foo_array [1] .bar. Процессору потребуется выполнить 2 32-битных доступа к памяти, чтобы получить доступ ко всем четырем байтам my_foo_array [1] .bar. Процессоры x86 выполнят эту повторную сборку неверно выровненных 32-битных значений, но большинство других процессоров вызовет некоторую форму исключения ошибки шины, что не является хорошим.

Атрибут упакован, указывает, как элементы структуры упакованы относительно друг друга, но при нормальной работе начало структуры должно быть размещено на 32-битном выровненном адресе.

Надеюсь, это немного лучше объясняет.

...