Submit Search
Upload
【学習メモ#3rd】12ステップで作る組込みOS自作入門
•
4 likes
•
4,122 views
S
sandai
Follow
12ステップで作る組込みOS自作入門 http://www.amazon.co.jp/dp/4877832394/ 坂井 弘亮(著) カットシステム
Read less
Read more
Technology
Report
Share
Report
Share
1 of 56
Download now
Download to read offline
Recommended
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門
sandai
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
sandai
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介
NSaitoNmiri
ALGYAN 6th IoT基板で倒立振子
ALGYAN 6th IoT基板で倒立振子
Bizan Nishimura
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
sandai
S大学ゲーム制作サークル第一回 超初心者向けUE4チュートリアル(1)
S大学ゲーム制作サークル第一回 超初心者向けUE4チュートリアル(1)
ai BlogOnly
Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】
Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】
GMO GlobalSign Holdings K.K.
少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -
少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -
historia_Inc
Recommended
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門
sandai
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
sandai
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介
NSaitoNmiri
ALGYAN 6th IoT基板で倒立振子
ALGYAN 6th IoT基板で倒立振子
Bizan Nishimura
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
sandai
S大学ゲーム制作サークル第一回 超初心者向けUE4チュートリアル(1)
S大学ゲーム制作サークル第一回 超初心者向けUE4チュートリアル(1)
ai BlogOnly
Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】
Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】
GMO GlobalSign Holdings K.K.
少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -
少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -
historia_Inc
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
Effekseer勉強会 機能解説など
Effekseer勉強会 機能解説など
ueshita
C言語ポインタ講座 (Lecture of Pointer in C)
C言語ポインタ講座 (Lecture of Pointer in C)
kakira9618
The history of TeX and its recent advances
The history of TeX and its recent advances
Yusuke Terada
ELFの動的リンク
ELFの動的リンク
7shi
UE4 ビヘイビアツリー入門
UE4 ビヘイビアツリー入門
r_ngtm
60fpsアクションを実現する秘訣を伝授 基礎編
60fpsアクションを実現する秘訣を伝授 基礎編
エピック・ゲームズ・ジャパン Epic Games Japan
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
AWS CDKに魅入られた PHPer がオススメする
AWS CDKに魅入られた PHPer がオススメする
Taichi Inaba
UE4 Saitama 初心者向けハンズオン #6『サウンド再生』
UE4 Saitama 初心者向けハンズオン #6『サウンド再生』
Yuuki Ogino
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
もっとNiagaraを楽しもう!~UE4.25での作例と解説~ (UE4 VFX Art Dive)
もっとNiagaraを楽しもう!~UE4.25での作例と解説~ (UE4 VFX Art Dive)
エピック・ゲームズ・ジャパン Epic Games Japan
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
エピック・ゲームズ・ジャパン Epic Games Japan
開発から見たWindowsの国際化機能
開発から見たWindowsの国際化機能
Tadahiro Ishisaka
UE4背景アーティスト勉強会(前編) 背景ワークフロー解説
UE4背景アーティスト勉強会(前編) 背景ワークフロー解説
Aiko Shinohara
50分でわかるブループリントについて
50分でわかるブループリントについて
Masahiko Nakamura
なぜなにFProperty - 対応方法と改善点 -
なぜなにFProperty - 対応方法と改善点 -
エピック・ゲームズ・ジャパン Epic Games Japan
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
モノビット エンジン
低スペックPCでも動く!UE4の設定&歩き方
低スペックPCでも動く!UE4の設定&歩き方
ka-s
【学習メモ#5th】12ステップで作る組込みOS自作入門
【学習メモ#5th】12ステップで作る組込みOS自作入門
sandai
【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門
sandai
More Related Content
What's hot
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
Effekseer勉強会 機能解説など
Effekseer勉強会 機能解説など
ueshita
C言語ポインタ講座 (Lecture of Pointer in C)
C言語ポインタ講座 (Lecture of Pointer in C)
kakira9618
The history of TeX and its recent advances
The history of TeX and its recent advances
Yusuke Terada
ELFの動的リンク
ELFの動的リンク
7shi
UE4 ビヘイビアツリー入門
UE4 ビヘイビアツリー入門
r_ngtm
60fpsアクションを実現する秘訣を伝授 基礎編
60fpsアクションを実現する秘訣を伝授 基礎編
エピック・ゲームズ・ジャパン Epic Games Japan
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
AWS CDKに魅入られた PHPer がオススメする
AWS CDKに魅入られた PHPer がオススメする
Taichi Inaba
UE4 Saitama 初心者向けハンズオン #6『サウンド再生』
UE4 Saitama 初心者向けハンズオン #6『サウンド再生』
Yuuki Ogino
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
もっとNiagaraを楽しもう!~UE4.25での作例と解説~ (UE4 VFX Art Dive)
もっとNiagaraを楽しもう!~UE4.25での作例と解説~ (UE4 VFX Art Dive)
エピック・ゲームズ・ジャパン Epic Games Japan
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
エピック・ゲームズ・ジャパン Epic Games Japan
開発から見たWindowsの国際化機能
開発から見たWindowsの国際化機能
Tadahiro Ishisaka
UE4背景アーティスト勉強会(前編) 背景ワークフロー解説
UE4背景アーティスト勉強会(前編) 背景ワークフロー解説
Aiko Shinohara
50分でわかるブループリントについて
50分でわかるブループリントについて
Masahiko Nakamura
なぜなにFProperty - 対応方法と改善点 -
なぜなにFProperty - 対応方法と改善点 -
エピック・ゲームズ・ジャパン Epic Games Japan
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
モノビット エンジン
低スペックPCでも動く!UE4の設定&歩き方
低スペックPCでも動く!UE4の設定&歩き方
ka-s
What's hot
(20)
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Effekseer勉強会 機能解説など
Effekseer勉強会 機能解説など
C言語ポインタ講座 (Lecture of Pointer in C)
C言語ポインタ講座 (Lecture of Pointer in C)
The history of TeX and its recent advances
The history of TeX and its recent advances
ELFの動的リンク
ELFの動的リンク
UE4 ビヘイビアツリー入門
UE4 ビヘイビアツリー入門
60fpsアクションを実現する秘訣を伝授 基礎編
60fpsアクションを実現する秘訣を伝授 基礎編
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
AWS CDKに魅入られた PHPer がオススメする
AWS CDKに魅入られた PHPer がオススメする
UE4 Saitama 初心者向けハンズオン #6『サウンド再生』
UE4 Saitama 初心者向けハンズオン #6『サウンド再生』
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
もっとNiagaraを楽しもう!~UE4.25での作例と解説~ (UE4 VFX Art Dive)
もっとNiagaraを楽しもう!~UE4.25での作例と解説~ (UE4 VFX Art Dive)
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
開発から見たWindowsの国際化機能
開発から見たWindowsの国際化機能
UE4背景アーティスト勉強会(前編) 背景ワークフロー解説
UE4背景アーティスト勉強会(前編) 背景ワークフロー解説
50分でわかるブループリントについて
50分でわかるブループリントについて
なぜなにFProperty - 対応方法と改善点 -
なぜなにFProperty - 対応方法と改善点 -
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
低スペックPCでも動く!UE4の設定&歩き方
低スペックPCでも動く!UE4の設定&歩き方
Viewers also liked
【学習メモ#5th】12ステップで作る組込みOS自作入門
【学習メモ#5th】12ステップで作る組込みOS自作入門
sandai
【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門
sandai
【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門
sandai
RoadAR v.2.3 english
RoadAR v.2.3 english
Евгений Никольский
【学習メモ#11th】12ステップで作る組込みOS自作入門
【学習メモ#11th】12ステップで作る組込みOS自作入門
sandai
【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門
sandai
QEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミング
Yuma Ohgami
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
Kishi Shundo
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
kozossakai
やってよかったOS作り
やってよかったOS作り
Hidemi Kawai
低レイヤー入門
低レイヤー入門
demuyan
人工知能概論 1
人工知能概論 1
Tadahiro Taniguchi
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
Hirotaka Kawata
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介
Yuma Ohgami
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Nisei Kimura
C++でできる!OS自作入門
C++でできる!OS自作入門
uchan_nos
Ctfのためのpython入門
Ctfのためのpython入門
shiracamus
ハッキング実演
ハッキング実演
Ken Ogura
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
kikuchan98
Viewers also liked
(20)
【学習メモ#5th】12ステップで作る組込みOS自作入門
【学習メモ#5th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門
RoadAR v.2.3 english
RoadAR v.2.3 english
【学習メモ#11th】12ステップで作る組込みOS自作入門
【学習メモ#11th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門
QEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミング
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
やってよかったOS作り
やってよかったOS作り
低レイヤー入門
低レイヤー入門
人工知能概論 1
人工知能概論 1
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
C++でできる!OS自作入門
C++でできる!OS自作入門
Ctfのためのpython入門
Ctfのためのpython入門
ハッキング実演
ハッキング実演
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
Similar to 【学習メモ#3rd】12ステップで作る組込みOS自作入門
V6 unix in okinawa
V6 unix in okinawa
magoroku Yamamoto
d-kami x86-1
d-kami x86-1
Daisuke Kamikawa
Gingerbread
Gingerbread
android sola
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
Yoshinori Matsunobu
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説
Shoken Fujisaki
Tokyo.R#16 wdkz
Tokyo.R#16 wdkz
Kazuya Wada
FPGAでゲーム機を作ろう! 第6回
FPGAでゲーム機を作ろう! 第6回
yoshimitsusudoh
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
Tsukasa Oi
仮想記憶の構築法
仮想記憶の構築法
magoroku Yamamoto
Map server入門 - FOSS4G 2012 Hokkaido
Map server入門 - FOSS4G 2012 Hokkaido
Hideo Harada
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
エピック・ゲームズ・ジャパン Epic Games Japan
LLVM overview 20110122
LLVM overview 20110122
nothingcosmos
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
Akira Shimosako
2014 dart flight school in Tokyo
2014 dart flight school in Tokyo
nothingcosmos
130522 rt講習会(説明用)
130522 rt講習会(説明用)
openrtm
Buffer overflow
Buffer overflow
ionis111
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
Daiyu Hatakeyama
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
Makiko Konoshima
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみた
uchan_nos
Similar to 【学習メモ#3rd】12ステップで作る組込みOS自作入門
(20)
V6 unix in okinawa
V6 unix in okinawa
d-kami x86-1
d-kami x86-1
Gingerbread
Gingerbread
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説
Tokyo.R#16 wdkz
Tokyo.R#16 wdkz
FPGAでゲーム機を作ろう! 第6回
FPGAでゲーム機を作ろう! 第6回
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
仮想記憶の構築法
仮想記憶の構築法
Map server入門 - FOSS4G 2012 Hokkaido
Map server入門 - FOSS4G 2012 Hokkaido
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
LLVM overview 20110122
LLVM overview 20110122
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
CLUB DB2 第137回:基礎から再入門!DB2モニタリング入門
2014 dart flight school in Tokyo
2014 dart flight school in Tokyo
130522 rt講習会(説明用)
130522 rt講習会(説明用)
Buffer overflow
Buffer overflow
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみた
Recently uploaded
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
taisei2219
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
danielhu54
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
Toru Tamaki
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
sugiuralab
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Ryo Sasaki
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
Toru Tamaki
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
Toru Tamaki
Recently uploaded
(9)
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
【学習メモ#3rd】12ステップで作る組込みOS自作入門
1.
12ステップで作る組込みOS自作入門
3rdステップ @sandai
2.
【参考書籍】 12ステップで作る組込みOS自作入門 【内容】 1ステップずつ、実際に動かしながらプログラムを発展さ せていく方式で無理なく学べる。OSやハードウェアに詳 しくない方にも理解できるよう に十分な説明を提供 坂井 弘亮(著) カットシステム(2010/5) 【税込価格】 4,410円 【サポートページ】 http://kozos.jp/books/makeos/
3.
もくじ 1.メモリ構成 2.リンカ・スクリプト 3.「VA≠PA」の対応とプログラム実行 4.まとめ
4.
1.メモリ構成
5.
組込みOSにおけるメモリの扱い ●
組込みOSでは仮想メモリのような複雑な機構は 実装しないだからマイコン・ボードの持つメモ リの扱いはシビア – どのように割り当てて利用するか、調整することが 必要 ● 具体的には以下の3つのことをする必要がある – CPUのメモリ構成を知る – リンカ・スクリプトによるメモリ配分方法 – コンパイラのメモリの配置方法
6.
静的変数の読み書き ●
今のままだと変数の書き換えができない – 下記のコードは期待通りなら「a」「14」になるは ずだが、「a」「a」になってる #include "lib.h" volatile int value = 10; int main(void) { serial_init(SERIAL_DEFAULT_DEVICE); puts("Hello World!n"); putxval(value, 0); puts("n"); /* a */ value = 20; putxval(value, 0); puts("n"); /* a(valueの値がかわっていない) */
7.
書き換えができない原因 ●
ROMにある変数の初期値がRAMにコピーされてい ないから ● ROM上にあると値を書き換えることができない – よく考えると当たり前のこと – ROMをプログラム側で書き換えることができればシ ステムはわやくそにいじれてしまう ● 「ROM = ブートローダ」と考えるとしっくりく るんじゃないか。プログラム側からブードロー ダを書き換えられるって大問題
8.
メモリの基礎 ●
メモリにはROMとRAMがある ● ROMは読み込み専用で書き込み不可だが、電源 OFFでも内容は保持される – ROMには数種類あるが、H8/3069Fで扱うROMはフラッ シュROMという特別な操作により内容の書き換えが 可能なROM ● RAMは読み書き可能だが、電源OFFで内容は失わ れる
9.
H8/3069F内蔵のROM・RAM ●
組込み向けのCPUではある程度の容量を持つROM とRAMをあらかじめ内蔵しているケースが多い ● H8/3069Fは512KBのフラッシュROMと16KBのRAM を内蔵している ● マッピングされているアドレスは次のスクリー ンショットの通り
10.
H8/3069Fのメモリ・マップ 92頁 図3.1 H8/3069Fの内蔵
ROM・RAMの配置 より
11.
メモリと領域 ●
CPUはメモリにあるプログラムしか実行できな いので、プログラムをメモリにコピーしなけれ ばならない ● コピーされたプログラムはそのままの機械語 コードではなくいくつかの領域から構成されて いる ● また、実行形式ファイルの内部もいくつかの領 域に分かれており、その領域単位でメモリへの コピーが行われている ● メモリ上にコピーされたプログラムは、次の3 つの領域を持つ
12.
メモリ上の3つの領域 ●
テキスト領域 – CPUが実行する機械語コードが置かれる ● データ領域 – 初期値を持つ静的変数などが置かれる ● BSS領域 – 初期値を持たない静的変数などが置かれる
13.
静的変数と自動変数 ●
静的変数 – メモリ上に割り当てられた変数 – 関数外やstaticで定義した変数がこれ。グローバル 変数のことかな ● 自動変数 – スタックに割り当てられた変数 – 関数内で定義した変数はこれ。ローカル変数ってこ とかな
14.
静的領域 ●
静的変数はメモリ上のどこかに固定で割り当て られる ● この固定の割当先を静的領域と呼ぶ ● 静的領域は次の2つの領域から構成される – データ領域...初期値を持つ変数はここ – BSS領域...初期値を持たない変数はここ ● 初期値のある変数はプログラムの実行開始時に 初期値を設定する必要がある – なので、データ領域は変数の初期値を書き込んだ状 態で実行形式ファイル上に作成される
15.
領域のヘッダ ●
実行形式ファイルの内部も領域分けされている – 単純に機械語の命令がベタに書かれているわけでは ない ● 分割された領域はその領域情報やファイル情報 をヘッダとして持っている ● 実行形式ファイルにも何種類かフォーマットが あるが、多くのフォーマットは最低でも3つの 領域は持っている ● gccが生成する実行形式ファイルのフォーマッ トはELF形式
16.
実行形式ファイルのフォーマット ●
実行形式ファイルにも何種類かフォーマットが あるが、多くのフォーマットは最低でも3つの 領域は持っている ● gccが生成する実行形式ファイルのフォーマッ トはELF形式 ● ELF形式のファイルは、readelfコマンドで解析 することができる。 – h8300-elf-readelf -a kzload.elf
17.
readelfが出力したデータ /Users/sandai/12step/src/02/bootload% h8300-elf-readelf -a
kzload.elf ELF Header: Magic: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 . . Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .vectors PROGBITS 00000000 000074 000100 00 WA 0 0 4 [ 2] .text PROGBITS 00000100 000174 0002b8 00 AX 0 0 2 [ 3] .text.startup PROGBITS 000003b8 00042c 000042 00 AX 0 0 2 [ 4] .rodata PROGBITS 000003fc 000470 00002b 00 A 0 0 4 . . Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000074 0x00000000 0x00000000 0x003fa 0x003fa RWE 0x1 LOAD 0x000470 0x000003fc 0x000003fc 0x0002b 0x0002b R 0x1 . . Symbol table '.symtab' contains 58 entries: Num: Value Size Type Bind Vis Ndx Name . . 40: 000003fc 12 OBJECT LOCAL DEFAULT 4 _regs . . 43: 00000000 256 OBJECT GLOBAL DEFAULT 1 _vectors 44: 00000278 46 NOTYPE GLOBAL DEFAULT 2 _putc 45: 000002a6 36 NOTYPE GLOBAL DEFAULT 2 _puts . . 57: 000003b8 66 NOTYPE GLOBAL DEFAULT 3 _main
18.
セクション ●
ELF形式は、ファイルの内部をセクションとい う単位で区切って管理している – .textセクション...テキスト領域 – .dataセクション...データ領域 – .bssセクション...bss領域 – その他いくつかセクションが存在する ● さっきの出力内容は書籍と違いがいくつかある – .dataがない – _mainが.text.startupセクションに置かれている (書籍では.textに置かれている) ● 原因はgccのバージョンが違うから?
19.
プログラムはROM上で動いている ●
現状のコードはh8writeによってH8内部のフ ラッシュROMに書き込まれている ● CPUはROMから命令を読み込み、逐次実行してい るだけ。これを「プログラムはROM上で動いて いる」と呼ぶ ● プログラムがRAMにコピーされずに動いてい るってことかな – ノイマン型であればメモリにロードするイメージし かないんだけど、メモリにロードする前に逐次処理 してるってことでいいのか。ROMの方が遅いだろう ね
20.
変数の実体と配置1 ●
コンピュータは変数の値を実体としてメモリに 記憶する – 自動変数はレジスタに配置されることもあるが、こ こでは深く言及しない ● 変数を読み書きするとはその記憶したメモリを 読み書きするということ ● 変数とは特定のメモリ領域に付けられた名前で しかない
21.
変数の実体と配置2 ●
変数の割り当て方法は大きく分けて2通り – 自動変数はスタックに割り当てる – 静的変数は静的領域(データ、bss領域)に割り当て る ● 自動変数はスタックに割り当てられ、関数を抜 けたら捨てられる ● ただし、lib.cやserial.cで利用している自動 変数はstartup.sでスタック・ポインタをRAM上 に設定しているため、読み書きできている状態 にある
22.
静的変数の書き換え ●
ROM上に配置された変数を読み書きするコード は、ROM上の領域を読み書きする機械語コード に置き換えられる ● しかし、ROMへの書き込みはできないので変数 の値を書き換えるコードでも実際は書き換えら れない ● 今後進めていく上で静的変数の値を書き換えら れないというのは面倒 ● そこで静的変数のデータをROM上ではなくRAM上 に配置する必要がある
23.
2.リンカ・スクリプト
24.
リンカ・スクリプト(ld.scr) ●
リンカ・スクリプトは実行形式ファイルを作成 する際に、機械語コードや静的領域をどのよう にアドレス割り当てするのか、リンカに対して 指示するためのファイル – 物理的メモリにセクションをどのようにマッピング するかを定義するってことかな – リンクの段階でプログラムをメモリにどう配置する のか決定しているわけね ● 静的領域をROMからRAMへ配置を変えるなら、こ のリンク・スクリプトによって行う
25.
id.scrのコード解説1 ●
ld.scrに書かれている.textや.dataがセクショ ンの定義になる ● 先頭に. = 0x0;とあるが、「.」はロケーショ ン・カウンタ – 現在のカレント・アドレスを表す ● . = 0x0はロケーション・カウンタをゼロに初 期化していることになるので、以降のセクショ ンはゼロ番地から配置される
26.
id.scrのコード解説2 .vectors : {
vector.o(.data) } ● .vectorsというセクションを作成し、vector.o の.dataセクションを配置 ● . = 0x0の直後なので、フラッシュROMの先頭に 配置していることになるね – 割り込みベクタはこのゼロ番地から始まる – そして割り込みベクタの先頭はリセット・ベクタな ので、ここにstartup.sの_start関数が割り当てら れているってわけ
27.
id.scrのコード解説3 .text : {
*(.text) } ● .textセクションの配置 ● 各オブジェクト・ファイルの.textセクション がここに配置される ● *は正規表現で使う*と似たようなもんかなとも 思ったけど、なんか違うような... – とりあえずこの場合全てのオブジェクト・ファイル の.textセクションをここに配置するって意味にな ると思う
28.
id.scrのコード解説4 .rodata : {
*(.strings) *(.rodata) *(.rodata.*) } ● const定義した変数や文字列リテラルなどが配 置される ● .stringsは文字列リテラルか? – コンパイラは文字列リテラルが出てきたときに、メモリに 割り当てて、C言語中で文字列が書かれた箇所はその文字列 のメモリ上のアドレス値に書き換えられる ● .rodataは「Read only data」の意味 – プログラムの実行中に書き換えられることの無いやつはこ こ。割込みベクタや.textセクション(機械語コード)とか
29.
ロケーション・カウンタ ●
.vectorsの後に.textを配置しているが、この 場合.textは.vectorsの末尾から配置される ● このように、セクションはロケーション・カウ ンタの指す位置に配置され、ロケーション・カ ウンタはセクションを配置するたびにそのサイ ズ分だけ増加していく ● 便利だねー
30.
静的変数の配置先 ●
.rodataの直後に静的領域が割り当てられてい る。つまりROM上に存在することになるので、 値を書き換えられないわけだ .rodata : { . . } .data : { *(.data) } .bss : { *(.bss) *(COMMON) }
31.
id.scrで配置先をRAMにしてみる ●
静的変数を以下のように配置するとどうなるか .rodata : { *(.strings) *(.rodata) *(.rodata.*) } . = 0xffbf20; .data : { *(.data) } .bss : { *(.bss) *(COMMON) }
32.
RAMに配置する ●
前のコードはつまりロケーション・カウンタを RAMに設定して、静的領域だけRAMに配置される ようにしている – 0xffbf20はRAMのアドレス ● ROM上でないから書き換えができるかとおもい きや、これは正しく動作しない
33.
RAMに配置しても動作しない理由 ●
h8writeで実行形式ファイルを書き込むわけだ けど、h8writeはフラッシュROMに対して行われ る ● だからRAMに設定したところで意味はない – ROMじゃないよってh8writeでエラーも表示される ● 仮にRAMに書き込めたとしても、電源を落とし たら初期値が消えてしまう – 次に電源ONしたときにそのデータが無いってこと。 コードに書かれていても実体となるデータがなけ りゃどうしようもないさ
34.
書き換えができない問題点 ●
問題点は次の2つ – ①変数の本体をROMに置くと ● 書き込みができない – ②変数の本体をRAMに置くと ● 電源OFFで値が消えてしまう ● じゃあどうすればいいのか? – まずROMに書き込んでそれからRAMにコピーして、プ ログラムからはRAM上のデータにアクセスするよう にしたらいいじゃないか
35.
静的変数を書き換え可能にする ●
①変数の初期値をROMに保存するようにしてフ ラッシュROMに書き込む ● ②電源ONでプログラムを起動したときに、プロ グラムの先頭付近でフラッシュROMの変数の初 期値をRAMにコピー ● そうしてプログラムから変数にアクセスすると きは、RAM上のコピー先のアドレスに対してア クセスされるようにする
36.
物理アドレスと論理アドレス ●
ROMからRAMへコピーしてRAMでデータを操作す るということは、初期値が配置されるアドレス とプログラムが変数にアクセスするときのアド レスが違うということになる – ROMのアドレスに実際の初期値があるけど、プログ ラムから操作するときはRAMのアドレスにあるデー タだからね ● ここではROMのアドレスを物理アドレス、RAMの アドレスを論理アドレスと呼ぶ – 仮想メモリの用語とかぶるけど、readelfに合わせ るために物理アドレスや論理アドレスを使っている
37.
物理アドレス ●
物理アドレス(Physical Address)はロード・ア ドレス(Load Address)とも呼ばれる – PAだったりLAと略されたり、LMA(Load Memory Address)と呼ばれることもある ● ここでは単純にROM上のアドレスを物理アドレ スと考えれば良い
38.
論理アドレス ●
論理アドレス(Logical Address)はリンク・ア ドレス(Link Address)とも呼ばれる – LAと略されたり、仮想アドレス(Virtual Address) と呼ばれVAと略されることがある ● 単純にRAM上のアドレスが論理アドレスと考え れば良い
39.
現状のPAやVAの保存先 ●
実行形式ファイルにPAやVAが保存されている ● readelf出力結果のうち、VirtAddrが VA、PhysAddrがPA ● 今のところどちらも0x3fc – つまりどっちもROM上のアドレスを指している ● これからPhysAddrをRAM上に割り当てる必要が ある – これを一般にVA≠PAにする」と言う Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000074 0x00000000 0x00000000 0x003fa 0x003fa RWE 0x1 LOAD 0x000470 0x000003fc 0x000003fc 0x0002b 0x0002b R 0x1
40.
セグメント ●
ELF形式はセクションの他にセグメントという 管理単位を持っている ● Program Headersはセグメントの一種 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000074 0x00000000 0x00000000 0x003fa 0x003fa RWE 0x1 LOAD 0x000470 0x000003fc 0x000003fc 0x0002b 0x0002b R 0x1 . .
41.
ロードとローダ ●
プログラムの実行時にセグメント情報が参照さ れメモリに展開される。これをロードと呼ぶ ● ロードを行うプログラムをローダと呼ぶ ● ローダが実行形式ファイルのセグメントを参照 して、そのとおりにメモリ上に展開するってわ け
42.
セクションとセグメントの違い ●
セクションはリンク時に同じ内容の領域をリン カがまとめるためのもの ● セグメントはプログラムの実行時にローダが参 照してメモリ上に展開するためのもの – ローダが参照するのはセグメントであって、セク ションではない ● 用語の出現場所が似てるから混乱しやすいな
43.
3.「VA≠PA」の対応とプログラム実
行
44.
プログラムの修正 ●
修正したファイル – ld.scr ● 「VA≠PA」対策 – main.c ● 静的変数の書き換えサンプル追加 – startup.s ● スタックの設定の修正 ● これらのうち、重要な「VA≠PA」対策について 述べておく
45.
VA≠PA対策 ●
静的領域をRAM上でプログラムから操作できる ようにするにあたって行ったことは次の通り – .dataセクションの実際のデータをROMに配置 – これをプログラム側からはRAMに配置されているよ うにみせる – みせても実際にデータは配置されていないの で、ROMの.dataセクションをRAMにコピーして操作 できるようにする
46.
リンカ・スクリプトで行うこと ●
ROMに配置するのと、RAMに配置されたようにみ せかけるのはリンカ・スクリプトで行う ● 具体的には、まずMEMORYコマンドでセクション の各領域を定義 ● それから、.dataセクションにそれらの領域を 割り当てる ● 「> data」がRAMに配置することを意味して、 「AT> rom」がROM上の物理アドレスに配置する ことを意味する
47.
リンカ・スクリプトのコード ●
いろいろ省略しているが次の通り MEMORY { . . rom(rx) : o = 0x000100, l = 0x7fff00 . . data(rwx) : o = 0xfffc20, l = 0x000300 . . } .data : { _data_start = .; *(.data) _edata = .; } > data AT> rom
48.
「> data」と「AT> rom」 ●
.dataセクションの実際のデータをROMに配置 – 「AT> rom」の部分がこれにあたる ● プログラム側からはRAMに配置されているよう にみせる – 「> data」の部分がこれにあたる ● こうして.dataセクションのデータはROMに配置 されることになるが、プログラム側から は.dataセクションはRAM上にあるようにみえる ● つまり、今の状態ではデータがRAMにあるよう にみえるだけで、実際のデータはROMにある – 次は変数のデータをROMからRAMにコピーして、実際 に操作できるようにする
49.
ROMの静的領域をRAMにコピー ●
コピーはリンカ・スクリプトではなく、main.c でのプログラムの先頭で行う ● .bssセクションについてはコピーではなくゼロ クリアをして、初期値を持たない変数に対して 初期値を設定している ● こういった処理をまとめて初期化と呼んだりす る memcpy(&data_start, &erodata, (long)*edata – (long)&data_start) memset(&bss_start, 0, (long)&ebss - (long)&bss_start)
50.
ROMの静的領域をRAMにコピー ●
詳しい説明は書籍を参照してほしいが、前の コードの意味は以下の通り – ROM上にある.dataセクションにある変数の初期値を RAMにコピーしている – RAM上の.bssセクションをゼロクリアして、.bssセ クションに配置された変数のメモリ上の値をゼロに 初期化している ● .bssセクションはコピーしているわけではない ● ここまでしてようやくC言語を普通に扱えるよ うになった ● 当然ながら、先ほどの初期化コードの前に静的 変数を定義すると正常に動作しない
51.
ビルドで失敗 ●
main.cで静的領域の書き換えができるかどうか のプログラムを実行するだけだが、その前に ● ビルドこけた... – gcc4.7使ってるけど、たぶんここが問題だな /Users/sandai/12step/tools/lib/gcc/h8300- elf/4.7.1/../../../../h8300-elf/bin/ld: section .text.startup [0000000000000000 -> 0000000000000081] overlaps section .vectors [0000000000000000 -> 00000000000000ff] collect2: error: ld returned 1 exit status make: *** [kzload] Error 1
52.
ld.scrの修正 ●
.text.startupが何なのかよくわからんが、ど うやら_main関数らしい ● _main関数はたぶん.textセクションなのでそこ にぶっこんだ .text : { _text_start = . ; *(.text.startup) ←こいつね *(.text) _etext = . ; } > rom
53.
再度プログラム実行 ●
うまくいったー!あせったー /Users/sandai/12step/src/03/bootload% sudo cu -l /dev/tty.usbserial-FTG6PQ4H Password: Connected. Hello World! *global_data = 10 *global_bss = 0 *static_data = 20 *static_bss = 0 overwrite variables. *global_data = 20 *global_bss = 30 *static_data = 40 *static_bss = 50 ~. Disconnected.
54.
書籍との違い ●
_regs変数がどうも定数の扱いになってる – .rodataセクションに配置されているみたい – ROMに入っていて問題はないかな? – まあたぶんプログラム側から操作するような変数 じゃなかったからいいけど ● 大きな違いはここと、あとは.text.startupだ なあ
55.
4.まとめ
56.
まとめ ●
とりあえずこれでH8でC言語を普通に扱えるよ うになった – 具体的には静的領域をROMからRAMにコピーすること によって静的変数の書き換えが可能となった ● 組込みプログラミングというのは自前で用意し なきゃいけないことが多い
Download now