2010-05-04 3 views
1

Я компилирую модуль ядра, содержащий структуру размера 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 

ответ

1

#pragma pack мощь работа

+0

Это сработало для меня. Благодарю. –

4

При использовании GCC, вы можете использовать упакована атрибут вашей структуры, чтобы предотвратить обивка:

struct foo 
{ 
    void * bar; 
} 
__attribute__((packed)); 
+0

Не знаю, почему это не сработало. Все еще получил размер как 36. –

0

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

Представьте следующее. struct foo {

void * bar; некоторые другие вещи ..... };

struct foo my_foo_array [10];

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

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

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

+0

Hi Andrew, GCC генерирует 32-разрядный выровненный адрес по x86 по умолчанию, поскольку он оптимально подходит для 32-разрядного процессора x86 для извлечения данных. Я только хотел узнать, как решить проблему с GCC. Пакет для прагмы работал для меня. –

Смежные вопросы