Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
36.82 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

// Жесткий кодинг

or eax, 400200h

; записываем регистр чипсета out dx, eax

Заключение

Общаться с оборудованием на «железном» уровне безумно интересно, но чрезвычайно утомительно и сложно. Прежде чем контроллер оперативной памяти «заведется», предстоит проделать немало работы и тщательно прочитать порядка тысячи страниц документации, поскольку любая пропущенная мелочь может пустить все под откос. Положение усугубляется полным отсутствием отладочных средств, что дисциплинирует и учит искать ошибки «глазами».

Совет: прежде чем писать свой мини-BIOS, выводящий на экран зеленый травянистый семилистник под мелодию

«семь-сорок», раздающуюся из спикера, скачай готовую прошивку и дизассемблируй boot-блок, разобравшись, как он работает. Ты увидишь много обращений к портам, часть из которых удается расшифровать с помощью документации на чипсет, часть — обратившись к описанию остальных контроллеров и микросхем, установленных на плате.

Фрагмент прошивки AMI-BIOS

push

bp

mov

bp, sp

sub

sp, 8

mov

byte ptr [di-8], 'A'

mov

byte ptr [di-7], 'M'

mov

byte ptr [di-6], 'I'

mov

byte ptr [di-5], 'B'

mov

byte ptr [di-4], 'I'

mov

byte ptr [di-3], 'O'

mov

byte ptr [di-2], 'S'

mov

byte ptr [di-1], 'C'

push

bx

push

si

or

si, si

mov

ax, [di+8]

mov

dx, [bx+si+20h]

test

dx, dx

jz

short loc_A9BDB

В конечном счете мы создадим свой boot-блок, ассемблируем и, воткнув в программатор FLASH-BIOS, зальем туда свое творение (предварительно сохранив оригинальную прошивку). Не стоит надеяться, что материнская плата «проглотит» его с первого раза. Будет только черный экран, не реагирую- щийнаклавиатуру—ивсе.Дажекурсоранебудет.Попробуй угадай, в каком месте сидит ошибка! Но ведь только так программист из юноши превращается в настоящего мужчину, в смысле хакера. После недели-другой непрекращающихся мытарств мы, наверное, сможем оценить, каково приходилось нашим предкам, дырявящим перфокарты и совсем незнакомым с понятием интерактивной отладки. z

xàêåð 09 /93/ 06

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P

 

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

g

.c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/ 00139

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

>> coding

Управление таймигами памяти через регистр 114h северного моста чипсета Intel 915 (на других чипсетах номер регистра и назначение бит с вероятностью, близкой к единице, будут совсем другими, поэтому данная таблица приводится толькот как пример)

биты

доступ

значение по умолчанию

назначение

 

 

 

 

 

31:24

Зарезервированы.

 

 

 

 

 

23:20

R/W

9

Величина tRAS (она же DRAM Precharge Delay, она же Active to Precharge Delay, она

 

 

 

же Precharge Wait State, она же Row Active Delay, она же Row Precharge Delay) устанав-

 

 

 

ливает минимальный промежуток времени между открытием/закрытием одной DRAM-

 

 

 

страницы.

 

 

 

Значения от 0 до 3 зарезервированы;

 

 

 

Значения от 4 до 15 — время в тактах.

 

 

 

 

 

19

RO

0

tRAS MAX — максимальный промежуток времени, в течение которого DRAM-страница

 

 

 

может оставаться открытой, и, если контроллер не закроет ее, произойдет Panic

 

 

 

Refresh (экстренное обновление), сопровождаемое закрытием всех страниц во

 

 

 

всех банках.

 

 

 

В данном чипсете этот регистр доступен только на чтение, то есть управление tRAS

 

 

 

MAX не реализовано и составляет 120 наносекунд.

 

 

 

 

18:10

Зарезервированы.

 

 

 

 

09:08

R/W

01b

Величина tCL, более известная под именем CAS# Latency, задает количество тактов

 

 

 

между отправкой DDR-микросхеме команды чтения (не записи!) и сбросом первой порции

 

 

 

данных на шину, при этом DRAM-страница должна быть заблаговременно открыта, за

 

 

 

что отвечает тайминг tRCD.

значение регистра

DDR tCL, такты

ddR2 tCL, такты

00b

3

5

01b

2,5

4w

10b

2

3

 

 

 

11

зарезервированы

 

 

 

 

 

07

Зарезервирован.

 

 

 

 

 

06:04

R/W

010b

Величина tRCD, также называемая RAS# to CAS# Delay или Active to CMD, определяет время

 

 

 

открытия DRAM-страницы, в процессе которого со строки конденсаторов считывается заряд

 

 

 

изаноситсявбуферстатическойпамяти,локальнообрабатывающийвсепоследующиеобращения.

 

 

 

значениерегистра

tRCD,такты

 

 

 

000b

2

 

 

 

001b

3

 

 

 

010b

4

 

 

 

011b

5

 

 

 

100b

 

 

 

 

101b

 

 

 

 

110b

зарезервированы

 

 

 

111b

 

 

 

 

 

 

3

Зарезервирован.

 

 

 

 

 

2:0

R/W

010b

Величина tRP (она же RAS# Precharge Delay, она же Precharge to active) определяет время

 

 

 

закрытия DRAM-страницы, в процессе которого происходит возврат данных в банк памяти

 

 

 

и его перезарядка. Во время перезарядки банк недоступен, но доступны все остальные банки

 

 

 

(большинство DDR-модулей содержит четыре таких банка). Банк закрывается на

 

 

 

перезарядку всякий раз, когда происходит обращение к другой странице из этого же

 

 

 

самого банка.

 

 

 

 

 

 

 

 

 

значение регистра

tRP, такты

 

 

 

000b

2

 

 

 

001b

3

 

 

 

010b

4

 

 

 

011b

5

 

 

 

100b

 

 

 

 

101b

 

 

 

 

110b

зарезервированы

 

 

 

111b

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

/ 140

xàêåð 09 /93/ 06

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

// Жесткий кодинг

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Порядок инициализацииоборудования

Порядок инициализации оборудования не вы-

назначение устройствам IRQ и портов

 

финальная инициализация шины USB;

сечен на камне и допускает довольно большие

ввода/вывода;

 

инициализация APCI-таблицы на вершине

вольности, однако определенные традиции и

поиск видеокарты и отображение VGA BIOS

памяти;

 

 

 

нормы приличия все-таки нужно соблюдать.

на сегмент C000h;

 

поиск ISA-устройств (если есть эта рухлядь)

Материнские платы от EPOX выгодно отлича-

инициализация буфера клавиатуры для

и вызов их BIOS'ов;

 

 

 

ются тем, что имеют 2-разрядный сегментный

вектора INT 09h;

 

финальное распределение между ISA и PCI-

индикатор, отображающий ход загрузки, что

инициализация внутренних MTRP-регист-

устройствами;

 

 

 

облегчаетдиагностикуполомки(еслитаковая

ров ЦП для отображения памяти 0-640 Кб;

 

финальная инициализация чипсета;

 

 

 

есть) и упрощает дизассемблирование BIOS,

инициализация APIC-контроллера;

 

финальная инициализация менеджера

поскольку… код, отображаемый на индикато-

установка регистров чипсета в соответс-

энергопитания;

 

 

 

ре, в листинге присутствует в виде констан-

твии с настройками CMOS;

 

очистка экрана и вывод таблицы с инфор-

ты, расшифровку значения которой можно

инициализация интегрированного IDE-кон-

мацией о конфигурации всех устройств;

найти в руководстве в приложении E. Лучших

троллера;

 

инициализация клавиатурных индикаторов

комментариев к листингу, пожалуй, и не при-

измерение тактовой частоты ЦП;

и установка скорости автоповтора;

 

 

 

думаешь!

вызов VIDEO-BIOS;

 

построение MP-таблицы;

 

 

 

На остальных материнских платах порядок

вывод на экран информации о типе ЦП,

 

построение и обновление ESCD-таблицы;

инициализации оборудования не сильно от-

тактовой частоте, логотипа BIOS и т.д.;

 

установка века в CMOS;

 

 

 

личаетсяотEPOX'а,ивсепроисходитприбли-

сброс клавиатуры;

 

загрузка даты/времени в область данных

зительно следующим образом:

тест битовой маски контроллера прерыва-

BIOS;

 

 

 

 

ний 8259 для канала 1;

 

построение таблицы маршрутизации аппа-

тест CMOS на чтение/запись;

тест битовой маски контроллера прерыва-

ратных прерываний MSIRQ;

 

 

 

отключение теневой RAM;

ний 8259 для канала 2;

 

попытка загрузки с загрузочного носителя

инициализация базовых регистров чипсета;

первичная инициализация шины USB;

(вызов прерывания INT 19h);

 

 

 

чтение информации из SPD и инициализа-

тестирование и очистка памяти;

 

на этом BIOS прекращает свою работу и

ция DRAM-контроллера;

готовность выйти в BIOS Setup по нажатию

передает управление boot-сектору;

 

 

 

распаковка сжатого BIOS в оперативную

<DEL>;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

память;

инициализация PS/2-мыши;

 

 

 

 

 

 

 

 

 

 

копирование BIOS в теневую RAM в сегмен-

инициализация и выделение ресурсов

 

 

 

Professor

 

 

 

ты E000h и F000h;

интегрированным COM и LPT-портам;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

инициализация интерфейса 8042 (интегри-

инициализация привода гибких дисков;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

рованного в южный мост);

детектирование и инициализация IDE-при-

 

 

 

 

 

 

 

 

 

 

запуск самотестирования 8042;

водов (HDD, LS120, ZIP, CDROM);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

детектирование микросхемы FLASH-ROM;

детектирование и инициализация неинтег-

 

 

 

PCI Configuration in I/Q

 

 

 

загрузка процедуры «прожига» FLASH

рированных COM/LPT-портов;

 

 

 

 

 

 

 

 

 

 

в сегмент F000h (для поддержки DMI & ESCD);

перепрограммирование шрифтов для выво-

 

 

 

 

 

 

 

 

 

 

установка всех регистров чипсета в значе-

да EPA-логотипа в текстовом режиме;

 

 

 

 

 

 

 

 

 

 

ния по умолчанию (берутся из BIOS);

вывод EPA-логотипа;

 

 

 

 

 

 

 

 

 

 

 

Device 1 (82915G/8291

 

 

 

 

 

 

 

детектирование типа ЦП;

вызов hock-процедуры менеджера энерго-

 

 

DRAM Interface Bus 0.

 

инициализация таблицы векторов преры-

питания;

 

5P82915PL GMCH only

 

Device 0

 

 

 

 

 

 

 

 

 

ваний;

восстановление шрифтов, используемых

 

 

 

 

 

 

 

 

 

 

считывание установок CMOS в стек BIOS'а;

для вывода EPA-логотипа;

 

 

Internal Graphics Bus 0.

 

 

 

DMI

 

 

построение карты ресурсов для PCI- и P&P-

запрос пароля (если загрузка компьютера

 

 

(82915G/82915GV/829

 

 

 

 

 

 

15GL82910GL Devie

 

 

 

 

 

 

устройств;

защищена паролем);

 

 

 

 

 

 

 

 

 

Cерверныймостчипсета,несущийнасвоем

инициализация тактового генератора;

запись всех данных из стека BIOS обратно

 

сканирование всех устройств, подключен-

в CMOS;

 

бортуважнейшиеустройства(такие,напри-

ных к PCI-шине;

инициализация загрузочных устройств P&P;

 

мер,какконтроллерпамяти),подключается

 

 

 

кпроцессоручерезPCI-шину

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

xàêåð 09 /93/ 06

/ 141

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

>> coding

 

 

 

 

 

 

 

 

 

 

 

Тарасов Дмитрий aka Dem@n

/ pink2000-0@mail.ru /

Веб-сервиc дляКПК

КПК, коммуникаторы, смартфоны... Эти девайсы постепенно становятся рабочими инструментами как бизнесмена, так и студента. Несмотря на это, квалифицированных разработчиков софта для этих устройств мало, эта ниша еще не занята. Сегодня мы рассмотрим практический пример использования двух перспективных технологий: .NET Compact Framework и web-services.

Юзаем веб-службу сервера ЦБ РФ на .NET Compact Framework

 

м

ы займемся написанием прило-

можности развиваются, и из просто крутых

компании Microsoft обеспечить упрощение

 

жения, работающего на базе ОС

блокнотов они переходят в разряд серьез-

написания мультиплатформенного кода, спо-

 

Windows Mobile под платформой

ных устройств, способных предоставлять

собного выполняться под любой ОС и на лю-

 

.NET Compact Framework и использующего

доступ к разного рода информации. Такие

бом оборудовании. Суть программирования

 

веб-службы сервера Центробанка РФ для по-

технологии, как Bluetooth и Wi-FI, позво­

под .NET Framework заключается в написании

 

лучения различной информации, предостав-

ляют на ходу подключаться к всемирной

кода на одном (или нескольких) .NET-сов-

 

ляемой ЦБ разработчикам для последующей

сети и делают такую машинку поистине не-

местимых языках, который компилируется

 

обработки и донесения до конечного потре-

заменимым инструментом. Но если с выбо-

в так называемый управляемый код (MSIL —

 

бителя. Писать будем, соответственно, на C#,

ром ОС для нашей проги все более-менее

Microsoft Intermediate Language). Этот код, в

 

используя Visual Studio.NET. Я постараюсь

понятно, то у многих противников творчес-

свою очередь, компилируется средой .NET

 

вкратце рассказать, что же такое веб-служ-

тва Microsoft возникнет вопрос: «А зачем

Framework в машинно-зависимые инструкции

 

бы, зачем они нужны и как их использовать

писать софт для платформы .NET CF?» Не

уже при запуске программы на конкретной

 

в мобильном приложении так, чтобы работа

хочу лишний раз вдаваться в рассуждения

рабочей станции (девайсе) и поэтому может

 

программы не вызывала спазмов желудка.

по этому поводу, поэтому оставлю это лю-

бытьзапущенналюбойпрограммно-аппарат-

 

Итак, поехали. Начнем с основ.

бителям священных войн, а сам напомню

ной платформе, на которой установлена сре-

 

 

 

вкратце, что вообще собой представляет

да.NET.Естественно,наличиеустановленной

 

Почему .NET CF?

технология .NET CF.

среды выполнения .NET Framework необходи-

 

Думаю, для тебя не будет откровением, если

Платформа .NET Compact Framework являет-

мо для запуска подобных приложений.

 

я скажу, что на данный момент на рынке мо-

ся адаптированной для мобильных устройств

Код, полученный при компиляции, называет-

 

бильных устройств доминируют КПК на базе

версией платформы .NET Framework. Появле-

ся управляемым (managed), потому что его

 

Windows Mobile. Их коммуникационные воз-

ние обеих платформ вызвано стремлением

выполнение полностью контролируется инф-

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

/ 142

xàêåð 09 /93/ 06

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Студия с запущенным эмулятором Windows Mobile

Наша программа в действии

раструктурой .NET. Кроме того, при запуске

тернет для передачи и загрузки разного рода

формации. Чтобы начать работу, нужно доба-

приложения компилируется не сразу весь

информации.

вить референс на веб-службу:

код MSIL, а лишь используемые в конкрет-

Потребителями веб-служб являются не ко-

 

 

 

 

 

 

ный момент методы. Exe-файлы, полученные

нечные пользователи, а программный код,

 

 

 

 

 

 

http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx

при первичной компиляции, имеют в своей

разрабатываемый кодерами. По сути, потре-

 

 

 

 

 

 

структуре секцию, указывающую на то, что

бителем является приложение, в исходном

Если откроешь эту ссылку в браузере, то

управление выполнением приложения долж-

коде которого описывается взаимодействие

увидишь описание методов некоего класса

нопередаватьсясреде.NET.Стандартныйза-

программы с веб-сервисом. Если опустить

DailyInfo. Этот документ автоматически был

грузчик Windows Mobile не может определять

технические детали реализации взаимодейс-

сгенерирован, когда программисты ЦБ ском-

эту секцию, поэтому он модифицируется при

твия, то можно сказать, что при использова-

пилировали и запустили веб-службу на сер-

установке на машину .NET CF.

нии (на этапе разработки потребителя) веб-

вере. Описание содержит тип возвращаемых

По некоторым данным, до 80% средств,

служб средой Visual Studio генерируется так

данных и назначение конкретного метода.

затраченных на разработку компанией

называемый прокси-класс, обеспечивающий

При добавлении референса в проект среда

Microsoft, идет на развитие .NET. Учитывая

из исходного кода программы доступ к мето-

автоматически генерирует прокси-класс

влияние MS, а также тот факт, что Windows

дам и свойствам веб-службы, как к методам и

DailyInfo(), с которым мы и будем работать.

Vista будет иметь полную поддержку .NET,

свойствам локального класса. Другими сло-

Также необходимо подключить пространство

становится очевидно, что программирова-

вами, класс со всеми его методами, создан-

имен:

ние под эту платформу очень востребовано

ный и развернутый на удаленном сервере,

 

 

 

 

 

 

на рынке разработки пользовательского ПО.

доступен на локальной машине. Я не буду

 

 

 

 

 

//здесь cbrf — название нашего проекта

Успех .NET во многом обязан удобству рабо-

расписывать, каким образом осуществляет-

 

 

 

 

using cbrf.ru.cbr.www;

ты с Visual Studio.NET. Кроме того, библио-

ся обмен данными между сервером и клиен-

 

 

 

 

 

 

тека .NET насчитывает огромное количество

том,посколькуинформациипоэтомувопросу

Теперь можно использовать DailyInfo как

классов для работы с XML и веб-службами.

предостаточно. Скажу лишь, что данные пе-

обычный локальный класс:

Еще одним доводом является наличие в Visual

редаются от клиента к серверу и обратно не

 

 

 

 

 

 

Studio.NET средств разработки и отладки

в двоичном формате, а в текстовом. Формат

 

 

 

//создаем экземпляр прокси-класса

ПО для платформ Windows CE и Pocket PC,

передаваемых данных основывается на XML,

 

 

DailyInfo di = new DailyInfo();

включая эмулятор. Тебя наверняка поразит

чемиобуславливаетсятотфакт,чтоневажно,

 

 

 

 

 

 

простота, с которой можно использовать веб-

на какой аппаратно-программной платформе

Пишем код

службы, работая в этой среде.

крутится наш код. Рекомендую ознакомиться

После изучения методов, предоставляемых

 

скнижкойАлексаФеррара«Программирова-

нам классом DailyInfo() для доступа к необхо-

Что же это за технология?

ние web-сервисов для .NET».

димой инфе, приступим к непосредственной

Технология веб-служб или веб-сервисов

Чтобы тебе была понятнее идея использова-

разработке.

(web-services) призвана обеспечить доступ

ния веб-сервисов, рассмотрим взаимодейс-

Создаем новый C# — проект типа «Smart

через интернет к различным приложениям и

твие нашего приложения с сервером ЦБ. На

Device Application», платформу — Pocket PC,

их совместное использование. Причем все

серваке хранится информация о курсах ва-

тип приложения — Windows Application.

этопроисходиттакимобразом,будтовсепри-

лют, динамике их изменения и прочая инфа,

Разместим на форме две закладки, на одной

ложениярасположеныналокальноймашине.

определяющаяся спецификой деятельности

из которых будет инфа о курсах, на другой

Функционирование веб-служб базируется

этой бравой конторы.

— об их динамике. Для отображения дан-

на языке XML с присущей ему межплатфор-

Для того чтобы мы могли получать доступ к

ных нам понадобится два контрола DataGrid.

менностью и универсальностью. Появление

этим данным, ребята из ЦБ написали веб-сер-

Добавим также меню «Загрузка» с пунктами

веб-служб обусловлено тем, что настольные

вис, позволяющий нам уже из своего кода вы-

«Курсывалют»и«Динамикакурсов».Осталь-

и веб-приложения стали схожи по функцио-

зывать методы, которые описаны на сервере

ныевозможностикпрогедобавишьсам:).Для

налу, и зачастую программы используют ин-

и служат для получения и обработки этой ин-

получения соответствующих данных исполь-

xàêåð 09 /93/ 06

/ 143

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

>> coding

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Описание веб-службы ЦБ

зуются следующие методы: GetCursOnDate — метод, возвращающий DataSet с текущими курсами валют. Принимает в качестве параметра текущую дату.GetCursDynamic

— метод, возвращающий DataSet с динамикой курса какой-то конкретной валюте. Принимает в качестве параметров дату начала и конца изменения курса, а также код валюты.

При выборе действия в меню будем вызывать функцию LoadingData, код которой можно посмотреть ниже.

Код функции LoadingData

private void LoadingData(DataGrid Target, int ServiceNumber)

{

tableStyle.GridColumnStyles.Clear();

dgValuta.TableStyles.Clear(); if (ServiceNumber == 1)

{

//показываем первую закладку tbPages.SelectedIndex=0;

//начинаем асинхронный вызов метода

handle = di.BeginGetCursOnDate(DateTime.Now,null,null);

}

if (ServiceNumber==2)

{

tbPages.SelectedIndex=1;

// начинаем асинхронный вызов метода handle=di.BeginGetCursDynamic(

DateTime.Parse(textBox1.Text),

DateTime.Parse(textBox2.Text),

"R01235",null,null);

}

}

Само собой, неплохо бы привести этот код в блоке try и отлавливать исключения. Журнал не резиновый, поэтому останавливаться на этом не будем.

Как видишь, все элементарно, но есть один любопытный нюанс. Независимо от того, каким образом твой наладонник подключен к интернету, время ожидания данных будет вполне ощутимо. Поэтому если ты не хочешь при нажатиикнопки«Загрузить»некотороевремялицезреть нереагирующую на действия пользователя прогу с «подвисшим» интерфейсом, то рекомендую использовать асинхронный вызов службы. Суть его в том, что обмен данными между сервером и КПК осуществляется как бы в отдельном потоке, предоставляя приложению возможность обрабатывать другие события. Реализуется же

Грамотный учебник по веб-сервисам

это за счет использования методов BeginGetCursOnDate

и BeginGetCursDynamic вместо GetCursOnDate и Get­ CursDynamic. Для того чтобы проверить, закончена ли загрузка данных, используется свойство Handle. IsCompleted. Когда оно принимает значение true, данные можно обрабатывать и отображать. Я прицепил к форме таймер и каждую секунду тупо проверял значение этого свойства.

Ловим момент окончания загрузки данных private void timer1_Tick(object sender, EventArgs e)

{

if (handle.IsCompleted)

{

// записываем полученные данные в наш DataGrid ds=di.EndGetCursOnDate(handle);

...

//код для преобразования и отображения данных

}

else

{

//показываем, что идет загрузка данных

StatusBar.Text=statusBar.Text+".";

}

}

После того как получен DataSet с запрошенными данными, их необходимо обработать таким образом, чтобы они нормальносмотрелисьнаэкранедевайса.Какэтосделать,думаю, разберешься сам. Намекну лишь, что придется пользоваться таблицами стилей для каждого столбца, который ты захочешь отображать. Рекомендую также взглянуть на исходник.

Вместо заключения

Как видишь, использование веб-сервисов при программировании под .NET CF не вызывает особых сложностей. Ты можешь самостоятельно расширить функциональность программки,которуюмыстобойсегоднянаваяли,добавив

внее поддержку загрузки остальных данных с сервера ЦБ. Ценность данного примера заключается в том, что разработка приложения, использующего другие веб-службы, не будет принципиально отличаться от процесса, который я постаралсяописатьвэтойстатье.ТакчтоVisualStudioтебе

вруки — и вперед, к покорению рынка софта для КПК . z

Если ты увлекся программированием под

.NET CF, то рекомендую почитать книгу И. Салмре «Программирование мобильных устройств на платформе .NET Compact Framework» *.

На диске ты найдешь исходник проги. Для компиляции подойдет 2003 студия.

/ 144

xàêåð 09 /93/ 06

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

>>>>codingcoding

Крис Касперски

Трюки от крыса

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

В этом, четвертом по счету выпуске, мы рассмотрим трюки, так или иначе связанные с памятью: продефрагментируем кучу, разберемся, как правильнее передавать переменные по ссылке или по значению, когда их нужно инициализировать, а когда — нет.

Пможет сложиться такая ситу- , когда свободная память есть,

еене удается. Почему? Предста-интенсивном использовании

что мы имеем 100 Мб свободной памяти в непрерывном блоке. Выделяем 10 блоков по 10 Мб, а затем освобождаем их через один,послечегопытаемсявыделитьблокразмером в 20 Мб, но это не получится! Несмотря на 50 Мб свободной памяти, эта память раздроблена на множество мелких кусочков. Вот потому-то некоторые и рекомендуют перезагружать Windows хотя бы раз в месяц.

Почему же менеджер кучи не дефрагментирует память, переупорядочив блоки? Да потому, что, получив указатель на выделенный блок памяти, программа приобретает в свое владение целый регион, с которым может делать все, что угодно. В частности, сохранять указатели на ячейки внутри блока. Но менед-

жер кучи ничего не знает об этих указателях и потому не может трогать память.

А давай попробуем написать собственный дефрагментатор кучи! Это возможно (и совсем не сложно), если только наша программа придерживается определенных соглашений. В частности, адресует все ячейки внутри выделенного блока только через базовый указатель, который, в свою очередь, является указателем на указатель. Непонятно? Ничего, несколько наглядных листингов все объяснят.Вотклассическийпримериспользования кучи, делающий дефрагментацию динамической памяти невозможной:

foo(char* p)

{

static char *b = p;

}

char *p, x; int n;

p = malloc(BLOCK_SIZE); x = p+n;

foo(x);

Выделив блок памяти p, программа получает указатель x, ссылающийся на некоторую ячейку внутри блока, и передает его функции foo, которая сохраняется в статической переменной b, что делает блок p совершенно неперемещаемым, поскольку переменная b жестко привязана к своей ячейке памяти и ничего не знает про какие-то там блоки.

А вот другой вариант той же программы:

volatile char **p; int n;

p = my_malloc(BLOCK_SIZE); foo(p, n);

/ 146

xàêåð 09 /93/ 06

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

//

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Трюки от Крыса

 

 

 

 

 

 

 

 

 

 

Этотпримеружеподдерживаетвозможность дефргаментации динамической памяти в однопоточных программах. В чем разница? Теперь функция my_malloc возвращает не указатель на выделенный блок, а указатель на переменную, хранящую указатель на выделенный блок. Функции foo передается уже не эффективный адрес ячейки памяти, а ука- затель-на-указатель p и смещение нужной ячейки относительно начала блока. Функция foo и все остальные функции не могут, не имеют права хранить эффективные адреса в статических переменных или передавать их кому-либо еще. Вместо этого они при каждом обращении к ячейке должны выполнять операцию (*p+n), причем перемененная p должна быть объявлена как volatile, что запретит компилятору помещать ее в регистр.

Теперьнашменеджеркучи,представляющий собой надстройку над malloc, может беспрепятственно двигать блоки, высвобождая непрерывные регионы требуемой длины. Для обеспечения когерентности и взаимной непротиворечивости дефргаментация должна осуществляться внутри вызова my_malloc, да и то только в однопоточных программах. С многопоточными этот трюк не сработает, поскольку акт обращения к ячейкам памяти неявляетсяатомарнымдействием.Допустим, один поток вычислил эффективный адрес ячейки и только собрался к ней обратиться, как другой поток в это время передвинул блок на другое место! Следовательно, каждый поток должен иметь свою кучу, а передача данныхотодногопотокакдругомуобязаназащищаться критическими секциями или другими средствами синхронизации.

В итоге мы получим более тормозной и громоздкий код, что есть минус. Но зато теперь можно забыть про фрагментацию кучи, что есть плюс.

По ссылке или по значению

Язык Си поддерживает два способа передачи переменных: по ссылке и по значению, порождая тем самым извечную проблему выбора. Программистское сообщество разбилось на два больших лагеря, отстаивающих свои взгляды на дизайн программирования и ожесточенно воюющих между собой.

Одинлагерьговорит,чтовсе,чтопомещается в регистр общего назначения (то есть физически представляет собой байт, слово или двойное слово) передается по значению, остальное — по ссылке, потому что это гораздо быстрее и требует меньше памяти.

Другой лагерь с этим категорически не со-

xàêåð 09 /93/ 06

гласен: кому сейчас нужна быстрота? А потребности в памяти всегда может удовлетворить новый DIMM. Передача переменных по ссылке потенциально опасна и вносит большую сумятицу, поскольку при передаче по значению функции передается копия переменной, которую она может модифицировать как угодно, не затрагивая оригинал. А вот при передаче по ссылке возникает угроза непреднамеренной порчи данных. Кроме того, при чтении листинга становится непонятно, то ли мы просто передаем значение функции, то ли принимаем через нее возвращенный результат.

Формально запретить модификацию переменной, переданной по ссылке, можно через квалификатор const, однако надежной такую защиту не назовешь, поскольку const легко обходится через преобразование типов (как преднамеренное, так и нет). С другой стороны, передавать большие объемы данных по значению смерти подобно, особенно в рекурсивных функциях или при глубоком объеме вложенности.

Но есть выход: передаем переменные по ссылке, для наглядности предварив их const,

ана физическом уровне защитив от моди-

фикации вызовом VirtualProtect(,,PAGE_ READONLY,). Естественно, при выходе из функции защиту необходимо восстановить. Пользователи коммерческих компиляторов

(вроде Microsoft Visual C++) вынуждены де-

лать это вручную (что чревато ошибками),

авот GCC, бесплатно распространяемый в исходных текстах, позволяет свободно модифицироватьпрологиэпилогкаждойфункции по своему усмотрению.

Кстати говоря, здесь мы снова сталкиваемся сневозможностьюреализацииданногомеханизмавмногопоточныхпрограммах,поскольку в то время пока одна функция «защитила» переменную, никакая другая функция чужого потока не может ее менять, даже если ей это действительно необходимо. Одно из главных достоинств UNIX'а как раз и заключается в том, что в нем потоки играют второстепенную роль и, вообще говоря, не слишком популярны. А вот в Windows… задачи синхронизации приходится решать вручную. Как говорится, создаваяпотоки,мысоздаемсебепроблемы, но это уже другая тема.

Инициализировать или нет

Программисты, особенно начинающие, часто инициализируют то, что инициализируется само (а соответственно, принудительно обнулять его не нужно). Хоть это и не вредит, но от-

нимает время как у процессора, так и у самого программиста.

Статические и глобальные переменные всегда инициализируются нулями еще на стадии загрузки PE/ELF-файла в память, причем эта инициализация обходится очень дешево (в смысле процессорного времени), поэтому массивы(особеннобольшие)лучшевсегоразмещать в статических переменных. Правда, при этом функция становится нерентабельной, то есть ее нельзя вызывать рекурсивно или одновременно из нескольких потоков (ох, опять эти потоки!). Кроме того, при повторном вызове функции статические переменные будут содержать значения, оставленные предыдущим вызовом, и если функцию планируется вызывать многократно, то инициализировать переменные все-таки придется.

Память, выделенная функцией VirtualAlloc, также автоматически инициализируется нулями, о чем сказано в первом же абзаце до-

кументации («Memory allocated by this function is automatically initialized to zero, unless the MEM_RESET flag is set»), да только кто же эту документацию читает…

Функция malloc не инициализирует выделяемую память (во всяком случае по Стандарту), но в реализации от Microsoft при выделении блоков от 512 Кб и выше она обращается к VirtualAlloc, в результате чего происходит неявная инициализация памяти. Правда, никакихгарантий,чтоповедениефункциинеизменится в следующих версиях, у нас нет, так что пусть каждый решает сам, использовать ли ему эту недокументированную особенность или же свято придерживаться его величества Стандарта, в котором, кроме malloc, предусмотрена функция calloc, выделяющая инициализированнуюпамять.Надеюсь,никтонеза-

метит,что«p = calloc(BLOCK_SIZE);»намного короче и нагляднее, чем «p = malloc(BLOCK_ SIZE); memset(p,1, B L O C K _ S I Z E ) ; » , хотя

Microsoft могла бы свободно избавиться от лишнего цикла инициализации, если бы блок памяти был выделен VirtualAlloc, но, увы, она этого не сделала.

Наконец, существуют ситуации (правда, их довольно немного), когда начальное значение переменной совершенно некритично, поэтому ее можно не инициализировать, пропуская протест компилятора мимо ушей. Вот, например, реализация «пропеллера»: «printf("%c\r","-\\|/"[z++ % 4]);». Совершенно очевидно, что инициализировать переменную z излишне, хоть это и влияет на начальное положение «лопасти», но… кто же на него обратит внимание? z

/ 147

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

>> units

FAQ

Задавая вопрос, подумай! Не стоит мне посылать вопросы, так или иначе связанные с хаком/крэком/фриком

— для этого есть hack-faq (hackfaq@ real.xakep.ru), не стоит также задавать откровенно ламерские вопросы, ответ на которые ты при определенном желании можешь найти и сам. Я не телепат, поэтому конкретизируй вопрос, присылай как можно больше информации.

 

 

Q

r

FA

YOU

 

 

FAQ

O

 

 

n

Q: Слышал, что к FreeBSD 6.1 (спасибо

 

 

за дистрибутив на диске) можно при-

 

 

крутить журналируемую файловую

 

 

систему UFS2. Перерыл все мануалы

 

 

к системе, но ничего путного так и не

 

 

нашел. Как же так?

 

 

A: В стабильных версиях FreeBSD и вправду

 

 

возможно подключить полноценную журнали-

4. Добавив в конфиг ядра строку «options

Q: Какие гаджеты к Skype бывают?

руемую систему. Правда, придется немного

UFS_GJOURNAL», пересобираем ядро (www.

A: A: Самое простое — это Skype-телефон.

пропатчить ось, но, к счастью, выполнить это

surgutnet.ru/page.php?id=9) и отправляем ма-

Бывают как проводные, так и беспроводные

довольно просто. Итак, все по порядку:

шину в ребут.

варианты. В любом случае, аппарат подклю-

1. Прежде чем приступать непосредственно

5. Теперь нужно подгрузить специальной мо-

чается через USB к компьютеру и с помощью

кпатчингу,выполнимвспомогательныеприго-

дуль с помощью команды:

установленного драйвера взаимодействует

товления.Зайдивкаталог/usr/srcисоздайтам

 

со Skyp’ом. Такие трубки оборудованы дисп-

необходимые директории:

#gjournal load

леем, на котором отображается контакт-лист,

 

 

поэтому ты без труда можешь вызвать любой

#cd /usr/src

6. Чтобы подключить журнал к определенно-

из контактов или просто телефонный номер.

#mkdir sbin/geom/class/journal

му разделу, его предварительно необходимо

Принять звонок ты сможешь нажатием од-

#mkdir sys/geom/journal

размонтировать. Для примера возьмем раз-

ной кнопки, не забывая о встроенном АОНе,

#mkdir sys/modules/geom/geom_journal

дел '/dev/ad0s3d' и точку монтирования — /

который отобразит на дисплее телефона имя

 

mnt/ufs2test.

контакта или номер вызывающего абонента.

2.Далее можно закачать сам патч и вносить в

 

Некоторые современные модели телефонов

систему изменения:

#umount -f /mnt/ufs2test

также оборудованы веб-камерой для органи-

 

 

зации видеоконференций. Одной из таких

#fetch http://people.freebsd.org/~pjd/patches/gjournal6.

7.Настало время подключить журнал:

трубок является USB Video Phone (USB-P4V).

patch

 

Кроме этого, широко распространены спе-

#patch < gjournal6.patch

#gjournal label /dev/ad0s3d

циальные адаптеры (например, USB Telbox),

 

 

позволяющие использовать Skype с помощью

3. После этого рекомендуется пересобрать

8. Монтируем раздел, теперь уже с подклю-

обычной телефонной трубки. Устройство

часть системы, для чего необходимо после-

ченным журналом, обратно:

представляет собой аналого-цифровой пре-

довательно зайти в каталоги /usr/src/include/,

 

образователь и связывает между собой теле-

/usr/src/sbin/geom/class/, /usr/src/sbin/mount/ и

#mount -o async,gjournal /dev/ad0s3.journal /mnt/ufs2test

фон с аналоговым сигналом и Skype, который

выполнить заветную последовательность ко-

 

полностью работает в цифре.

манд 'make; make install; make clean'.

Готово!

Еще один интересный девайс — Skype-шлюз.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

/ 148

xàêåð 09 /93/ 06

 

Соседние файлы в папке журнал хакер